sql files 'stuk' na een fsck op ext3

Pagina: 1
Acties:

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoihoi

Ik heb een ext3 fs waar ik een fsck op heb gedaan na een raid recovery.
Hier kan ik redelijk wat sql files op terugvinden, maar ze lijken allemaal raar genoeg stuk te zijn...

code:
1
2
3
boudewijn@sql-intern:~$ mysql -u root -p db< file.sql
Enter password:
ERROR 1136 (21S01) at line 994: Column count doesn't match value count at row 586

Dit soort problemen.

het gaat hier om een gewone phpbb3 database trouwens.


Nu wil ik gaan debuggen waar het aan ligt (het zijn 20k posts die geladen worden op die regel :X), en ik wil eigenlijk de sql file uit laten vouwen, zodat ik dezelfde regelindeling krijg als de daemon.

Als ik namelijk de --force optie gebruik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
boudewijn@sql-intern:~$ mysql --force -u root -p db< file.sql
Enter password:
ERROR 1136 (21S01) at line 994: Column count doesn't match value count at row 586
ERROR 1136 (21S01) at line 543173: Column count doesn't match value count at row 751
ERROR 1136 (21S01) at line 1085352: Column count doesn't match value count at row 802
ERROR 1136 (21S01) at line 1627531: Column count doesn't match value count at row 300
PAGER set to stdout
ERROR 1064 (42000) at line 2186094: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ja dat is het  <!
 cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr ' at line 1
ERROR 1064 (42000) at line 3303220: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Dank voor de hulp en meedenken, veel plezier/success met wat je nu gaat doen.','' at line 1
ERROR 1064 (42000) at line 3303220: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'whyscream&quot' at line 1
ERROR 1064 (42000) at line 3303220: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':3l2adhof]Volgens mij had ik een start tijdstip in eerste instantie gemist. Ik b' at line 1

Dan zien we hier dat de daemon de regels kennelijk expandt per row (ofzo?). Kan ik dat ook in mijn db dump handig doen?


Dat zou me enorm helpen met recoveren.

offtopic:
Over de titel: er zitten wat fouten in de DB en ik gok dat ik zo ook nog even wil kijken of ik die slim kan laten fixen, want dit is nml niet de enige DB die zo vernaggeld is.

[ Voor 3% gewijzigd door Boudewijn op 22-10-2009 17:05 ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Tsja, wat staat er op die regel? Deze fout krijg je als het aantal namen dat je opgeeft bij een INSERT-statement niet overeenkomt met het aantal komma-gescheiden waardes. Het ligt dus aan het sql-bestand, en het lijkt erop alsof quotes niet goed geïnterpreteerd worden of ontbreken, ofzo.

Kloppen de karaktersets? Juiste sql_mode? Zelfde MySQL versies?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Kees
  • Registratie: Juni 1999
  • Laatst online: 14:51

Kees

Serveradmin / BOFH / DoC
Je kan ook gewoon de file editten en zien wat erin staat, het lijkt erop dat die file goed vernaggelt is iig. Dus gewoon een texteditor pakken en zien of je gekke dingen ziet.

Het lijkt er ook op dat de er een aantal dingen gewoon niet goed geescaped worden (vandaar de hoge linenumbers, een enter wordt gewoon als enter weergegeven en niet geescaped, hetzelfde lijkt te gelden voor quotes?)

Verder kun je prima op die lijnen kijken waar je de errors krijgt. 20k posts is nu niet zoveel dat een editor ervan over de zeik gaat.

[ Voor 50% gewijzigd door Kees op 22-10-2009 17:46 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
vi ging er redelijk van over de zeik, maar het rare is dat ik noch in vi , noch in hexedit wat raars zag.


@pedorus, inderdaad. Maar dit is een complete sqldump gemaakt met mysqldump dus het db formaat zit er gewoon in en zou compatible moeten zijn (het is met een werkende mysql gemaakt).

Het probleem is meer de fout in de regel zelf te localiseren:

code:
1
2
boudewijn@sql-intern:~$ head -n994 gfn-nieuwerOfniet.sql | tail -n1  | wc -w
75965

Om hem met de hand te gaan splitsen lijkt me niet handig. Het ziet trouwens ook allemaal prima uit.

Character sets: kan, maar de vorige install was een standaard debian install uit eind mei. Ik geloof niet dat er wat veranderd is sindsdien.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik zou zeggen pipe de boel naar less. Zoek met 385/'),(' [enter] of wat de rijscheiding ook moge zijn. Je zou dan op de juiste rij moeten zitten. Waarschijnlijk staat er op die rij een gek karakter ofzo waardoor de quotes misgaan.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Ik heb het iets anders gedaan:

code:
1
2
head -n994 file.sql | tail -n1 | sed 's/),(/),\
(/g'  > file2.sql

Waarbij in de shell dus ook bewust die newline is gedaan.


Daarbij gaat het om deze post:
code:
1
(3510,374,9,61,0,$IP,1143145383,1,0,1,1,1,0,'','','$TEXT','',0,'gA==','22sfwjh4',1,0,'',61,0,0),


Ik heb het IP en de TEXT even verwijderd ivm privacy. Beide bevatten niets raars.


Als ik nu de table even bekijk zoals deze eruit zou moeten zien (volgens een ordinaire describe query):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mysql> describe phpbb_posts;
+------------------+-----------------------+------+-----+---------+----------------+
| Field            | Type                  | Null | Key | Default | Extra          |
+------------------+-----------------------+------+-----+---------+----------------+
| post_id          | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
| topic_id         | mediumint(8) unsigned | NO   | MUL | 0       |                |
| forum_id         | mediumint(8) unsigned | NO   | MUL | 0       |                |
| poster_id        | mediumint(8) unsigned | NO   | MUL | 0       |                |
| icon_id          | mediumint(8) unsigned | NO   |     | 0       |                |
| poster_ip        | varchar(40)           | NO   | MUL |         |                |
| post_time        | int(11) unsigned      | NO   |     | 0       |                |
| post_approved    | tinyint(1) unsigned   | NO   | MUL | 1       |                |
| post_reported    | tinyint(1) unsigned   | NO   |     | 0       |                |
| enable_bbcode    | tinyint(1) unsigned   | NO   |     | 1       |                |
| enable_smilies   | tinyint(1) unsigned   | NO   |     | 1       |                |
| enable_magic_url | tinyint(1) unsigned   | NO   |     | 1       |                |
| enable_sig       | tinyint(1) unsigned   | NO   |     | 1       |                |
| post_username    | varchar(255)          | NO   |     |         |                |
| post_subject     | varchar(255)          | NO   |     |         |                |
| post_text        | mediumtext            | NO   |     | NULL    |                |
| post_checksum    | varchar(32)           | NO   |     |         |                |
| post_attachment  | tinyint(1) unsigned   | NO   |     | 0       |                |
| bbcode_bitfield  | varchar(255)          | NO   |     |         |                |
| bbcode_uid       | varchar(8)            | NO   |     |         |                |
| post_postcount   | tinyint(1) unsigned   | NO   |     | 1       |                |
| post_edit_time   | int(11) unsigned      | NO   |     | 0       |                |
| post_edit_reason | varchar(255)          | NO   |     |         |                |
| post_edit_user   | mediumint(8) unsigned | NO   |     | 0       |                |
| post_edit_count  | smallint(4) unsigned  | NO   |     | 0       |                |
| post_edit_locked | tinyint(1) unsigned   | NO   |     | 0       |                |
+------------------+-----------------------+------+-----+---------+----------------+



Om het feest compleet te maken: ik heb regel 804 en 805 gecopieerd met de hand en er "insert into phpbb_posts VALUES" voor gezet en de , vervagen door een ; en het werkt gewoon....

Weird. Nu kan het zijn dat mijn copy-pasta actie een raar karakter of localisatie issue oplost maar dat lijkt me vrij sterk.

Ik ga denk ik gewoon even een script schrijven dat al die posts omzet in een losse insert into (ouch, performance warning).


Edit:

code:
1
cat file2.sql | sed 's/^/INSERT INTO phpbb_posts /g' | sed 's/,$/;/g'  > file3.sql
Zo doen we dat dus :).

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
code:
1
2
3
4
5
boudewijn@think-twice:~$ mysql -u root -p test < gfn-query3.sql
Enter password:
ERROR 1136 (21S01) at line 145111: Column count doesn't match value count at row 1
boudewijn@think-twice:~$ wc -l gfn-query3.sql
1326 gfn-query3.sql

Hmmmm... die linecount blijft raar in mysql.

Die gfn-query3.sql is dus een losse insert PER regel.

Dit zou weer een andere post moeten zijn waar hij over struikelt ? Goed, we gaan verder kijken.
Ik gok dat hij blijft inserten tot het fout gaat, dus de stukke post is max(post_id)+1:
code:
1
2
3
4
5
6
mysql> select max(post_id) from phpbb_posts;
+--------------+
| max(post_id) |
+--------------+
|        23842 |
+--------------+


Eventjes die post , en de insert erna opgezocht in mijn file3.sql:

code:
1
2
INSERT INTO phpbb_posts VALUES (23842,1843,7,171,0,'$IP',1234092923,1,0,1,1,1,1,'','twee apache servers','Aloha,\n\nik ben momenteel bezig met het gereed maken van een nieuwe server.\nDe oude server draait nog , en de nieuwe draait ernaast. De oude server draait apache met een vhosts.\nIk ben nu bezig met de nieuwe server en heb de config files gekopieeerd naar de nieuwe server , maar ik kan nu de nieuwe server dus niet aanspreken.\nHoe kan ik dat nou het best/makkelijkst doen. \nEigenlijk dacht ik ik pas de listen poort van de nieuwe server even aan en zo kan ik de oude server op poort 80 bekijken en de nieuwe op poort 81. Maar dat werkt dus niet.\n\nWie weet raad .....ik heb geen idee waarom het niet werkt .... en waar ik het in moet zoeken','863dcf8a4431bbeff97c71b305ddfecb',0,'','15z1sxr4',1,0,'',0,0,0);
INSERT INTO phpbb_posts VALUES (2436,260,7,31,0,'$IP',1133129609,1,0,1,1,1,1,'','','[quote:23218h3v][b:23218h3v][message=2431,noline]Boudewijn schreef op 27 November 2005 @ 03:18[/message]:[/b:23218h3v]\nWerkte het ding met de livecd?\n[/quote:23218h3v]\r\nNee, ik heb hem hem bij mij thuis aan een kabel gehangen omdat ik hem niet aan de praat kreeg voor de installatie.\r\n\r\nIk heb nu rt2500 ge-emerged (met ACCEPT_KEYWORDS=&quot;~amd64&quot; omdat hij masked is, maakt dat nog uit?) en de module in modules.autoload.d gezet. Zoals ik wel verwacht had branden de lampjes nog steeds niet en geeft hij geen verbinding. Ik heb in linux nog nooit een draadloos netwerk opgezet dus ik heb verder geen idee hoe ik verder kom. (Maar dat weten jullie vast wel  <!-- s:P --><img src=\"{SMILIES_PATH}/icon_razz.gif\" alt=\":P\" title=\"Razz\" /><!-- s:P --> )','',0,'wA==','23218h3v',1,0,'',31,0,0);

Wel raar dat de index zo verspringt.... en dat er inderdaad een veld meer in de onderste query zit.

het rare is echter dat beide queries wel uitgevoerd zijn.

code:
1
2
3
4
5
6
7
8
mysql> select post_id from phpbb_posts where post_id = '2436' or post_id='23842';
+---------+
| post_id |
+---------+
|    2436 |
|   23842 |
+---------+
2 rows in set (0.00 sec)

Ik snap er echt geen fuck meer van.

  • JeroenE
  • Registratie: Januari 2001
  • Niet online
Wel raar dat de index zo verspringt.... en dat er inderdaad een veld meer in de onderste query zit.
Als ik zo kijk dan zit er in de tweede regel helemaal geen veld extra. Er zijn wel wat velden in de eerste regel wel gevuld die in de tweede niet gevuld zijn en andersom, maar het aantal velden is gelijk.

Als dit echt de volgorde is waarin ze in je file staan dan kan je het post_id niet gebruiken om te kijken op welke regel het fout gaat. De regels in het bestand staan in ieder geval niet op volgorde van post_id dus het hoogste post_id is niet per se de laatste regel die is gedaan. Dat verklaart ook waarom je beide regels in je database kan vinden...

Ik doe niet vaak genoeg wat met mysql om je een goede oplossing te geven, maar aangezien het blijkbaar 'maar' 1326 regels zijn zou ik de file gewoon in wat kleinere stukken hakken, net zolang tot de regel(s) zijn gevonden waar het mis gaat.

Verwijderd

Kijk eens naar mysqlcheck. Deze heeft al vaak me database(s) gered.

code:
1
2
$ mysqlcheck -A -u root -p
$ man mysqlcheck

[ Voor 64% gewijzigd door Verwijderd op 02-11-2009 14:01 ]


  • Kees
  • Registratie: Juni 1999
  • Laatst online: 14:51

Kees

Serveradmin / BOFH / DoC
Maak een heel stom (php/bash) scriptje die lijn voor lijn inleest en eventuele errors eruit gooit?

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Wat is dan het voordeel boven een --force argument voor mysql ?

mysqlcheck zullen we eens gaan uitvoeren straks.

Verwijderd

Oke mooi, laat me horen als het gelukt is. Ik raad je ook aan om even een kijkje in de man pagina van mysqlcheck te doen ;)
Pagina: 1