mysql转储-排除一些表数据

mysql转储-排除一些表数据,mysql,Mysql,是否可以使用mysql dump导出整个数据库结构,但从导出中排除某些表数据 假设数据库有200个表,我希望导出所有200个表的结构,但我想忽略5个特定表的数据 如果有可能,如何做到这一点?根据: 这将从所有表生成结构为export.sql的export.sql,并从所有表(不包括表名称)生成数据 mysqldump --ignore-table=db_name.table_name db_name > export.sql mysqldump --no-data db_name tabl

是否可以使用mysql dump导出整个数据库结构,但从导出中排除某些表数据

假设数据库有200个表,我希望导出所有200个表的结构,但我想忽略5个特定表的数据

如果有可能,如何做到这一点?

根据:


这将从所有表生成结构为export.sql的export.sql,并从所有表(不包括表名称)生成数据

mysqldump --ignore-table=db_name.table_name db_name > export.sql
mysqldump --no-data db_name table_name >> export.sql

我认为AmitP的解决方案已经很好了——为了进一步改进它,我认为有必要先创建所有表(结构),然后用数据填充,除了那些“排除”的表

如果要排除多个表,只需更频繁地使用
--ignore table
指令(在2nc命令中)-请参阅mysqldump帮助:

--ignore-table=name   Do not dump the specified table. To specify more than one
                      table to ignore, use the directive multiple times, once
                      for each table.  Each table must be specified with both
                      database and table names, e.g.,
                     --ignore-table=database.table

我是一个新用户,没有足够的声誉来投票或评论答案,所以我只是将此作为一个答案来分享

@康德显然有最好的答案

@AmitP的方法将所有结构和
数据
转储到一个
文件
,然后在最后一个
拖放/创建表
语句。生成的文件仍然需要您在销毁之前导入所有不需要的数据

@kantholy的方法首先转储所有结构,然后只转储您不忽略的
表的
数据
。这意味着您随后的
导入
将不必花费时间来导入所有您不想要的
数据
——如果您有大量的
数据
要忽略以节省时间,这一点尤为重要

总而言之,最有效的答案是:

mysqldump --no-data db_name > export.sql
mysqldump --no-create-info --ignore-table=db_name.table_name1 [--ignore-table=db_name.table_name2, ...] db_name >> export.sql

我使用的另一种可能性是避免将数据插入所需表的行

其原理是使用grep-v将INSERT过滤到行中

您可以轻松地进入gzip文件和单独的错误文件

mysqldump name_of_db | grep -v 'INSERT INTO \`name_of_db\`.\`name_of_table\`' | gzip > /path/dumpfile.sql.gz 2> /path/name_of_db.err

因此,可以很好地备份您想要的内容,并知道哪些内容失败了(如果有):

前面的答案无法解决导出结构时的
自动增量问题,并且没有显示如何导出表中的某些特定数据

为了更进一步,我们必须做到:

1/导出结构

mysqldump --no-data db_name | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > export-structure.sql
mysqldump --no-create-info --tables table_name --where="id not in ('1', '2', ...)" > export-table_name-data.sql
2/仅导出数据并忽略某些表格

mysqldump --no-create-info --ignore-table=db_name.table_name1 [--ignore-table=db_name.table_name2, ...] db_name >> export-data.sql
3/将特定数据导出到一个表中

mysqldump --no-data db_name | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > export-structure.sql
mysqldump --no-create-info --tables table_name --where="id not in ('1', '2', ...)" > export-table_name-data.sql


我尝试使用
--skip opt
选项重置
自动增量
,但这也删除了字段中的
自动增量
定义,在我看来,最好的答案来自牛排,这是任何情况下唯一有效的答案

所有提示两个转储的答案都是错误的,或者至少它们可以在特定的前提下工作

正如上面许多人所指出的,你可能会遇到序列问题

但是我发现数据库可以有验证或处理信息的触发器(假设在表a上插入时在表B上插入记录的触发器)——在这种情况下,创建完整模式(包括触发器)的顺序更为关键然后插入数据将创建一组不同的结果。

要进一步改进,请添加压缩并通过不写入未压缩数据删除大部分磁盘写入:

#/bin/bash
echo-n“数据库名称:”
read-r数据库名称
echo-n“用户名:”
read-r用户名
echo-n“从表中排除数据:”
read-r排除表数据
{
mysqldump“$db_name”--user=“$username”--密码--无表空间--无数据\
&& \
mysqldump“$db_name”--user=“$username”--密码--无表空间--无创建信息\
--忽略table=“${db\u name}.${exclude\u table\u data}”;
} \
|bzip2-c9\
>“${db_name}{(日期+%y%m%d_%H%m)。sql.bz2”

我认为您需要进行两次备份—一次只备份所有表的结构,另一次只备份除5个表以外的所有表的数据。但这样做可能会导致结果不一致。Marty,请帮助论坛。看看下面的Kantholy的答案,并强烈考虑把它作为可接受的答案。你接受的那个不是最有用的,甚至不是最相关的。它只是要忽略的数据,我需要这个结构然后只使用结构进行一次转储(
--无数据
),然后另一次转储跳过结构,但转储并跳过你不需要的表。或者您只需在全局转储的末尾附加一些
delete from…
查询,即可从表中删除数据。是的,所以导出所有数据,存储所有数据,导入所有数据,然后删除即可。一个奇怪的排除定义。这个答案并不真正符合OP的要求(即转储所有表的结构,但跳过一个表的数据)是的,不符合要求,我喜欢AmitP的答案,因为它可以在一个命令中使用,并生成一个文件,该文件将很好地适合bash脚本:)谢谢这是一个更好的答案,因为它跳过了不需要的数据,但得到了想要的模式,而且我喜欢它仍然生成一个文件。请注意,您可以多次使用
--ignore table
选项来忽略多个表。此export.sql将创建一个包含空表的数据库。调用应该以另一种方式执行:首先是没有数据的调用,然后是忽略的调用-table@cheneym第一个命令只是将整个db转储到export.sql,不包括名为“table_name”的表。第二个命令只是添加了“table_name”的结构,而没有数据。请测试它,看看它是如何工作的,或者至少解释一下关于空表的说法。对于多个表:mysqldump---ignore table=db_name.table1--ignore table=db_name.table2[…]db_name>export。sql@dspjm,你能解释一下为什么这个答案不如AmitP的答案好吗?:)事实上,这远远优于AmitP的答案。这是解决问题的更合乎逻辑的方法,并创建具有更可读性的文件
mysqldump --no-create-info --ignore-table=db_name.table_name1 [--ignore-table=db_name.table_name2, ...] db_name >> export-data.sql
mysqldump --no-create-info --tables table_name --where="id not in ('1', '2', ...)" > export-table_name-data.sql