如何从mysqldump中删除表

rub*_*o77 7 mysql bash mysqldump

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

我有一个6 GB大的数据库转储,但其中90%只是一个日志表"cache_entries",我在备份中不再需要了.

如何轻松删除转储中的那个位,它描述了大型日志记录表?

我发现了这个:http: //gtowey.blogspot.de/2009/11/restore-single-table-from-mysqldump.html

例:

grep -n 'Table structure' dump.sql
Run Code Online (Sandbox Code Playgroud)

然后例如:

sed -n '40,61 p' dump.sql > t2.sql
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能根据我的需要改变它呢?

Hig*_*ing 14

您可以使用'n,nd'删除某些行.我想在你的情况下,你确实想要有问题的表,但不想要数据?

更改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


rub*_*o77 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*
Run Code Online (Sandbox Code Playgroud)

资料来源:gist.github.com/1608062

并有点增强: 如何将mysqldump的输出拆分成较小的文件?

一旦你有每个表的单独文件,你可以删除不需要的表,并在需要时将它们粘在一起

cat table* >glued_sqldump.sql