Mam kopię zapasową mysqldump mojej bazy danych mysql składającej się ze wszystkich naszych tabel, która ma około 440 MB. Chcę przywrócić zawartość tylko jednej tabeli z mysqldump. czy to możliwe? Teoretycznie mógłbym po prostu wyciąć sekcję, która odbudowuje tabelę, której chcę, ale nawet nie wiem, jak skutecznie edytować dokument tekstowy o takim rozmiarze.
194
Odpowiedzi:
Możesz spróbować użyć sed, aby wyodrębnić tylko żądaną tabelę.
Powiedzmy, że nazwa Twojej tabeli to,
mytable
a plik mysql.dump to plik zawierający twój wielki zrzut:Spowoduje to skopiowanie do pliku
mytable.dump
tego, co znajduje się pomiędzy,CREATE TABLE mytable
i następnegoCREATE TABLE
odpowiadającego następnej tabeli.Następnie możesz dostosować plik
mytable.dump
zawierający strukturę tabelimytable
i dane (listaINSERT
).źródło
Table structure for table
komentarz, zamiast dopasowania przez CREATE TABLE. Zapewni to, że następna tabela nie zostanie upuszczona, jeśli zapomni się usunąć jej instrukcję DROP TABLE, i umożliwi przesyłanie potokowe w celu przywracania tabeli jednego polecenia (gzip | sed | mysql). Jednak to rozwiązanie zależy od składni komentarzy mysqldump (nie wiem, jak to jest standard).Użyłem zmodyfikowanej wersji polecenia sed uloBasEI. Zawiera poprzednie polecenie DROP i odczytuje, aż mysql zrzuci dane do twojej tabeli (ODBLOKUJ). Pracowałem dla mnie (re) importowanie wp_users na kilka stron Wordpress.
źródło
`mytable`
aby uniknąć dopasowania tabelmytable2
i tak dalej, jak w moim przypadku.sed
nie powinien zakłócać kodowania ...DROP TABLE
(mój zrzut MySQL tego nie miał) może chcieć użyć:sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql
Wykorzystuje to komentarze do tabeli podane przed każdą tabelą w zrzutu MySQl i zapewnia, że wiersze takie jak/*!40101 SET @saved_cs_client = @@character_set_client */;
dołączą się.Można to zrobić łatwiej? Oto jak to zrobiłem:
Utwórz tymczasową bazę danych (np. Przywróć):
Przywróć pełny zrzut w tymczasowej bazie danych:
Zrzuć tabelę, którą chcesz odzyskać:
Zaimportuj tabelę do innej bazy danych:
źródło
Prostym rozwiązaniem byłoby po prostu utworzenie zrzutu tylko tabeli, którą chcesz przywrócić osobno. Aby to zrobić, możesz użyć komendy mysqldump, stosując następującą składnię:
Następnie zaimportuj go w normalny sposób, a on zaimportuje tylko zrzuconą tabelę.
źródło
Tak czy inaczej, każdy proces, który to zrobi, będzie musiał przejść przez cały tekst zrzutu i w jakiś sposób go przeanalizować. Po prostu chciałbym
i potokuj wyjście do mysql. Spójrz na pierwszy stół na wysypisku, aby upewnić się, że otrzymujesz INSERT we właściwy sposób.
Edycja: OK, tym razem poprawne formatowanie.
źródło
Powinieneś wypróbować komendę @bryn, ale używając separatora `w przeciwnym razie wypakujesz również tabele posiadające prefiks lub sufiks, zwykle tak robię:
Również do celów testowych możesz zmienić nazwę tabeli przed importem:
Aby zaimportować, możesz użyć polecenia mysql:
źródło
Utworzyć kopię zapasową
Przywróć pojedynczy stół
źródło
Jednym z możliwych sposobów rozwiązania tego problemu jest przywrócenie do tymczasowej bazy danych i zrzucenie tylko tej tabeli z tymczasowej bazy danych. Następnie użyj nowego skryptu.
źródło
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:
źródło
Jest to lepsze rozwiązanie niż niektóre z powyższych, ponieważ nie wszystkie zrzuty SQL zawierają
DROP TABLE
instrukcję. Ten będzie działał będzie wszelkiego rodzaju zrzuty.źródło
To też może pomóc.
źródło
Tabela powinna prezentować się z taką samą strukturą zarówno w zrzutu, jak i bazie danych.
lub
źródło
Większość współczesnych edytorów tekstu powinna być w stanie obsłużyć plik tekstowy o takim rozmiarze, jeśli twój system sobie z tym poradzi.
W każdym razie musiałem to zrobić bardzo szybko i nie miałem czasu na znalezienie żadnych narzędzi. Założyłem nową instancję MySQL, zaimportowałem całą kopię zapasową, a następnie wyplułem tylko tabelę, którą chciałem.
Następnie zaimportowałem tę tabelę do głównej bazy danych.
To było nudne, ale raczej łatwe. Powodzenia.
źródło
Możesz użyć edytora vi. Rodzaj:
aby otworzyć zarówno cały zrzut, jak
mysql.dump
i nowy plikmytable.dump
. Znajdź odpowiednią wstawkę do wiersza, naciskając,/
a następnie wpisz frazę, na przykład: „wstaw do„ mytable ””, a następnie skopiuj ten wiersz za pomocąyy
. Przełącz do następnego pliku przezctrl+w
następniedown arrow key
wklej skopiowany liniępp
. Na koniec zapisz nowy plik, wpisując:wq
i całkiem edytor vi przez:q
.Zauważ, że jeśli wyrzucił dane przy użyciu wielu wkładek można skopiować (yank) wszystkie naraz używając
Nyy
w którymN
jest liczba linii do skopiowania.Zrobiłem to z plikiem o wielkości 920 MB.
źródło
Zdobądź przyzwoity edytor tekstu, taki jak Notepad ++ lub Vim (jeśli jesteś już biegły). Wyszukaj nazwę tabeli i powinieneś być w stanie wyróżnić tylko polecenia CREATE, ALTER i INSERT dla tej tabeli. Poruszanie się za pomocą klawiatury zamiast myszy może być łatwiejsze. I upewniłbym się, że jesteś na komputerze z dużą ilością pamięci RAM, aby nie było problemu z załadowaniem całego pliku na raz. Po zaznaczeniu i skopiowaniu potrzebnych wierszy dobrym pomysłem byłoby wykonanie kopii zapasowej tylko skopiowanej części do własnego pliku kopii zapasowej, a następnie zaimportowanie jej do MySQL.
źródło
Fragmenty SQL są blokowane za pomocą „Struktura tabeli dla tabeli
my_table
” i „Zrzut danych dla tabelimy_table
”.Możesz użyć wiersza poleceń systemu Windows w następujący sposób, aby uzyskać numery wierszy dla różnych sekcji. Dostosuj szukany ciąg według potrzeb.
znajdź / n ”dla tabeli„ ”sql.txt
Zostaną zwrócone:
---------- SQL.TXT
[4384] - Struktura tabeli dla tabeli
my_table
[4500] - Zrzut danych dla tabeli
my_table
[4514] - Struktura tabeli dla tabeli
some_other_table
... itd.
To daje ci numery linii, których potrzebujesz ... teraz, gdybym tylko wiedział, jak ich używać ... badać.
źródło
W 2008 roku też musiałem to zrobić. Napisałem skrypt Perla, który to zrobi, i teraz jest to moja metoda wyboru. Podsumowano także, jak to zrobić w awk lub jak przywrócić gdzie indziej i wyodrębnić. Ostatnio dodałem tę metodę sed również do listy. Skrypt i inne metody można znaleźć tutaj: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-trom-a-mysqldump-file.html
źródło
Wypróbowałem kilka opcji, które były niesamowicie wolne. To podzieliło zrzut 360 GB na swoje tabele w ciągu kilku minut:
Jak podzielić dane wyjściowe z mysqldump na mniejsze pliki?
źródło
Wspomniane wcześniej rozwiązania „sed” są fajne, ale jak wspomniano, nie w 100% bezpieczne
Możesz mieć komendy INSERT z danymi zawierającymi: ... CREATE TABLE ... (cokolwiek) ... mytable ...
lub nawet dokładny ciąg „CREATE TABLE` mytable`; ” jeśli na przykład przechowujesz polecenia DML!
(a jeśli stół jest ogromny, nie chcesz tego sprawdzać ręcznie)
Sprawdziłbym dokładną składnię użytej wersji zrzutu i miałbym bardziej restrykcyjne wyszukiwanie wzorców:
Unikaj „. *” I użyj „^”, aby upewnić się, że zaczniemy od początku linii. I wolałbym wziąć początkowy „DROP”
Podsumowując, działa to dla mnie lepiej:
źródło