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

时间:2020-03-06 14:43:01  来源:igfitidea点击:

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

有没有办法将mysqldump的输出拆分为较小的文件?我无法使用split(1),因为无法将文件分类(1)到远程服务器上。

还是我错过了其他解决方案?

编辑

第一个发帖人建议的mysqldump的--extended-insert = FALSE选项将产生一个.sql文件,然后可以将其拆分为可导入文件,只要使用适当的--lines选项调用split(1)即可。通过反复试验,我发现bzip2将.sql文件压缩了20倍,因此我需要找出多少行sql代码大致对应于40MB。

解决方案

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

mysqldump -d --all-databases

并恢复它。

之后,仅将数据转储到单独的插入语句中,因此我们可以拆分文件并还原它们,而不必在远程服务器上将它们串联起来

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

尝试csplit(1)根据正则表达式将输出分割成各个表(匹配我认为的表边界)。

我们可以通过运行mysqldump database table1 table2 ... tableN`来使用mysqldump转储单个表。

如果没有一个表太大,那就足够了。否则,我们将必须开始在较大的表中拆分数据。

我们说我们无权访问第二台服务器。但是,如果我们具有对第一个服务器(表所在的位置)的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语句),并为一个包含数据的.txt文件创建要使用LOAD DATA INFILE恢复的文件。我不确定phpMyAdmin是否可以根据特定限制处理这些文件。

我们不需要ssh访问任何一台服务器。只需一个mysql [dump]客户端就可以了。
使用mysql [dump],我们可以转储数据库并再次导入它。

在PC中,我们可以执行以下操作:

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

到此为止。 :-)

希望这可以帮助

看看SQLDumpSplitter 2,我只是用它成功地拆分了40MB的转储。我们可以在下面的链接中获取它:

sqldumpsplitter.com

希望对我们有所帮助。