如何拆分一个大的 mysqldump 文件以分别获取每个结构和数据?

How to split a big mysqldump file for get each structure and data separately?

基于https://gist.github.com/jasny/1608062#file-mysql_splitdump-sh

#!/bin/bash

####
# Split MySQL dump SQL file into one file per table
# based on http://blog.tty.nl/2011/12/28/splitting-a-database-dump
####

if [ $# -lt 1 ] ; then
  echo "USAGE [=10=] DUMP_FILE [TABLE]"
  exit
fi

if [ $# -ge 2 ] ; then
  csplit -s -ftable  "/-- Table structure for table/" "%-- Table structure for table \`\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
  csplit -s -ftable  "/-- Table structure for table/" {*}
fi

[ $? -eq 0 ] || exit

mv table00 head

FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ] ; then
  mv $FILE foot
else
  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 文件以分别获取每个 table 结构和 table 数据。

我不是 bash 脚本方面的专家,我搜索了分割转储文件的模式以获取多个文件,例如:

您还可以使用 awk 脚本拆分转储: cat dumpfile | gawk -f script.awk(或者 ./script.awk < dumpfile 如果你让它执行 table)。 它将一次性在 mysqldump 中为每个 table 在当前目录中创建成对的 tablename.schema.sqltablename.data.sql 文件。

警告:table 名称中的字符没有特殊处理 - 它们在文件名中按原样使用。

#!/usr/bin/gawk -f
BEGIN {
    is_data=0; is_struct=0; is_header=1; is_footer=0; i=0; tname="UNKNOWN_TABLE";
}

/^($|-- |\/\*\!)/ && !/^-- Table struct/ {
  # accumulate header lines
    if (is_header && !is_struct) { header[i]= [=10=]; i++; } 
}

/^-- Table structure for table/ {
    is_struct=1; is_header=0; i=0; is_data=0;
    tname=substr(,2,length()-2);
    tables[tname]=1;
    print "--" > tname".schema.sql"
    for (i in header) print header[i] >> tname".schema.sql";
    ###print "STRUCT:", tname;
}

/^-- Dumping data for table/ {
    is_data=1; is_header=0; is_struct=0;
    tname=substr(,2,length()-2);
    print "--" > tname".data.sql"
    for (i in header) print header[i] >> tname".data.sql";
    ###print "DATA_START for table ",tname;
    i=0
}

{ if (is_struct) { print [=10=] >> tname".schema.sql"} }
{ if (is_data) { print [=10=] >> tname".data.sql" } }

/^UNLOCK TABLES/ {
    is_data=0; is_struct=0;
    ###print "DATA_END for table ",$tname;
}

/^(--|\/\*.40[0-9]{3} SET .+\*\/;$)/ {
    if (!(is_header || is_struct || is_data)) {
        # accumulate footer lines
        is_footer=1;
        footer[[=10=]]=1;
    }
}

END { 
    # append footer to files
    for (t in tables) {
        for (f in footer) {
            print f >> t".schema.sql";
            print f >> t".data.sql";
        }
    }
}