【问题标题】:How to Exclude Data for Specific Tables如何排除特定表的数据
【发布时间】:2011-04-29 07:49:33
【问题描述】:

我正在使用 mysqldump 为 MySQL 数据库创建规范的安装脚本。我想转储数据库中一半表的数据,但排除其他表中的数据。我知道以下两个命令:

--无数据

--忽略表

但第一个适用于所有表,我相信第二个将表完全从转储中排除(例如 create 语句),而不仅仅是表中的数据。有人知道如何使用 mysqldump 来实现我的目标吗?

编辑:

发现一个几乎重复的问题:mysqldump entire structure but only data from selected tables in a single command

【问题讨论】:

  • 注意:您不能将 --ignore-table 与 multiple 数据库一起使用。你可能会想,因为你在 switch 中指定了 db 和 table,你可以在多数据库转储上使用它,但是你会得到 "Couldn't find table"

标签: mysql database mysqldump database-backups


【解决方案1】:
mysqldump -u user -h host.example.com -p database table1 table2 table3

【讨论】:

  • 您的示例不清楚,表 1-3 是否假设在此处包含或排除其数据(我假设前者)?另外,只是为了仔细检查,对于不在该列表中的所有其他表,我还会获得创建表语句等吗?
  • @Stephen,看看mysqldump可用的开关
  • 我有,但其中有很多,我找不到我要找的东西。但是从我在文档中可以看到,您的示例将完全排除除 table1-3 之外的所有表,这不是我想要做的。
  • 表列表不排除而是包含它们,并且将它们从转储中完全删除,而不仅仅是它们的数据离开要转储的结构。这个答案基本没用。
【解决方案2】:

你可能会在这里找到你需要的东西:

http://www.electrictoolbox.com/mysqldump-selectively-dump-data/

使用 where 语句可能是实现目标的最简单方法。

【讨论】:

  • 不幸的是,看起来 where 语句适用于所有被转储的表。
  • 我认为这实际上可能对我需要做的另一件事派上用场,即限制为某些表导出的数据。正如@Don 指出的那样,这适用于所有被转储的表,但我可以将 mysqldump 调用链接在一起,一次针对一个表,以获得所需的结果。
【解决方案3】:

分别对mysqldump 进行两次调用怎么样?一种用于创建数据库并忽略您不希望从中获取数据的表。另一个只创建没有数据的剩余表。您可以单独运行这两个脚本,也可以将它们连接在一起以创建最终脚本。

【讨论】:

  • 这是个好主意,我现在仍会留意其他解决方案
【解决方案4】:

还有另一种选择可以完成所有事情(只需一次调用 mysql 本身),但可能永远不应该尝试。

向 H.P. Lovecraft,(基于Anuyastored procedure to create INSERT statements)这里是不能被调用的存储过程

注意:这个邪恶的、神秘的存储过程只能由疯子运行,下面仅出于教育目的。

DELIMITER $$
DROP PROCEDURE IF EXISTS `pseudoDump` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pseudoDump`(
  in_db varchar(20),
  in_tables varchar(200),
  in_data_tables varchar(200)
)
BEGIN
DECLARE Whrs varchar(500);
DECLARE Sels varchar(500);
DECLARE Inserts varchar(200);
DECLARE tablename varchar(20);
DECLARE ColName varchar(20);
SELECT `information_schema`.`TABLE_NAME` INTO tablename FROM TABLES WHERE TABLE_SCHEMA = in_db AND TABLE_NAME IN ( in_tables );
tabdumploop: LOOP
  SHOW CREATE TABLE tablename;
  LEAVE tabdumploop;
END LOOP tabdumploop;
SELECT `information_schema`.`TABLE_NAME` INTO tablename FROM TABLES WHERE TABLE_SCHEMA = in_db ;
datdumploop: LOOP
  SELECT group_concat(concat('concat(\'"\',','ifnull(',column_name,','''')',',\'"\')')) INTO @Sels from `information_schema`.`COLUMNS` where table_schema=in_db and table_name=tablename;
  SELECT group_concat('`',column_name,'`') INTO @Whrs from `information_schema`.`COLUMNS` where table_schema=in_db and table_name=tablename;
  SET @Inserts=concat("select concat('insert IGNORE into ", in_db,".",tablename," values(',concat_ws(',',",@Sels,"),');') as MyColumn from ", in_db,".",tablename, " where 1 group by ",@Whrs, ";");
  PREPARE Inserts FROM @Inserts;
  EXECUTE Inserts;
  LEAVE datdumploop;
END LOOP datdumploop;
END $$
DELIMITER ;

...谢天谢地,MySQL Bug #44009...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多