如何从mysqldump中删除一个表

10

如何在包含多个表的mysqldump中删除一个大表的输出?

我有一个6GB大小的数据库转储文件,但其中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

但是我如何根据自己的需求进行更改呢?

为什么在初始转储中甚至包括那个表?看起来mysqldump的API应该允许您只转储您关心的表。 http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html - ControlAltDel
我没有制作那个疯狂的备份 ;) - rubo77
3个回答

19
您可以使用 'n,n d' 命令删除特定行。我猜在您的情况下,您想保留相关表格结构,但不需要数据?

将grep命令更改为包括“正在转储表的数据”:
grep -n 'Table structure\|Dumping data for table' dump.sql 
19:-- 表 `t1` 的结构
37:-- 正在转储表 `t1` 的数据
47:-- 表 `t2` 的结构
66:-- 正在转储表 `t2` 的数据
76:-- 表 `t3` 的结构
96:-- 正在转储表 `t3` 的数据
现在,如果您不需要t2的数据,则可以使用:
sed '66,75 d' dump.sql > cleandump.sql

14

我找到了这个Bash脚本,它可以使用csplit(将文件按上下文行分成不同的部分)将一个数据库的转储文件拆分成每个表的单独文件:

我发现了这个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*

来源: gist.github.com/1608062

稍微改进一下:如何将mysqldump的输出拆分成较小的文件呢?

一旦你为每个表单独创建了文件,你就可以使用以下命令删除不需要的表格,并将它们粘合在一起(如果需要):

cat table* >glued_sqldump.sql


工作得非常好。 - Hashim Aziz

0

你需要找到你的表的创建表语句,并找到下一个创建表语句。假设它们是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:~$ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接