我需要将整个表从一个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.
rub*_*o77 37
这个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*
Run Code Online (Sandbox Code Playgroud)
基于https://gist.github.com/jasny/1608062
和/sf/answers/1178843781/
Vin*_*vic 29
首先转储模式(它肯定适合2Mb,不是吗?)
mysqldump -d --all-databases
Run Code Online (Sandbox Code Playgroud)
并恢复它.
之后只将数据转储到单独的insert语句中,这样您就可以拆分文件并将其还原,而无需在远程服务器上连接它们.
mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
Run Code Online (Sandbox Code Playgroud)
小智 11
您说您无权访问第二台服务器.但是,如果您具有对表所在的第一台服务器的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 ; \
doneRun Code Online (Sandbox Code Playgroud)
这将为每个表创建一个gzip文件.
将mysqldump的输出拆分为单独文件的另一种方法是使用--tab选项.
mysqldump [connecting options] --tab=directory_name dbname Run Code Online (Sandbox Code Playgroud)
其中directory_name是空目录的名称.此命令为每个表创建一个.sql文件,其中包含CREATE TABLE语句,以及一个包含要使用LOAD DATA INFILE还原的数据的.txt文件.我不确定phpMyAdmin是否可以使用您的特定限制来处理这些文件.
小智 10
迟到的回复,但正在寻找相同的解决方案,并从以下网站遇到以下代码:
for I in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $I | gzip > "$I.sql.gz"; done
Run Code Online (Sandbox Code Playgroud)
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 none11)从特定数据库中提取所有表:
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,它实际上创建了不需要拆分的单个转储!
| 归档时间: |
|
| 查看次数: |
61359 次 |
| 最近记录: |