2008-09-25 12 views
33

Potrzebuję przenieść całe tabele z jednej bazy danych MySQL na inną. Nie mam pełnego dostępu do drugiego, tylko dostęp phpMyAdmin. Mogę przesyłać (skompresowane) pliki sql mniejsze niż 2 MB. Ale skompresowane dane wyjściowe z mysqldump z tabel pierwszej bazy danych są większe niż 10 MB.Jak podzielić dane wyjściowe z mysqldump na mniejsze pliki?

Czy istnieje sposób podziału wyników z mysqldump na mniejsze pliki? Nie mogę użyć polecenia split (1), ponieważ nie mogę przetworzyć plików (1) na serwerze zdalnym.

Czy jest jeszcze inne rozwiązanie, które przegapiłem?

Edit

--extended-insert = FAŁSZ do mysqldump opcja zaproponowana przez pierwszy plakat daje plik .sql, które można następnie podzielić na pliki przywozowe, pod warunkiem, że split (1) nazywa się odpowiednia opcja - lines. Przez próbne i błędne stwierdzenie, że bzip2 kompresuje pliki .sql przez współczynnik 20, więc musiałem dowiedzieć się, ile linii kodu sql odpowiada w przybliżeniu 40MB.

+0

spójrz na to pytanie w przypadku wyszukiwania [podzielenie dużego zrzutu poreresowego na mniejsze pliki] (http://unix.stackexchange.com/questions/351546/split-a-large-postgresql-dump-into- mniejsze-pliki) – rubo77

Odpowiedz

28

Pierwszy zrzut schematu (na pewno pasuje do 2Mb, nie?)

mysqldump -d --all-databases 

i przywrócić go.

Następnie zrzucić tylko dane w jednostkowym sprawozdaniu wkładki, dzięki czemu można podzielić pliki i przywrócić je bez konieczności łączenia ich na zdalnym serwerze

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE 
+0

Szukałem sposobu, aby włączyć instrukcję INSERT dla każdego wstawionego wiersza, zamiast jednej masywnej instrukcji z wieloma krotkami lub każdego wiersza za pomocą VALUES. Znaczek '--extended-insert = FALSE' był tym, czego potrzebowałem. dzięki! – dmkc

+0

Utwórz tabelę: 'mysqldump mydatabase mytable -d> mytable-create.sql' Dane: ' mysqldump mydatabase mytable --extended-insert = FALSE --no-create-info = TRUE> mytable-data.sql' Następnie podzielić go na serię plików niezależnie od długości: 'podzielić mojatabela-data.sql -l10000' teraz można importować pierwszy SQL tworzenia. Następnie każda z tabel o długości 10.000. Domyślnie pliki będą miały nazwy xaa, xab, xac ...). Ważne przez 'mysql mydatabase liamvictor

0

Spróbuj csplit (1), aby pociąć wyjście do poszczególne tabele oparte na wyrażeniach regularnych (pasujących do granicy tabeli, jak sądzę).

1

Można zrzucić poszczególne tabele z mysqldump uruchamiając mysqldump database table1 table2 ... tableN

Jeśli żadna z tabel są zbyt duże, że wystarczy. W przeciwnym razie musisz zacząć dzielić dane w większych tabelach.

10

Mówisz, że nie masz dostępu do drugiego serwera. Ale jeśli masz powłoki dostępu do pierwszego serwera, gdzie stoliki są, można podzielić przez zrzut tabeli:

for T in `mysql -N -B -e 'show tables from dbname'`; \ 
    do echo $T; \ 
    mysqldump [connecting_options] dbname $T \ 
    | gzip -c > dbname_$T.dump.gz ; \ 
    done

To utworzy plik gzip dla każdej tabeli.

Innym sposobem dzielenia wyników mysqldump w osobnych plikach jest użycie opcji --tab.

mysqldump [connecting options] --tab=directory_name dbname

gdzie nazwa_katalogu to nazwa pustego katalogu. To polecenie tworzy plik .sql dla każdej tabeli, zawierający instrukcję CREATE TABLE i plik .txt, zawierający dane, które mają zostać odtworzone za pomocą LOAD DATA INFILE. Nie jestem pewien, czy phpMyAdmin może obsłużyć te pliki z określonym ograniczeniem.

+0

Chociaż może to nie odpowiadać bezpośrednio potrzebom OP, jest to świetny sposób na umieszczenie poszczególnych tabel w ich własnych plikach ... na grep itp. –

2

Nie potrzebujesz dostępu ssh do żadnego z serwerów. Tylko klient mysql [dump] jest w porządku. Za pomocą mysql [dump] można zrzucić bazę danych i zaimportować ją ponownie.

w komputerze, można zrobić coś takiego:

$ mysqldump -u originaluser -poriginalpassword -h originalhost originaldatabase | mysql -u newuser -pnewpassword -h nowyhost newdatabase

i gotowe. :-)

nadzieję, że to pomaga

0

Check out SQLDumpSplitter 2, po prostu stosować je podzielić zrzut 40MB z sukcesem. Można go pobrać pod poniższym linkiem:

sqldumpsplitter.com

nadzieję, że to pomaga.

+0

Adres URL już nie działa – cdmdotnet

+0

a co z tym: http://www.sqldumpsplitter.com/ – Sk8erPeter

+0

SQLDumpSplitter2 może obsługiwać pliki tylko do 2 GB (2 147 483 648 bajtów - jak sądzę, używa 32-bitowej liczby całkowitej ze znakiem). Byłoby świetnie zmodyfikować to lub skompilować oryginalny kod źródłowy na 64-bit, ale obawiam się, że kod źródłowy jest prawdopodobnie stracony. W przeciwnym razie jest to świetne narzędzie. Ale wiele problemów z dzieleniem plików SQL zaczyna się w okolicach 2 GB. –

1

ja polecam bigdump użytkową, można go pobrać tutaj. http://www.ozerov.de/bigdump.php to oszałamia wykonanie zrzutu, tak blisko, jak to tylko możliwe, do wykonania limitu, wykonując całe linie na raz.

26

Ten skrypt bash dzieli zrzut pamięci z jednej bazy do oddzielnych plików dla każdej tabeli i nazw z csplit i nazw je odpowiednio:

#!/bin/bash 

#### 
# Split MySQL dump SQL file into one file per table 
# based on https://gist.github.com/jasny/1608062 
#### 

#adjust this to your case: 
START="/-- Table structure for table/" 
# or 
#START="/DROP TABLE IF EXISTS/" 


if [ $# -lt 1 ] || [[ $1 == "--help" ]] || [[ $1 == "-h" ]] ; then 
     echo "USAGE: extract all tables:" 
     echo " $0 DUMP_FILE" 
     echo "extract one table:" 
     echo " $0 DUMP_FILE [TABLE]" 
     exit 
fi 

if [ $# -ge 2 ] ; then 
     #extract one table $2 
     csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET [email protected]_TIME_ZONE%1" 
else 
     #extract all tables 
     csplit -s -ftable $1 "$START" {*} 
fi 

[ $? -eq 0 ] || exit 

mv table00 head 

FILE=`ls -1 table* | tail -n 1` 
if [ $# -ge 2 ] ; then 
     mv $FILE foot 
else 
     csplit -b '%d' -s -f$FILE $FILE "/40103 SET [email protected]_TIME_ZONE/" {*} 
     mv ${FILE}1 foot 
fi 

for FILE in `ls -1 table*`; do 
     NAME=`head -n1 $FILE | cut -d$'\x60' -f2` 
     cat head $FILE foot > "$NAME.sql" 
done 

rm head foot table* 

podstawie https://gist.github.com/jasny/1608062
i https://stackoverflow.com/a/16840625/1069083

+6

Należy zauważyć, że csplit na komputerze Mac nie działa z tym skryptem, ponieważ nie obsługuje on składni {*}. Musisz uruchomić go w systemie Linux. – rlorenzo

+0

To samo dotyczy FreeBSD. Ale możesz zainstalować port lub pakiet sysutils/coreutils, aby uzyskać narzędzia GNU i zamiast tego użyć gcsplit. – Dereckson

+0

Taka stara odpowiedź, ale wciąż działa, imponująco! –

0

Ten script powinien zrobić to:

#!/bin/sh 

#edit these 
USER="" 
PASSWORD="" 
MYSQLDIR="/path/to/backupdir" 

MYSQLDUMP="/usr/bin/mysqldump" 
MYSQL="/usr/bin/mysql" 

echo - Dumping tables for each DB 
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"` 
for db in $databases; do 
    echo - Creating "$db" DB 
    mkdir $MYSQLDIR/$db 
    chmod -R 777 $MYSQLDIR/$db 
    for tb in `$MYSQL --user=$USER --password=$PASSWORD -N -B -e "use $db ;show tables"` 
     do 
      echo -- Creating table $tb 
      $MYSQLDUMP --opt --delayed-insert --insert-ignore --user=$USER --password=$PASSWORD $db $tb | bzip2 -c > $MYSQLDIR/$db/$tb.sql.bz2 
    done 
    echo 
done 
0

Możesz podzielić istniejący plik według AWK. To bardzo Quik i prosty

Miejmy tabela rozłam wysypisko przez „tabel”:

cat dump.sql | awk 'BEGIN {output = "comments"; } 
$data ~ /^CREATE TABLE/ {close(output); output = substr($3,2,length($3)-2); } 
{ print $data >> output }'; 

Albo można podzielić zrzut przez „bazy danych”

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=$4;} {print $data>>output}'; 
+0

nie działa dla mnie – SpaceDog

2

Jest to doskonała mysqldumpsplitter skrypt, który pochodzi z ton opcji, jeśli chodzi o wyodrębnianie z mysqldump.

chciałbym skopiować przepis tutaj, aby wybrać swój przypadek z:

1) Wyciąg z jednej bazy danych z mysqldump:

sh mysqldumpsplitter.sh --source filename --extract DB --match_str database-name

Powyższe polecenie stworzy SQL dla określonej bazy danych z określonego "plik" plik sql i zapisz go w skompresowanym formacie do database-name.sql.gz.

2) Wyciąg pojedynczą tabelę z mysqldump:

sh mysqldumpsplitter.sh --source filename --extract TABLE --match_str table-name

Powyższe polecenie stworzy SQL dla określonej tabeli z określonej „filename” pliku mysqldump i zapisać go w formacie skompresowanym do bazy name.sql .gz.

3) Wyciąg tabele dopasowania wyrażenia regularnego z mysqldump:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str regular-expression

Powyższe polecenie stworzy zapytania SQL dla tabel dopasowania określony regularny wyrażenie z określonym „filename” pliku mysqldump i przechowywać go w skompresowanym formacie do individual table-name.sql.gz.

4) Wyciąg wszystkich baz danych z mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLDBS

powyższego polecenia będzie wyodrębnić wszystkie bazy danych z określonego pliku „” pliku mysqldump i zapisać go w formacie skompresowanym do indywidualnych bazy name.sql. gz.

5) Wyciąg całą tabelę z mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES

powyższego polecenia będzie wyodrębnić wszystkie tabele z określonym „pliku” plik mysqldump i zapisać go w formacie skompresowanym do indywidualnych tabeli-name.sql. gz.

6) listę tabel z mysqldump Extract:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str '(table1|table2|table3)'

powyższego polecenia będzie wyodrębnić tabele z określonego pliku "plik" mysqldump i zapisać je w formacie skompresowanym do indywidualnych tabeli-name.sql .gz.

7) Wyciąg z bazy danych skompresowanych mysqldump:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip

Powyższe polecenie dekompresji filename.sql.gz użyciu gzip, wyciąg bazę danych o nazwie "dbname" z "filename.sql.gz" & przechowuj go jako out/dbname.sql.gz

8) Wyciąg z bazy danych skompresowanych mysqldump w nieskompresowanego formacie:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip --compression none

Powyższe polecenie dekompresji filename.sql.gz użyciu gzip i wyodrębnić bazy danych o nazwie "dbname" od „nazwy pliku .sql.gz”& przechowywać go jako zwykłego SQL się/dbname.sql

9), Ekstrakt alltables z mysqldump w różnych katalogu:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES --output_dir /path/to/extracts/

powyższego polecenia będzie wyodrębnić wszystkie tabele z określonym „pliku” plik mysqldump i wydobywa tabel w formacie skompresowanym do indywidualnych plików, table-name.sql.gz przechowywane w/ścieżka/do/Ekstrakty /. Skrypt utworzy folder/path/to/extracts/jeśli nie istnieje.

10) Wyciąg jeden lub więcej tabel z jednej bazy danych w pełnym wymiarze wysypisko:

Rozważyć masz pełny zrzut z wielu baz danych i chcesz ekstrakt kilku tabel z jednej bazy danych.

Extract pojedyncza baza danych: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

wyodrębnić wszystkie tabele sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" chociaż możemy skorzystać z innej opcji, aby zrobić to w jednym poleceniem w następujący sposób:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1|tbl2)" --compression none

powyższego polecenia będzie wyodrębnić zarówno TBL1 i TBL2 od Baza danych DBNAME w formacie sql w folderze "out" w bieżącym katalogu.

Można wyodrębnić jednej tabeli w następujący sposób:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1)" --compression none

11) Wyciąg wszystkie tabele z konkretnej bazy danych:

mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.*" --compression none

powyższego polecenia będzie wyodrębnić wszystkie tabele z bazy danych DBNAME w sql format i zapisz go w katalogu "out".

12) Zawartość Lista pliku mysqldump

mysqldumpsplitter.sh --source filename --desc

powyższego polecenia będzie lista baz danych i tabel z pliku zrzutu.

Możesz później wybrać załadowanie plików: zcat filename.sql.gz | mysql -Uużytkownik -p -hHOSTNAME

  • Również raz wyodrębnić pojedynczą tabelę, która naszym zdaniem jest jeszcze większe, można użyć polecenia podziału Linux z numerem linii do dalszego podziału zrzutu. split -l 10000 filename.sql

  • Powiedział, że jeśli to jest twoja potrzeba (częściej przyjście), można rozważyć użycie mydumper które faktycznie tworzy indywidualne wysypisk wont trzeba podzielić!

1

wyjaśnienie na odpowiedź od @ verace:

ja specjalnie niczym interaktywnej metody; możesz podzielić duży plik w Eclipse. Próbowałem plik 105GB Windows pomyślnie:

Wystarczy dodać bibliotekę MySQLDumpSplitter do projektu: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

krótka notatka na temat importowania:

- In Eclipse, Right click on your project --> Import 
- Select "File System" and then "Next" 
- Browse the path of the jar file and press "Ok" 
- Select (thick) the "MySQLDumpSplitter.jar" file and then "Finish" 
- It will be added to your project and shown in the project folder in Package Explorer in Eclipse 
- Double click on the jar file in Eclipse (in Package Explorer) 
- The "MySQL Dump file splitter" window opens which you can specify the address of your dump file and proceed with split.