mysql dump - 排除一些表数据

Mar*_*ace 39 mysql

是否有可能,使用mysql转储导出整个数据库结构,但从导出中排除某些表数据.

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

如果可以,那怎么办?

Ami*_*itP 93

这将生成带有来自所有表的结构的export.sql和来自除table_name之外的所有表的数据

mysqldump --ignore-table=db_name.table_name db_name > export.sql
mysqldump --no-data db_name table_name >> export.sql
Run Code Online (Sandbox Code Playgroud)

  • 这个 export.sql 将创建一个带有空表的数据库。调用应该以相反的方式执行:首先是带有 --no-data 的调用,然后是带有 --ignore-table 的调用 (3认同)
  • 这是一个更好的答案,因为它会跳过不需要的数据,但会获取所需的架构,而且我喜欢它仍然生成一个文件。请注意,您可以多次使用“--ignore-table”选项来忽略多个表。 (2认同)
  • @cheneym 第一个命令只是将整个数据库转储到 export.sql,不包括名为“table_name”的表。第二个命令只是添加了 'table_name' 的结构而没有它的数据。请测试它,看看它是如何工作的,或者至少解释一下你关于空表的陈述。 (2认同)

kan*_*oly 45

我认为AmitP的解决方案已经很好了 - 为了进一步改进它,我认为首先创建所有表(结构)然后用数据填充它是有意义的,除了那些"排除"

mysqldump --no-data db_name > export.sql
mysqldump --no-create-info --ignore-table=db_name.table_name db_name >> export.sql
Run Code Online (Sandbox Code Playgroud)

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

--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
Run Code Online (Sandbox Code Playgroud)

  • @dspjm,你能解释为什么这个答案不如AmitP的答案好吗?:) (5认同)
  • 事实上,这远远优于AmitP的答案.如果需要,这是解决问题的更合理的方法,并创建一个具有更可读顺序的文件. (4认同)
  • 我同意这个答案比 AmitP 的更好,但它有同样的问题,即如果将一行添加到两个 mysqldump 之间的表中,则存储在模式部分中的自动增量值将不正确。我不确定是否有一个“真正的”解决方案...... (2认同)
  • @Mala执行之前:**FLUSH TABLES WITH READ LOCK;**执行后:**UNLOCK TABLES;** (2认同)

Nic*_*k D 15

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

@kantholy显然有最好的答案.

@AmitP的方法将所有结构转储data到a file,然后转到最后的drop/create table 语句.import在破坏之前,生成的文件仍然需要您访问所有不需要的数据.

@ kantholy的方法首先转储所有结构,然后只datatable你不要忽略.这意味着您的后续人员import不必花时间去import处理data您不想要的所有内容- 尤其重要的是,如果data您想要忽略大量的时间以节省时间.

总结一下,最有效的答案是:

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
Run Code Online (Sandbox Code Playgroud)

  • 我很困惑,你在这个Q&A中添加了什么?这里没有50个答案需要通过另一个答案进行总结.有3个答案,其中两个非常相似,任何登陆此处寻找解决方案的人都可以轻松阅读.你不能评论太糟糕了,但说实话,即使你可以,这甚至不属于评论.它只是增加了噪音. (4认同)

Mar*_*c B 10

根据mysqldump文档:

mysqldump name_of_db --ignore-table=name_of_db.name_of_table
Run Code Online (Sandbox Code Playgroud)

  • 是的,所以导出所有数据,存储所有数据,导入所有数据,然后只删除.排除的奇怪定义. (19认同)
  • 这个答案实际上没有做OP所要求的(即转储所有表的结构但跳过一个表的数据) (11认同)
  • 只有数据被忽略,我需要结构 (8认同)
  • 是的不是所要求的,我喜欢AmitP的答案,因为它可以在一个命令中使用并导致一个文件 (4认同)
  • 然后执行一个只有结构的转储(`--no-data`),然后另一个转储跳过结构,但转储并跳过你不需要的表.或者你只是在全局转储的末尾添加一些`delete from ...`查询来删除表中的数据. (3认同)

mii*_*le7 9

mysqldumpMariaDB 10.1 或更高版本中,您可以使用--ignore-table-data

mysqldump --ignore-table-data="db_name.table" db_name > export.sql
Run Code Online (Sandbox Code Playgroud)

对于多个表重复该--ignore-table-data选项:

mysqldump --ignore-table-data="db_name.table_1" --ignore-table-data="db_name.table_2" db_name > export.sql
Run Code Online (Sandbox Code Playgroud)

来自MariaDBmysqldump文档

--忽略表数据=名称

不转储指定的表数据(仅转储结构)。要指定多个要忽略的表,请多次使用该指令,每个表一次。每个表都必须指定数据库名称和表名称。从 MariaDB 10.1.46、MariaDB 10.2.33、MariaDB 10.3.24、MariaDB 10.4.14 和 MariaDB 10.5.3 开始。另请参见--无数据。