如何排除特定表的数据

时间:2010-10-22 18:27:18

标签: mysql database mysqldump database-backups

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

- 无数据

- 忽略表

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

编辑:

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

还有另外一个选项可以完成所有工作(只需一次调用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发出的令人痛苦的恐惧中得救了。

答案 2 :(得分:0)

mysqldump -u user -h host.example.com -p database table1 table2 table3

答案 3 :(得分:0)

您可以在这里找到所需内容:

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

使用where语句可能是实现您尝试的最简单方法。