2008-09-25 3 views
33

Мне нужно переместить целые таблицы из одной базы данных MySQL в другую. У меня нет полного доступа ко второму, только доступ к phpMyAdmin. Я могу загружать (сжатые) файлы sql меньше 2 МБ. Но сжатый вывод из mysqldump таблиц первой базы данных больше 10 МБ.Как разделить вывод mysqldump на более мелкие файлы?

Есть ли способ разделить вывод mysqldump на более мелкие файлы? Я не могу использовать split (1), так как я не могу (1) вернуть файлы на удаленный сервер.

Или есть другое решение, которое я пропустил?

Редактировать

--extended-вставка = FALSE варианта MySQLDump предложил первый плакат дает .sql файл, который затем можно разделить на импортируемые файлы, при условии, что раскол (1) называются с подходящий вариант линий. В результате проб и ошибок я обнаружил, что bzip2 сжимает файлы .sql в 20 раз, поэтому мне нужно выяснить, сколько строк кода sql соответствует примерно 40 МБ.

+0

Посмотрите на это Q на случай, если вы выполните поиск, как разделить большой постгрессовый дамп на более мелкие файлы (http://unix.stackexchange.com/questions/351546/split-a-large-postgresql-dump-into- small-files) – rubo77 2017-03-18 15:03:59

ответ

28

Первый дамп схемы (это, безусловно, вписывается в 2Мб, нет?)

mysqldump -d --all-databases 

и восстановить его.

Затем дамп только данные в отдельных отчетах вставки, так что вы можете разделить файлы и восстановить их без необходимости объединять их на удаленном сервере

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

Я искал способ включить инструкцию INSERT для каждой вставленной строки, а не один массивный оператор со множеством кортежей или каждой строки с использованием VALUES. Флаг `--extended-insert = FALSE` был тем, что мне нужно. благодаря! – dmkc 2012-07-09 19:52:12

+0

Создать таблицу: mysqldump mydatabase mytable -d> mytable-create.sql` Данные: `mysqldump mydatabase mytable --extended-insert = FALSE --no-create-info = TRUE> mytable-data.sql` Затем разделить его на ряд файлов любой длины: разбиваться туЬаЫе-data.sql -l10000` Теперь вы можете импортировать сначала создать SQL. Затем каждая из столов длиной 10000. По умолчанию файлы будут называться xaa, xab, xac ...). Важные их значения: `mysql mydatabase liamvictor 2018-01-03 13:12:19

0

Try csplit (1) сократить до выхода в отдельные таблицы, основанные на регулярных выражениях (соответствующие границе таблицы, о которой я думаю).

1

Вы можете сбросить отдельные таблицы с туздЫшпр, запустив mysqldump database table1 table2 ... tableN

Если ни одна из таблиц не слишком велики, что будет достаточно. В противном случае вам придется начать разделять данные в больших таблицах.

10

Вы говорите, что у вас нет доступа ко второму серверу. Но если у вас есть доступ к оболочке первого сервера, в котором столы, вы можете разделить ваш дамп с помощью таблицы:

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

Это создаст файл GZIP для каждой таблицы.

Другим способом разделения вывода mysqldump в отдельных файлах является опция -tab.

mysqldump [connecting options] --tab=directory_name dbname

где directory_name это имя пустого каталога. Эта команда создает файл .sql для каждой таблицы, содержащий оператор CREATE TABLE, и файл .txt, содержащий данные, которые необходимо восстановить, используя LOAD DATA INFILE. Я не уверен, что phpMyAdmin может обрабатывать эти файлы с вашим конкретным ограничением.

+0

Хотя это может напрямую не соответствовать потребностям OP, это потрясающий способ получить отдельные таблицы в свои файлы ... для grep и т. Д. – 2012-08-03 20:13:57

2

Вам не нужен ssh-доступ к любому из ваших серверов. Просто mysql [dump] клиент в порядке. С помощью mysql [dump] вы можете сбросить базу данных и снова импортировать ее.

В вашем компьютере, вы можете сделать что-то вроде:

$ туздЫшпр -u originaluser -poriginalpassword -h originalhost originaldatabase | mysql -u newuser -pnewpassword -h newhost newdatabase

и все готово. :-)

надеюсь, что это помогает

0

Отъезд SQLDumpSplitter 2, я просто использовал его, чтобы разделить 40МБ дамп с успехом. Вы можете получить его по ссылке ниже:

sqldumpsplitter.com

Надежда эта помощь.

+0

URL-адрес больше не работает – cdmdotnet 2012-09-24 08:31:23

+0

что об этом: http://www.sqldumpsplitter.com/ – Sk8erPeter 2012-09-29 11:13:49

1

я бы порекомендовал утилиту bigdump, вы можете получить его здесь. http://www.ozerov.de/bigdump.php это шагает по исполнению дампа, как можно ближе к вашему пределу, выполняя целые строки за раз.

26

Этого Баш скрипт разбивает файл дамп из одной базы данных в отдельные файлы для каждой таблицы и имена с csplit и называют их соответственно:

#!/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* 

на основе https://gist.github.com/jasny/1608062
и https://stackoverflow.com/a/16840625/1069083

0

Этого script должен делать его:

#!/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

Вы можете разделить существующий файл на AWK. Это очень QUIK и просто

раскол таблицы дамп Давайте на «столы»:

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

Или вы можете разделить дамп на «базе»

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

Существует этот отличный mysqldumpsplitter скрипт, который поставляется с тонны опции, когда дело доходит до извлечения-из-mysqldump.

Я бы скопировать рецепт здесь, чтобы выбрать корпус из:

1) Извлечения одной базы данных из туздЫшпра:

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

Над команды будет создавать SQL для указанной базы данных из указанного "filename" sql-файл и сохраните его в сжатом формате до database-name.sql.gz.

2) Выписка из одной таблицы туздЫшпр:

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

Над командой будет создавать SQL для указанной таблицы из указанного «имя файла» туздЫшпр файл и сохранить его в сжатом формате базы данных-name.sql .gz.

3) Extract таблицы соответствия регулярного выражения из туздЫшпра:

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

Над команды создаст SQLs для таблиц соответствуют регулярным выражения из указанного «имени файл» туздЫшпр файла и сохранить его в сжатом формате отдельный table-name.sql.gz.

4) Извлечение всех баз данных из туздЫшпра:

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

Над команды извлечет все базы данные из указанного файла «» туздЫшпра файла и сохранить его в сжатом формате индивидуальной базы данных-name.sql. GZ.

5) Извлечь все таблицы из туздЫшпра:

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

Над команды извлечет все таблицы из указанного файла «» туздЫшпра файла и сохранить его в сжатом формате индивидуального настольного name.sql. GZ.

6) Извлечь список таблиц из туздЫшпра:

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

Над команды будет извлекать таблицы из указанного файла «» файл туздЫшпра и хранить их в сжатом формате индивидуального настольного name.sql .gz.

7) Извлечение базы данных из сжатого туздЫшпра:

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

Над команды распаковывает filename.sql.gz с помощью GZIP, извлечь базы данных с именем "имя_бд" от "filename.sql.gz" & сохраните его как out/dbname.sql.GZ

8) Извлечение базы данных из сжатого туздЫшпра в несжатом формате :

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

Над команды распаковывает filename.sql.gz с использованием GZIP и извлечением базы данных с именем «имя_бд» из «файла .sql.gz»& магазин как обычный SQL из/dbname.sql

9) Выписка из AllTables туздЫшпр в другой папке:

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

Над командой извлечет все таблицы из указанного файла «» туздЫшпр файл и извлекает таблицы в сжатом формате для отдельных файлов, таблицы name.sql.gz хранятся в каталоге/путь/к/Экстракты /. Сценарий создаст папку/путь/в/extracts/if not exists.

10) Извлечение одного или несколько таблиц из одной базы данных в полном дампе:

Рассмотрит у вас есть полный дамп с несколькими базами данных, и вы хотите вытяжных несколько таблиц из одной базы данных.

Извлечение единой базы данных: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

Извлечение всех таблиц sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" хотя мы можем использовать другой вариант, чтобы сделать это в одной команде следующим образом:

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

Над командой извлечет как tbl1 и tbl2 из База данных DBNAME в формате sql в папке «out» в текущем каталоге.

Вы можете извлечь одну таблицу следующим образом:

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

11) Извлеките все таблицы из указанной базы данных:

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

Над команды извлечет все таблицы из базы данных DBNAME в SQL и сохраните его в директории «вне».

12) содержимого списка туздЫшпр файла

mysqldumpsplitter.sh --source filename --desc

Выше команды будут перечислены базы данных и таблицы из файла дампа.

Возможно, вам будет необходимо загрузить файлы: zcat filename.sql.gz | MySQL -uUSER -p -hHOSTNAME

  • Кроме того, как только вы извлекаете одну таблицу, которую вы считаете еще больше, вы можете использовать команду Линукс разделенным с количеством строк в дальнейшем разделить дамп. split -l 10000 filename.sql

  • Тем не менее, если это ваша потребность (прибывающий чаще), вы могли бы рассмотреть вопрос об использовании mydumper который фактически создает отдельные отвалы вам не нужно разделить!

1

Разъяснение от ответа @ Verace:

Я специально, как интерактивный метод; вы можете разделить большой файл в Eclipse. Я попробовал файл 105GB в Windows, успешно:

Просто добавьте библиотеку MySQLDumpSplitter к вашему проекту: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Quick примечание о том, как импортировать:

- 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. 
0

Попробуйте это: https://github.com/shenli/mysqldump-hugetable Это будет удалять данные во множество небольших файлов. Каждый файл содержит менее или равные записи MAX_RECORDS. Вы можете установить этот параметр в env.sh.

Смежные вопросы