如何删除mysqldump中包含大量表格的一个大表的输出?
我有一个6 GB大的数据库转储,但其中90%只是一个日志表“cache_entries”,我在备份中不再需要了。
如何在转储中轻松删除描述大型日志记录表的位?
我发现了这个: http://gtowey.blogspot.de/2009/11/restore-single-table-from-mysqldump.html
示例:
grep -n 'Table structure' dump.sql
然后例如:
sed -n '40,61 p' dump.sql > t2.sql
但我怎样才能根据自己的需要改变呢?
答案 0 :(得分:13)
您可以使用'n,n d'删除某些行。 我想在你的情况下,你确实想要有问题的表,但不想要数据?
更改grep命令以包括“转储表的数据”:
grep -n 'Table structure\|Dumping data for table' dump.sql 19:-- Table structure for table `t1` 37:-- Dumping data for table `t1` 47:-- Table structure for table `t2` 66:-- Dumping data for table `t2` 76:-- Table structure for table `t3` 96:-- Dumping data for table `t3`
现在,如果您不想要t2的数据,可以使用:
sed '66,75 d' dump.sql > cleandump.sql
答案 1 :(得分:11)
我找到了这个bash脚本,它使用csplit
(将文件拆分为由上下文行确定的部分)将一个数据库的转储拆分为每个表的单独字段:
#!/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 [ $# -ne 1 ] ; then
echo "USAGE $0 DUMP_FILE"
fi
csplit -s -ftable $1 "/-- Table structure for table/" {*}
mv table00 head
for FILE in `ls -1 table*`; do
NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
cat head $FILE > "$NAME.sql"
done
rm head table*
并略微增强: How do I split the output from mysqldump into smaller files?
一次,每个表都有单独的文件,您可以删除不需要的表并在需要时将它们粘合在一起
cat table* >glued_sqldump.sql
答案 2 :(得分:0)
您需要找到表的create table语句,并找到下一个create table语句。说他们是n1和n2。
然后你可以用sed删除它们,如上所述。 sed'n1,n2d'dump.sql> new.sql
你可以grep创建表并记下你的预备工作的行号。
这是一个演示。
ubuntu@ubuntu:~$ grep -n [34] a.txt
3:3
4:4
ubuntu@ubuntu:~$ cat a.txt
1
2
3
4
5
6
ubuntu@ubuntu:~$ grep [34] a.txt
3
4
ubuntu@ubuntu:~$ sed '3,4d' a.txt > b.txt
ubuntu@ubuntu:~$ cat b.txt
1
2
5
6
ubuntu@ubuntu:~$