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
|