mysql dump - 排除一些表数据

时间:2012-11-27 21:12:07

标签: mysql

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

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

如果可以的话,怎么做?

9 个答案:

答案 0 :(得分:84)

这将生成带有来自所有表的结构的export.sql以及除table_name

之外的所有表中的数据
mysqldump --ignore-table=db_name.table_name db_name > export.sql
mysqldump --no-data db_name table_name >> export.sql

答案 1 :(得分:41)

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

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 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

答案 2 :(得分:15)

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

@kantholy显然有最好的答案。

@ AmitP的方法将所有结构和data转储到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

答案 3 :(得分:10)

根据mysqldump docs

mysqldump name_of_db --ignore-table=name_of_db.name_of_table

答案 4 :(得分:2)

在 MariaDB 10.1 或更高版本的 merge(merge(df1, transform(df2, start_time_price = Price)[-1], by.x = 'starttime', by.y = 'date_time'), transform(df2, end_time_price = Price)[-1], by.x = c('ID', 'endtime'), by.y = c('ID', 'date_time')) 中,您可以使用 mysqldump

--ignore-table-data

来自MariaDB mysqldump docs

<块引用>

--ignore-table-data=name

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

答案 5 :(得分:0)

我使用的另一种可能性是避免行将数据插入到想要的表中。

原理是使用 grep -v

过滤掉 INSERT INTO
public function __construct($db, $tcpdf, $renderer)
{
    $this->db = $db;
    $this->tcpdf = $tcpdf;
    $this->renderer = $renderer;
    ...
}

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

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

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

因此可以很好地备份您想要的内容,并知道失败的地方:-)

答案 6 :(得分:0)

先前的答案在导出结构时并没有解决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_INCREMENTother things上的CHARSET定义

答案 7 :(得分:0)

我认为最好的答案来自牛排,这是在任何情况下都有效的唯一答案。

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

如上文所述,您可能会遇到序列问题。

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

答案 8 :(得分:0)

要进一步改进kantholy's answer,请增加压缩率,并通过不写入未压缩的数据来删除大部分磁盘写操作:

#!/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"