Based on 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 $0 DUMP_FILE [TABLE]"
exit
fi
if [ $# -ge 2 ] ; then
csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
csplit -s -ftable $1 "/-- 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*
I want to split my big mysqldump file for get each table structure and table data separately.
I'm no expert in bash script and I search the pattern for split the dump file to get several files like :
- table_one_structure.sql
- table_one_data.sql
- table_two_structure.sql
- table_two_data.sql
- etc ..
You can also split dump with awk script:
cat dumpfile | gawk -f script.awk
(or./script.awk < dumpfile
if you make it executable). It will create pairs oftablename.schema.sql
,tablename.data.sql
files in current directory for each table in mysqldump in one pass.Warning: there is no special handling for characters in table names - they are used as is in filenames.