我需要将整个表从一个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.
这个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/
首先转储模式(它肯定适合2Mb,不是吗?)
mysqldump -d --all-databases
并恢复它.
之后只将数据转储到单独的insert语句中,这样您就可以拆分文件并将其还原,而无需在远程服务器上连接它们.
mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
您说您无权访问第二台服务器.但是,如果您具有对表所在的第一台服务器的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是否可以使用您的特定限制来处理这些文件.
迟到的回复,但正在寻找相同的解决方案,并从以下网站遇到以下代码:
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
有一个出色的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,它实际上创建了不需要拆分的单个转储!