mysqldump - 排除一些表数据

问题描述 投票:0回答:10

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

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

如果可以的话,是如何做到的?

mysql database database-schema dump database-dump
10个回答
146
投票

这将生成export.sql,其中包含所有表的结构和除table_name之外的所有表的数据

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

82
投票

我认为 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

19
投票

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

@kantholy 显然有最好的答案。

@AmitP 的方法将所有结构和

data
转储到
file
,然后在末尾转储
drop/create table
语句。生成的文件仍然需要您
import
所有不需要的数据,然后再简单地销毁它。

@kantholy 的方法首先转储所有 struct,然后仅转储

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

13
投票

根据 mysqldump 文档

mysqldump name_of_db --ignore-table=name_of_db.name_of_table

9
投票

在 MariaDB 10.1 或更高版本的

mysqldump
中,您可以使用
--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

来自 MariaDB

mysqldump
文档

--忽略表数据=名称

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


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
其他内容


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

因此获得您想要的内容的良好备份,并知道失败的内容(如果有):-)


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"

1
投票

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

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

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.