首页  >  文章  >  数据库  >  如何将 Mysqldump 输出拆分为更小的文件以便于服务器上传?

如何将 Mysqldump 输出拆分为更小的文件以便于服务器上传?

Barbara Streisand
Barbara Streisand原创
2024-11-17 03:06:03995浏览

How to Split Mysqldump Outputs into Smaller Files for Easier Server Upload?

将 Mysqldump 输出拆分为较小的文件以供服务器上传

尝试将表数据从一个 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn