2010-10-22 77 views
3

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

--no数据

- 忽略表

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

编辑:

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

+0

注:你不能带*号多用 - 忽略表*数据库。您可能会认为,因为您在交换机中指定了数据库和表,您可以在多数据库转储中使用它,但您会得到“无法找到表” – 2013-05-22 21:53:38

回答

4

如何运行两个不同的电话mysqldump?一个用于创建数据库并忽略不需要数据的表。另一个只创建没有数据的其余表。您可以分别运行这两个脚本,或者将它们连接在一起以创建最终脚本。

+0

这是一个不错的主意,现在仍然留意其他解决方案 – 2010-10-22 18:38:17

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

您的示例不明确,表1-3假设将他们的数据包括在内或排除在外(我假设前者)?另外,只是为了仔细检查,我仍然会得到创建表语句等所有其他表不在该列表中? – 2010-10-22 18:35:11

+0

@Stephen,看看可用于mysqldump的开关 – 2010-10-22 19:05:39

+0

我有,但有很多,我找不到我在找什么。但是从我在文档中可以看到,您的示例将完全排除除table1-3以外的所有表,这不是我想要执行的操作。 – 2010-10-22 19:13:25

0

你可能会发现你所需要的是什么:

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

使用,语句可能是最简单的方法实现你正在尝试做的事情。

+0

不幸的是,它看起来像where语句适用于所有正在转储的表。 – 2010-10-22 18:34:43

+0

我认为这可能实际上派上用场,因为我需要做的另一件事是限制某些表导出的数据。正如@Don指出的那样,这适用于所有正在转储的表,但我可以将mysqldump调用同时锁定在一个表中,以获得所需的结果。 – 2010-10-22 20:33:31

2

还有一个选项可以完成所有工作(在mysql本身的单个调用中),但它可能永远不会尝试。

在致敬H.P.洛夫克拉夫特(以及基于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发泄肯定得救

相关问题