2010-10-22 31 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發泄肯定得救

相關問題