Náhodně jsem na svůj server upustil databázi MySQL. Existují nějaké způsoby, jak obnovit vyřazenou databázi?
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:
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.
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í