尝试将表数据从一个 MySQL 数据库移动到另一个时,可能会出现文件大小限制。如果 mysqldump 的输出超出了允许的上传大小,则需要一种方法将输出拆分为更小的文件。
一种解决方案涉及在 mysqldump 中使用 --extended-insert=FALSE 选项。这将创建一个 .sql 文件,可以使用 split(1) 和合适的 --lines 选项来拆分该文件。但是,如果 cat(1) 无法在远程服务器上使用,则此方法变得不可行。
或者,可以使用 bash 脚本将转储文件拆分为每个表的单独文件。该脚本使用 csplit 根据特定模式(例如表结构或表名称)划分文件。
以下是一个示例脚本:
#!/bin/bash START="/-- Table structure for table/" 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*
此脚本假设输入转储文件包含表结构和数据。它在表边界处分割文件,并将每个表的数据分配给具有适当文件名的单独文件。
以上是如何将 Mysqldump 输出拆分为更小的文件以便于服务器上传?的详细内容。更多信息请关注PHP中文网其他相关文章!