Odzyskiwanie danych z tablic InnoDB (pliki frm)

Jeżeli tworzyłeś backup baz danych na zasadzie skopiowania plików z:

1
/var/lib/mysql/

to najgorsza metoda. Lecz istnieje szansa na odzyskanei tablic innoDB pod warunkiem, że zostały skopiowane tablice:

1
2
3
_ib_logfile0
_ib_logfile1
_ibdata1

Krok 0. Zrób kopię katalogu /var/lib/mysql

Krok 1. Zatrzymaj serwer mysql:

1
service mysql stop

Zedytuj plik konfiguracyjny baz danych znajdujący się w /etc/mysql/my.cnf i wstaw:

1
2
3
[mysqld]
innodb_force_recovery = 6
 

Rozpisaka stanów awaryjnych bazy MySQL:

    1 (SRV_FORCE_IGNORE_CORRUPT) – Let the server run even if it detects a corrupt page. Try to make SELECT * FROM tbl_name jump over corrupt index records and pages, which helps in dumping tables.
    2 (SRV_FORCE_NO_BACKGROUND) – Prevent the main thread from running. If a crash would occur during the purge operation, this recovery value prevents it.
    3 (SRV_FORCE_NO_TRX_UNDO)Do not run transaction rollbacks after recovery.
    4 (SRV_FORCE_NO_IBUF_MERGE) – Prevent also insert buffer merge operations. If they would cause a crash, do not do them. Do not calculate table statistics.
    5 (SRV_FORCE_NO_UNDO_LOG_SCAN)Do not look at undo logs when starting the database: InnoDB treats even incomplete transactions as committed.
    6 (SRV_FORCE_NO_LOG_REDO)Do not do the log roll-forward in connection with recovery.

Krok 2. Skopiuj pliku ibdata1, ib_logfile0 oraz ib_logfile1 nadpisując w /var/lib/mysql/ .Takze do odpowiedniego katalagu (taka jak nazwa bazy danych) umieść wszystkie pliki z backup'u.

Np: jeżeli chcesz odzyskać baze dancyh o nazwie "MojaBaza" utwórz katalog o nazwie "Moja Baza" umieść w nim wszystkie pliki z backup'u.

Nadaj poprawnego właściciela wszystkim plikom:

1
chown mysql:mysql -R *

Krok 3. uruchom usługę MySQL

1
service mysql start

W tym momencie powinny mimo nie zgodności włąścicieli i szyfrowań uruchomić się bazy. odrazu wszelkimi metodami wyeksportuj baze danych do pliku. Polecam polecenie:

1
mysqldump -u root -p MojaBaza > MojaBaza.sql 

Uwaga: jeśli posiadasz błąd: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES

Użyj polecenia:

1
mysqldump -u root -p MojaBaza > MojaBaza.sql --single-transaction

Niestety istnieje już szansa że fizycznie może takżę być już uszkodzona baza przy eksporcie.

Krok 4. Przywróć oryginalny stan folderu /var/lib/mysql ręcznie utwórz bazę danych MojaBaza i importuj baze:

1
mysql -u root -p MojaBaza < MojaBaza.sql