62

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

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

如果这是可能的,它是如何完成的?

4

10 回答 10

132

这将生成export.sql,其结构来自所有表和所有表中的数据,不包括table_name

mysqldump --ignore-table=db_name.table_name db_name > export.sql
mysqldump --no-data db_name table_name >> export.sql
于 2015-04-07T15:10:05.327 回答
68

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

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

如果要排除超过 1 个表,只需--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
于 2015-11-18T12:56:06.723 回答
16

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

@kantholy 显然有最好的答案。

@AmitP 的方法将所有结构转储data到 a file,然后是最后的drop/create table 语句。生成的文件仍然需要您import在简单地销毁它之前处理所有不需要的数据。

@kantholy 的方法首先转储所有结构,然后仅data用于table您不忽略的结构。这意味着您的后续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
于 2016-03-31T04:24:10.290 回答
12

根据mysqldump 文档

mysqldump name_of_db --ignore-table=name_of_db.name_of_table
于 2012-11-27T21:17:31.183 回答
5

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

mysqldump --ignore-table-data="db_name.table" db_name > export.sql

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

mysqldump --ignore-table-data="db_name.table_1" --ignore-table-data="db_name.table_2" db_name > export.sql

来自MariaDBmysqldump文档

--忽略表数据=名称

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

于 2021-07-07T10:25:47.277 回答
3

以前的答案没有解决AUTO_INCREMENT我们导出结构时的问题,也没有显示如何导出表中的某些特定数据。

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

1/ 导出结构

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

我尝试使用--skip-opt重置选项,AUTO_INCREMENT但这也删除AUTO_INCREMENT了字段上的定义,CHARSET以及其他内容

于 2019-04-30T08:39:57.117 回答
2

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

原理是使用grep -v过滤掉INSERT INTO

mysqldump name_of_db | grep -v 'INSERT INTO \`name_of_table\` VALUES'

或者

mysqldump name_of_db | grep -v 'INSERT INTO \`name_of_db\`.\`name_of_table\` VALUES'

您可以轻松进入 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

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

于 2018-11-22T08:14:17.283 回答
2

为了进一步改进kantholy 的答案,添加压缩并通过不写入未压缩的数据来删除大部分磁盘写入:

#!/bin/bash
echo -n "db name:"
read -r db_name
echo -n "username:"
read -r username
echo -n "Exclude data from table:"
read -r exclude_table_data

{
 mysqldump "$db_name" --user="$username" --password --no-tablespaces --no-data \
 && \
 mysqldump "$db_name" --user="$username" --password --no-tablespaces --no-create-info \
 --ignore-table="${db_name}.${exclude_table_data}";
} \
| bzip2 -c9 \
> "${db_name}_$(date +%y%m%d_%H%M).sql.bz2"
于 2020-11-16T14:17:30.000 回答
0

在我看来,最好的答案来自 Steak,这是唯一真正适用于任何情况的答案。

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

正如许多人在上面指出的那样,您可能会遇到序列问题。

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

于 2019-08-13T15:53:45.547 回答
0

以下命令将导出数据库结构并忽略数据

mysqldump --no-data --databases -u[db_user] -p[db_password] [schema] > File.sql

然后导出忽略表格的数据

mysqldump --ignore-table=[schema.table_name] --databases -u[db_user] -p[db_password] [schema] >> File.sql

于 2022-02-24T06:23:03.690 回答