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.
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
).
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
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
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.
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.
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
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
-
Backup
$ mysqldump -A | gzip > mysqldump-A.gz
-
Restore single table
$ mysql -e "truncate TABLE_NAME" DB_NAME $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
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.
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
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'
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.
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.
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.
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.
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.
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
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:
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
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`
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