Czy mogę przywrócić pojedynczą tabelę z pełnego pliku mysql mysqldump?

Mam kopię zapasową mysqldump mojej bazy danych mysql składającej się ze wszystkich naszych tabel, czyli około 440 megów. Chcę przywrócić zawartość jednej z tabel z mysqldump. Czy to możliwe? Teoretycznie mógłbym po prostu wyciąć sekcję, która przebudowuje tabelę, którą chcę, ale nawet nie wiem, jak skutecznie edytować dokument tekstowy o takim rozmiarze.

Author: Mobius, 2009-06-18

19 answers

Możesz spróbować użyć sed, aby wyodrębnić tylko żądaną tabelę.

Powiedzmy, że nazwa Twojej tabeli to {[1] } i plik mysql.zrzut to plik zawierający Twój ogromny zrzut:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

To skopiuje w pliku mytable.dump to, co znajduje się pomiędzy CREATE TABLE mytable a następnym CREATE TABLE odpowiadającym następnej tabeli.

Można następnie dostosować plik mytable.dump, który zawiera strukturę tabeli mytable oraz dane (listę INSERT).

 229
Author: uloBasEI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 09:55:09

Użyłem zmodyfikowanej wersji komendy sed uloBasEI. Zawiera ona poprzedzające polecenie DROP i odczytuje dane do momentu, gdy mysql zakończy się zrzucaniem danych do tabeli (UNLOCK). Pracował dla mnie (re)importowanie wp_users do kilku witryn Wordpress.

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
 92
Author: bryn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 09:55:33

To można zrobić łatwiej? Tak to zrobiłem:

Tworzenie tymczasowej bazy danych (np. restore):

Mysqladmin-u root - p create restore

Przywróć pełny zrzut w bazie danych temp:

Mysql-u root-p restore

Zrzuć tabelę, którą chcesz odzyskać:

Mysqldump restore mytable > mytable.sql

Import tabeli w innej bazie danych:

Mysql-u root-p baza danych

 40
Author: Martijn Kools,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-25 12:58:25

Prostym rozwiązaniem byłoby po prostu utworzenie zrzutu tylko tabeli, którą chcesz przywrócić osobno. Możesz użyć polecenia mysqldump, aby to zrobić z następującą składnią:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

Następnie zaimportuj go normalnie, a zaimportuje tylko tabelę po cenach dumpingowych.

 12
Author: Brom558,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 09:34:24

W ten czy inny sposób, każdy proces robiący to będzie musiał przejść przez cały tekst zrzutu i przeanalizować go w jakiś sposób. Ja bym po prostu grep dla

INSERT INTO `the_table_i_want`

I przekierowanie wyjścia do mysql. Spójrz na pierwszy stół w śmietniku przed, aby upewnić się, że dostajesz wkład jest właściwy sposób.

Edit: OK, mam formatowanie prawo tym razem.

 8
Author: JCCyC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 16:57:00

Powinieneś spróbować polecenia @ bryn, ale z ' delimiter inaczej będziesz również wyodrębnić tabele z prefiksem lub sufiksem, to jest to, co zwykle robię:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

Również w celu testowania, możesz chcieć zmienić nazwę tabeli przed zaimportowaniem:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

Aby zaimportować można użyć polecenia mysql:

mysql -u root -p'password' mydatabase < mytable_restore.sql
 7
Author: Maxime Biette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 12:40:00
  1. Backup

    $ mysqldump -A | gzip > mysqldump-A.gz
    
  2. Restore single table

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    
 5
Author: y.tk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 11:10:33

Jednym z możliwych sposobów radzenia sobie z tym jest przywrócenie do tymczasowej bazy danych i zrzut tylko tej tabeli z tymczasowej bazy danych. Następnie użyj nowego skryptu.

 4
Author: Tim Hoolihan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 16:57:48

To narzędzie może być tym, czego chcesz: tbdba-restore-mysqldump.pl

Https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl

Np. Przywróć tabelę z pliku zrzutu bazy danych:

Tbdba-restore-mysqldump.pl -t yourtable-s your dB-f backup.sql

 3
Author: user1097790,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 12:41:20

To też może pomóc.

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'
 2
Author: pjl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 14:45:26

Większość nowoczesnych edytorów tekstu powinna być w stanie obsłużyć plik tekstowy o takim rozmiarze, jeśli Twój system jest do tego zdolny.

W każdym razie, musiałem to zrobić raz bardzo szybko i nie miałem czasu znaleźć żadnych narzędzi. Skonfigurowałem nową instancję MySQL, zaimportowałem całą kopię zapasową, a następnie Wyplułem tabelę, którą chciałem.

Następnie zaimportowałem tę tabelę do głównej bazy danych.

To było nudne, ale raczej łatwe. Powodzenia.

 1
Author: Bryan Migliorisi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 16:58:53

Możesz użyć edytora vi. "Type": "content"]}

vi -o mysql.dump mytable.dump

Aby otworzyć zarówno cały zrzut mysql.dump, jak i nowy plik mytable.dump. Znajdź odpowiednią wstawkę do linii, naciskając /, a następnie wpisz frazę, na przykład: "insert into 'mytable'", a następnie skopiuj tę linię za pomocą yy. Przełącz do następnego pliku przez ctrl+w, następnie down arrow key, wklej skopiowaną linię przez pp. Na koniec zapisz nowy plik wpisując :wq i dość VI edytor przez :q.

Zauważ, że jeśli dane zostały usunięte przy użyciu wielu wstawek, możesz skopiować wszystkie na raz używając Nyy, w którym N jest liczbą linii do skopiowania.

Zrobiłem to z pliku o rozmiarze 920 MB.

 1
Author: mtoloo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 07:28:34
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

Jest to lepsze rozwiązanie niż niektóre z powyższych, ponieważ nie wszystkie zrzuty SQL zawierają instrukcję DROP TABLE. Ten będzie działał na wszelkiego rodzaju wysypiska.

 1
Author: Weston Ganger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 16:59:22

Kup porządny edytor tekstu, taki jak Notepad++ lub Vim (jeśli jesteś już biegły z nim). Wyszukaj nazwę tabeli i powinieneś być w stanie wyróżnić tylko polecenia Utwórz, Zmień i wstaw dla tej tabeli. Może być łatwiej nawigować za pomocą klawiatury, a nie myszy. I upewniłbym się, że jesteś na komputerze z dużą ilością pamięci RAM, aby nie miał problemu z załadowaniem całego pliku na raz. Po podświetleniu i skopiowaniu wierszy, których potrzebujesz, dobrym pomysłem byłoby Utwórz kopię zapasową tylko skopiowanej Części do własnego pliku kopii zapasowej, a następnie zaimportuj ją do MySQL.

 0
Author: Cameron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 17:04:42

Pliki SQL są blokowane za pomocą "Table structure for table my_table" i " Dumping data for table my_table."

Możesz użyć wiersza poleceń systemu Windows w następujący sposób, aby uzyskać numery linii dla różnych sekcji. Dostosuj wyszukiwany ciąg w razie potrzeby.

Find / n "for table '" sql.txt

Zostaną zwrócone:

---------- SQL.TXT

[4384] -- struktura tabeli dla tabeli my_table

[4500] -- Dumping data for table my_table

[4514]-- Struktura tabeli dla tabeli some_other_table

... itd.

To daje Ci numery linii, których potrzebujesz... gdybym tylko wiedział, jak ich używać... śledztwo.

 0
Author: Kuyenda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 18:24:02

W 2008 też miałem taką potrzebę. Napisałem skrypt Perla, który to zrobi i teraz jest to moja metoda wyboru. Podsumowano również, jak to zrobić w awk lub jak przywrócić gdzie indziej i wyodrębnić. Ostatnio dodałem również tę metodę sed do listy. Skrypt i inne metody znajdziesz tutaj: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html

 0
Author: JaredC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-09 16:11:50

Wypróbowałem kilka opcji, które były niesamowicie powolne. To podzieliło zrzut 360GB na swoje tabele w kilka minut:

Jak podzielić wyjście z mysqldump na mniejsze pliki?

 0
Author: Kohjah Breese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:23

Wspomniane wcześniej rozwiązania " sed " są ładne, ale jak wspomniano nie w 100% bezpieczne

  • Możesz mieć polecenia INSERT z danymi zawierającymi: ... UTWÓRZ TABELĘ...(cokolwiek)...mytable...

  • Lub nawet dokładny ciąg znaków "CREATE TABLE' mytable`;" jeśli na przykład przechowujesz polecenia DML!

(a jeśli tabela jest ogromna, nie chcesz tego sprawdzać ręcznie)

Chciałbym zweryfikować dokładną składnię używanej wersji zrzutu i mieć więcej restrykcyjne wyszukiwanie wzorców:

Unikać ".* "i użyj"^", aby upewnić się, że zaczynamy od początku linii. A ja wolę chwycić początkowy "DROP"

W sumie dla mnie to działa lepiej:
sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
 0
Author: phil_w,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-17 12:24:04

Tabela powinna mieć taką samą strukturę zarówno w dump, jak i w bazie danych.

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

Lub

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`
 0
Author: Neminath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 10:11:12