2017-04-05 18:40 GMT+02:00 Vlad Georgescu <[email protected]>:

> Salut,
>

Servus!


>
> Incerc sa recuperez niste baze de date care foloseau engine-ul innodb
> din mysql. Dupa un restart programat de sistem, mysqld-ul (5.5.54) n-a
> mai vrut sa porneasca, zicand ca: "InnoDB: Assertion failure in thread
> 140188413921248 in file btr0pcur.c line 430", etc. Nu a fost nici o
> eroare hardware, nici vreo intrerupere brusca, iar "innochecksum -v
> ibdata1" zice ca totul e ok. Am incercat pornire cu
> innodb_force_recovery de la 1 la 6 in my.cnf, dar fara succes. Am
> transferat /var/lib/mysql pe alt system, punand ultima versiune de
> mysql, dar din pacate eroarea e similara. S-a mai confruntat cineva cu
> asa ceva? Ce pisici sa-i mai fac?
>

Mai bine mai tarziu decat niciodata :)

Sper ca ai innodb_file_per_table... daca nu, nu e de bine!

*Pasul 1*. Dintr-un backup ceva faci rost de DDL de la baza/bazele de date

*Pasul 2*. Faci backup la baza de date corupta

*mv /data/db/mysql /data/db/mysql.bak*
*mkdir -vp /data/db/mysql*
*cp -av /data/db/mysql.bak/mysql /data/db/mysql/*
*cp -av /data/db/mysql.bak/{aria_log.00000001,aria_log_control}
/data/db/mysql/*
*rm -vf /data/db/mysql/mysql/innodb_{index,table}_stats.**
*rm -vf /data/db/mysql/mysql/gtid_slave_pos.**
*mkdir -vp /data/db/mysql/tmp*
*chown mysql:mysql /data/ -R*

*Pasul 3*. Pornesti mysql
*/etc/init.d/mysql start*
*mysql_upgrade -uuser -ppassword --force*
*/etc/init.d/mysql restart*

*Pasul 4*. Importi DDL-urile
*mysql database1 < database1.sql*
*mysql database2 < database2.sql*
...

*Pasul 5*. Discard tablespace pentru *toate* tabelele
*alter table database1.table1 discard tablespace;*
*alter table database1.table2 discard tablespace;*
*alter table database1.tableX discard tablespace;*

*alter table database2.table1 discard tablespace;*
*alter table database2.table2 discard tablespace;*
*alter table database2.tableX discard tablespace;*

*Pasul 6*. Copiezi fisierele .idb si importi tablespace pt *toate* tabelele
*alter table database1.table1 import tablespace;*
*alter table database1.table2 import tablespace;*
*alter table database1.tableX import tablespace;*

*alter table database2.table1 import tablespace;*
*alter table database2.table2 import tablespace;*
*alter table database2.tableX import tablespace;*

Bafta!

Note:
- la mine data_dir era in /data/db/mysql
- eu am facut asta pe mariadb, nu pe mysql! totusi trebuie sa mearga fara
probleme.
- procedura de mai sus poti s-o folosesti sa recuperezi spatiul folosit de
UNDO_LOG din InnoDB tablespaces


> Multumesc,
> Vlad
>
> _______________________________________________
> RLUG mailing list
> [email protected]
> http://lists.lug.ro/mailman/listinfo/rlug
>
_______________________________________________
RLUG mailing list
[email protected]
http://lists.lug.ro/mailman/listinfo/rlug

Raspunde prin e-mail lui