it-swarm-eu.dev

Existuje způsob, jak obnovit vyřazenou databázi mysql?

Náhodně jsem na svůj server upustil databázi MySQL. Existují nějaké způsoby, jak obnovit vyřazenou databázi?

8
kewl

Pokud budete jednat rychle, máte vysokou šanci dostat svou databázi zpět. Šance je vyšší pro InnoDB, pro MyISAM je nenulová, ale blízko.

Jde o to, když MySQL provede DROP TABLE nebo DROP DATABASE (což je v podstatě stejné) InnoDB data nevymaže. Stránky s daty jsou stále na disku.

V závislosti na nastavení innodb_file_per_table se proces obnovy liší. Pokud je innodb_file_per_table OFF (výchozí až do 5.5), pak vynechaná tabulka zůstává v ibdata1. Pokud je innodb_file_per_table ON (výchozí od 5.5), byla zrušená tabulka v příslušném souboru .ibd. MySQL odebere tento soubor, když upustí tabulku.

První věcí, kterou musíte udělat, je zastavit všechny možné zápisy, aby váš stůl nebyl přepsán. Pokud je innodb_file_per_table VYPNUTO, stačí zastavit MySQL (kill -9 je ještě lepší, ale ujistěte se, že nejprve zabijete safe_mysqld). Pokud je innodb_file_per_table ON, pak umount partition, kde MySQL ukládá svá data. Pokud je datadir v kořenovém oddílu, doporučujeme server vypnout nebo alespoň vyfotografovat disk. Dovolte mi, abych to zopakoval, cílem je zabránit přepsání zrušené tabulky pomocí MySQL nebo operačního systému.

Existuje nástroj, který umožňuje práci se stránkami InnoDB na nízké úrovni, Sada nástrojů pro obnovu dat TwinDB . Použiju jej pro ilustraci zotavení na pozadí.

Musíte vzít médium s vynechanou tabulkou (buď ibdata1 nebo image disku) a najít na něm stránky InnoDB. stream_parser nástroj ze sady nástrojů to provede.

./stream_parser -f /path/to/disk/image

Prohledá soubor, vyhledá stránky InnoDB a roztřídí je podle typu a index_id. index_id je identifikátor, který InnoDB používá k označení indexu. Tabulka je uložena v indexu PRIMARY. Chcete-li zjistit, jaký index_id je vaše zrušená tabulka, musíte obnovit slovník InnoDB .

Slovník InnoDB je uložen v souboru ibdat1. Soubor ibdata1 musíte skenovat stejným způsobem jako výše:

./stream_parser -f /var/lib/mysql/ibdata1

Nyní musíte získat záznamy ze tabulek slovníku InnoDB SYS_TABLES a SYS_INDEXES (řekněme, že vaše tabulka je sakila.actor):

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor
000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  0

158 je table_id, pamatujte si to.

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158
000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295
000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx\_actor\_last\_name"        1       0       0       4294967295

Index_id vaší vynechané tabulky (sakila.actor) je 376.

Nyní můžete načíst záznamy vynechané tabulky z InnoDB index_id 376. Musíte mít strukturu tabulky vynechané tabulky, přesně příkaz CREATE TABLE, se kterým byla tabulka vytvořena. Kde to můžete získat? Buď ze staré zálohy, nebo odkudkoli. Je také možné obnovit strukturu ze slovníku InnoDB, ale v této odpovědi ji nebudu pokrývat. Předpokládejme, že to máte.

./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t actor.sql > dump.tsv 2> load_cmd.sql

c_parser vydává záznamy jako výpis oddělený tabulátorem do stdout. Výpis lze načíst pomocí příkazu LOAD DATA. c_parser to vytiskne na stderr.

Zobrazit další podrobnosti v příspěvcích:

16
akuzminsky

Neexistuje snadný způsob, jak vám to rozbít. Nezáleží na tom, zda jste zrušili db přes phpmyadmin nebo z příkazového řádku. Je to pryč.

Lidská chyba je jedním z důvodů dobrého režimu zálohování.

Nejsem náboženský, ale řeknu modlitbu v naději, že to nebylo nic moc důležitého.

11
atxdba

Závisí na vašem nastavení. Je možné obnovit, pokud systém správně nastavíte. Pokud máte zálohu, můžete ji obnovit. a poté aplikujte binární protokoly až do bodu těsně předtím, než upustíte od tabulky.

http://dev.mysql.com/doc/refman/5.5/en/mysqlbinlog.html

Navrhuji, abyste to udělali na jiném serveru, jakmile máte tabulku obnovenou, můžete ji pomocí mysqldump extrahovat a importovat zpět na svůj produkční server. Nebude to rychlé obnovení, ale můžete data obnovit.

Pokud nevíte, co děláte, navrhl bych uzavření smlouvy o podpoře s jednou z poradenských společností mysql (pythian, percona, palamino jsou pravděpodobně nejlepší) a nechte je, aby vám s tím pomohly.

Přeji ti hodně štěstí

2
Allen Kinnard