如何将mysqldump的输出分割成更小的文件?

我需要将整个表从一个MySQL数据库移动到另一个。 我没有完全访问第二个,只有phpMyAdmin访问。 我只能上传(压缩)小于2MB的sql文件。 但是第一个数据库表的mysqldump的压缩输出大于10MB。

有没有办法将输出从mysqldump分割成更小的文件? 我无法使用split(1),因为我无法将文件(1)回送到远程服务器上。

还是有我错过的另一个解决scheme?

编辑

如果第一个海报提供的mysqldump的–extended-insert = FALSE选项产生一个.sql文件,然后可以将其分割成可导入的文件,前提是split(1)用一个合适的–lines选项调用。 通过试验和错误,我发现bzip2压缩.sql文件的20倍,所以我需要弄清楚有多less行代码大致相当于40MB。

首先转储模式(它确实适合2Mb,不是吗?)

mysqldump -d --all-databases 

并恢复它。

之后只在单独的插入语句中转储数据,因此您可以拆分文件并进行恢复,而不必在远程服务器上连接它们

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

这个bash脚本将一个数据库的转储文件拆分为每个表的单独文件,并用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 TIME_ZONE=@OLD_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 TIME_ZONE=@OLD_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

你说你没有访问第二台服务器。 但是,如果您具有对第一台服务器(即表所在的位置)的shell访问权限,则可以通过表拆分转储:

 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 

这将为每个表创build一个gzip文件。

另一种将mysqldump的输出分割成单独文件的方法是使用–tab选项。

 mysqldump [connecting options] --tab=directory_name dbname 

其中directory_name是一个空目录的名称。 此命令为每个表创build一个.sql文件,其中包含CREATE TABLE语句和包含数据的.txt文件,使用LOAD DATA INFILE进行恢复。 不过,我不确定phpMyAdmin是否可以处理这些文件。

晚回复,但正在寻找同样的解决scheme,并遇到以下代码从下面的网站:

 for I in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $I | gzip > "$I.sql.gz"; done 

http://www.commandlinefu.com/commands/view/2916/backup-all-mysql-databases-to-individual-files

你不需要SSH访问你的任何一台服务器。 只是一个MySQL [转储]客户端是好的。 用mysql [转储],你可以转储你的数据库并重新导入。

在你的电脑上,你可以做如下的事情:

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

你完成了。 🙂

希望这可以帮助

我最近创build了sqlsplit.com 。 试试看。

有这个出色的mysqldumpsplitter脚本,它提供了大量的选项,当涉及到从mysqldump提取。

我会复制食谱在这里select你的情况:

1)从mysqldump中提取单个数据库:

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

以上命令将从指定的“filename”sql文件中为指定的数据库创buildsql,并以压缩格式将其存储到database-name.sql.gz。

2)从mysqldump中提取单个表:

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

以上命令将从指定的“filename”mysqldump文件为指定的表创buildsql,并以压缩格式将其存储到database-name.sql.gz。

3)从mysqldump中提取匹配正则表的表:

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

上面的命令将为指定的“filename”mysqldump文件中匹配指定正则expression式的表创buildsqls,并将其以压缩格式存储到单独的table-name.sql.gz中。

4)从mysqldump中提取所有数据库:

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

以上命令将从指定的“文件名”mysqldump文件中提取所有数据库,并将其以压缩格式存储到单独的database-name.sql.gz中。

5)从mysqldump中提取所有表:

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

以上命令将从指定的“文件名”mysqldump文件中提取所有表,并以压缩格式将其存储到单独的table-name.sql.gz中。

6)从mysqldump中提取表的列表:

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

上面的命令将从指定的“文件名”mysqldump文件中提取表格,并将它们以压缩格式存储到单独的table-name.sql.gz中。

7)从压缩的mysqldump中提取数据库:

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

以上命令将使用gzip解压缩filename.sql.gz,从“filename.sql.gz”中提取名为“dbname”的数据库并将其存储为/ dbname.sql.gz

8)以压缩格式从压缩的mysqldump中提取数据库:

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

上面的命令将使用gzip解压缩filename.sql.gz,并从“filename.sql.gz”中提取名为“dbname”的数据库并将其存储为纯sql out / dbname.sql

9)从不同文件夹中的mysqldump中提取所有表:

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

上面的命令将从指定的“文件名”mysqldump文件中提取所有表格,并将压缩格式的表格提取到存放在/ path / to / extracted /下的单个文件table-name.sql.gz。 该脚本将创build文件夹/path/提取/如果不存在。

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)"尽pipe我们可以使用其他选项在单个命令中执行此操作,如下所示:

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

以上命令将从DBNAME数据库中以sql格式从当前目录下的“out”文件夹中提取tbl1和tbl2。

您可以按如下方式提取单个表格:

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

以上命令将以sql格式从DBNAME数据库提取所有表,并将其存储在“out”目录下。

12)列出mysqldump文件的内容

mysqldumpsplitter.sh --source filename --desc

上面的命令将列出转储文件中的数据库和表。

您稍后可以select加载文件:zcat filename.sql.gz | mysql -uUSER -p -hHOSTNAME

  • 另外,一旦你提取了你认为更大的单个表,你可以使用linux split命令和行数来进一步拆分转储。 split -l 10000 filename.sql

  • 这就是说,如果这是你的需要(更经常来),你可能会考虑使用mydumper ,这实际上创build个人转储,你不需要分裂!

您可以通过运行mysqldump database table1 table2 ... tableN转储单个表与mysqldump

如果没有一个表太大,那就足够了。 否则,你将不得不开始拆分大表中的数据。

对@Vérace答案的澄清:

我特别喜欢交互式的方法; 你可以在Eclipse中分割一个大文件。 我已经在Windows中成功地尝试了一个105GB的文件:

只需将MySQLDumpSplitter库添加到您的项目中即可: http ://dl.bintray.com/verace/MySQLDumpSplitter/jar/

快速注意如何导入:

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

尝试csplit(1)根据正则expression式切割输出到各个表(匹配表边界,我会认为)。

这个脚本应该这样做:

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

查看SQLDumpSplitter 2,我只是用它来分割成功的40MB转储。 您可以通过以下链接获取:

sqldumpsplitter.com

希望这个帮助。

我创build了MySQLDumpSplitter.java,它不像bash脚本,在Windows上工作。 它可以在这里https://github.com/Verace/MySQLDumpSplitter

您可以通过AWK拆分已有的文件。 这是非常quik和简单

我们用'tables'拆分表转储:

 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}'; 

试试这个: https : //github.com/shenli/mysqldump-hugetable它会将数据转储到很多小文件中。 每个文件包含较less或相等的MAX_RECORDSlogging。 你可以在env.sh中设置这个参数。