是否可以,使用 mysql dump 导出整个数据库结构,但从导出中排除某些表数据。
假设数据库有 200 个表,我希望导出所有 200 个表的结构,但我想忽略 5 个特定表的数据。
如果这是可能的,它是如何完成的?
是否可以,使用 mysql dump 导出整个数据库结构,但从导出中排除某些表数据。
假设数据库有 200 个表,我希望导出所有 200 个表的结构,但我想忽略 5 个特定表的数据。
如果这是可能的,它是如何完成的?
这将生成export.sql,其结构来自所有表和所有表中的数据,不包括table_name
mysqldump --ignore-table=db_name.table_name db_name > export.sql
mysqldump --no-data db_name table_name >> export.sql
我认为 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
我是新用户,没有足够的声誉来投票或评论答案,所以我只是将其作为答案分享。
@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
根据mysqldump 文档:
mysqldump name_of_db --ignore-table=name_of_db.name_of_table
在mysqldump
MariaDB 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
--忽略表数据=名称
不要转储指定的表数据(仅转储结构)。要指定要忽略的多个表,请多次使用该指令,每个表一次。每个表都必须指定数据库和表名。从 MariaDB 10.1.46、MariaDB 10.2.33、MariaDB 10.3.24、MariaDB 10.4.14 和 MariaDB 10.5.3。另请参见 --no-data。
以前的答案没有解决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
以及其他内容
我使用的另一种可能性是避免将数据插入所需表的行。
原理是使用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
因此可以很好地备份您想要的内容,并知道失败的原因(如果有的话):-)
为了进一步改进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"
在我看来,最好的答案来自 Steak,这是唯一真正适用于任何情况的答案。
所有暗示两个转储的答案都是错误的,或者至少它们可以在某些前提下工作。
正如许多人在上面指出的那样,您可能会遇到序列问题。
但我发现更关键的是,数据库可以具有验证或处理信息的触发器(假设在表 A 上插入记录时在表 B 上插入记录的触发器)——在这种情况下,创建完整模式(包括触发器)的顺序,然后插入数据将创建一组不同的结果。
以下命令将导出数据库结构并忽略数据
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