分卷导出MySQL大库需用mysqldump --skip-extended-insert配合split -b按字节切分并加.sql后缀,确保每片以完整INSERT结尾;导入时须按序拼接执行,不可单独运行各分卷文件。 用 mysqldump + split 分卷导出大 SQL 文件 当你需要一次性导
当你需要一次性导出超过2GB的MySQL数据库时,很多备份工具或传输协议就容易“罢工”——要么报出OSError: [Errno 27] File too large的错误,要么就是上传到一半莫名断开。问题来了,mysqldump本身并没有内置分卷功能,怎么办?答案是利用Shell的管道,让mysqldump和split命令接力完成。
这里的关键,远不止“把文件切小”这么简单。真正的挑战在于,切分后的每一个文件,都必须以一条完整的SQL语句结尾。否则,在后续导入时,十有八九会撞上ERROR 1064 (42000)这类语法错误,导致整个恢复过程前功尽弃。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
--skip-extended-insert参数。这个选项的作用是让每条INSERT语句单独成行,从根本上杜绝一条超长的SQL语句被split拦腰截断的风险。split -b 500M -d --additional-suffix=.sql。用-b按字节大小切分最可靠;-d参数让后缀是数字(如00, 01),方便排序;--additional-suffix则确保生成的文件直接带有.sql扩展名,一目了然。split -l按行数切割。SQL文件里混杂的注释、空行和多行语句,会让行数切割法彻底失效,导致文件碎片化。mysqldump -u root -p --skip-extended-insert mydb | split -b 500M -d --additional-suffix=.sql - dump_执行后,你会得到
dump_00.sql、dump_01.sql等一系列文件。分卷文件可不是一个个独立的SQL脚本。比如,dump_00.sql的结尾,很可能是一条INSERT语句写到一半,或者一个事务正处在中间状态。如果试图单独执行每一个文件,用mysql -u root -p mydb < dump_00.sql这样的命令,大概率会遇到ERROR 2013 (HY000): Lost connection to MySQL server during query,导入进程会意外中断。
正确的做法,是把所有分卷文件按正确的顺序拼接成一个整体,再一次性导入数据库。
cat dump_*.sql | mysql -u root -p mydb。这里要注意,通配符*默认按ASCII码排序。对于dump_00、dump_01这种命名没问题,但如果文件是dump_0.sql、dump_10.sql,排序就会出错。dump_1.sql、dump_10.sql),更稳妥的命令是:printf '%s\n' dump_*.sql | sort -V | xargs cat | mysql -u root -p mydb,其中sort -V能识别版本号格式的自然排序。type dump_00.sql dump_01.sql | mysql -u root -p mydb。这是一个经典的陷阱:同时使用--single-transaction和--lock-tables参数。在导出大表时,这很容易引发锁等待超时,导致mysqldump进程卡死或意外终止。结果就是,split出来的最后一个文件可能缺少关键的终止符(比如UNLOCK TABLES;或COMMIT;语句),让后续导入直接失败。
--single-transaction。它利用InnoDB的多版本并发控制(MVCC)来获取一致性视图,不会锁表。此时,务必关闭--lock-tables。--lock-tables来保证一致性。但切记,这种情况下绝对不要再添加--single-transaction参数,否则mysqldump会静默忽略--lock-tables并给出警告。--verbose参数运行一下,看看实际生效的选项到底是什么,避免配置文件中的参数覆盖了你的意图。Warning: Using a password on the command line interface can be insecure.提示,这虽然不算错误,但确实存在密码泄露风险。更安全的做法是使用~/.my.cnf配置文件来管理凭证。MySQL客户端内置的source命令,只接受单个文件路径作为参数,既不支持管道,也不支持通配符。如果你尝试在MySQL命令行里先source dump_00.sql;,再source dump_01.sql;,第二条命令很可能会因为连接上下文丢失或状态不一致而执行失败。
source命令的本质,是客户端在本地读取文件内容并逐行发送到服务器执行。它并不知道多个文件之间存在逻辑上的连续性,也不会自动帮你恢复上一个文件结束时的事务状态或会话变量。mysql客户端,回到操作系统Shell,用前面提到的cat或zcat(如果分卷文件是gzip压缩过的)命令合并后,再重定向导入。USE mydb;这样的语句,务必确保在合并后的文件里,这条语句之前没有其他切换数据库的操作,否则数据可能会被意外写入错误的库中。说到底,分卷切割的技术操作本身并不复杂。真正耗费时间的,往往是事后的验证环节。切分完成后,必须立刻用head -n 20和tail -n 20检查每个分卷文件的开头和结尾,确保语法完整。最好再随机挑一个分卷,用mysql -u root -p -e "SELECT 1;" && echo ok这样的命令快速测试一下数据库连接和权限是否正常。这些步骤没人能替你完成,一旦疏忽,很可能就意味着需要从头再来一次完整的导出。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述