当前位置:  开发笔记 > 编程语言 > 正文

如何将mysqldump的输出拆分为较小的文件?

如何解决《如何将mysqldump的输出拆分为较小的文件?》经验,为你挑选了5个好方法。

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

有没有办法将mysqldump的输出拆分成较小的文件?我不能使用split(1),因为我不能将文件cat(1)放回远程服务器上.

还是我错过了另一种解决方案?

编辑

第一张海报建议的mysqldump的--extended-insert = FALSE选项产生一个.sql文件,然后可以将其拆分为可导入文件,前提是使用合适的--lines选项调用split(1).通过反复试验,我发现bzip2将.sql文件压缩了20倍,所以我需要弄清楚有多少行sql代码大致相当于40MB.



1> rubo77..:

这个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
和/sf/ask/17360801/


需要注意的是,Mac上的csplit无法使用此脚本,因为它不支持{*}语法.需要在Linux中运行它.

2> Vinko Vrsalo..:

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

mysqldump -d --all-databases 

并恢复它.

之后只将数据转储到单独的insert语句中,这样您就可以拆分文件并将其还原,而无需在远程服务器上连接它们.

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



3> 小智..:

您说您无权访问第二台服务器.但是,如果您具有对表所在的第一台服务器的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

这将为每个表创建一个gzip文件.

将mysqldump的输出拆分为单独文件的另一种方法是使用--tab选项.

mysqldump [connecting options] --tab=directory_name dbname 

其中directory_name是空目录的名称.此命令为每个表创建一个.sql文件,其中包含CREATE TABLE语句,以及一个包含要使用LOAD DATA INFILE还原的数据的.txt文件.我不确定phpMyAdmin是否可以使用您的特定限制来处理这些文件.


是空目录的名称.此命令为每个表创建一个.sql文件,其中包含CREATE TABLE语句,以及一个包含要使用LOAD DATA INFILE还原的数据的.txt文件.我不确定phpMyAdmin是否可以使用您的特定限制来处理这些文件.

4> 小智..:

迟到的回复,但正在寻找相同的解决方案,并从以下网站遇到以下代码:

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



5> mysql_user..:

有一个出色的mysqldumpsplitter脚本,其中包含从mysqldump提取时的大量选项。

我会在这里复制配方,以便从以下情况中选择您的案例:

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

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

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

2)从mysqldump中提取单个表:

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

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

3)从mysqldump提取与正则表达式匹配的表:

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

上面的命令将为从指定的“ filename” mysqldump文件中匹配指定正则表达式的表创建sql,并将其以压缩格式存储到单个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文件中提取所有表,并将其以压缩格式存储到单个表名.sql.gz。

6)从mysqldump中提取表列表:

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

上面的命令将从指定的“文件名” mysqldump文件中提取表,并将它们以压缩格式存储到单独的表名.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”的数据库,并将其存储为out / 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 / extracts /下的table-name.sql.gz。该脚本将创建/ path / to / extracts /文件夹(如果不存在)。

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

上面的命令将从sql格式的DBNAME数据库中同时提取tbl1和tbl2,位于当前目录的“ 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

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

12)列出mysqldump文件的内容

mysqldumpsplitter.sh --source filename --desc

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

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

同样,一旦提取出您认为仍然更大的单个表,就可以使用带有行数的linux split命令进一步拆分转储。 split -l 10000 filename.sql

就是说,如果这是您的需要(经常出现),则可以考虑使用mydumper,它实际上创建了不需要拆分的单个转储!

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有