4

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

- 没有数据

--忽略表

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

编辑:

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

4

4 回答 4

4

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

于 2010-10-22T18:36:44.307 回答
2

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

为了向 HP Lovecraft 致敬,(并基于Anuya存储过程来创建 INSERT 语句)这里是不得调用的存储过程

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

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造成的令人痛苦的恐怖......

于 2010-10-22T20:03:56.830 回答
0
mysqldump -u user -h host.example.com -p database table1 table2 table3
于 2010-10-22T18:29:42.790 回答
0

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

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

使用 where 语句可能是实现您想要做的最简单的方法。

于 2010-10-22T18:30:02.693 回答