作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我需要将整个表从一个 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
# cut off all other tables
mv $FILE foot
else
# cut off the end of each file
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
关于mysql - 如何将 mysqldump 的输出拆分为较小的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/132902/
我是一名优秀的程序员,十分优秀!