将大型 mysqldump 输出拆分为较小的文件
有必要将表从一个数据库传输到另一个数据库,但 mysqldump 的转储输出是对于某些上传限制来说通常太大。本文探讨了一种巧妙的解决方案,将庞大的 mysqldump 输出拆分为可管理的较小文件。
shell 脚本建议的一种潜在方法是将转储拆分为每个表的单独文件。这可以使用 csplit 命令并指定表结构标记作为分割点来实现。
考虑使用此技术的 bash 脚本:
#!/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 ] || [[ == "--help" ]] || [[ == "-h" ]] ; then echo "USAGE: extract all tables:" echo " DUMP_FILE" echo "extract one table:" echo " DUMP_FILE [TABLE]" exit fi if [ $# -ge 2 ] ; then #extract one table csplit -s -ftable "/-- Table structure for table/" "%-- Table structure for table \`\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1" else #extract all tables csplit -s -ftable "$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*
此脚本使用 csplit 来分割转储文件分成单独的表文件,每个文件以相应的表命名。这允许稍后轻松地重新组装成单个文件。要使用此脚本,只需提供转储文件的路径作为第一个参数,并可选择指定要提取的特定表作为第二个参数。
以上是如何将大型 MySQL 转储拆分为较小的文件?的详细内容。更多信息请关注PHP中文网其他相关文章!