2009-12-16 137 views
3

我有兩個mysql數據庫具有幾乎相同的結構和代表相同的Web應用程序的數據,但其中一個代表當前版本,第二個是很久以前。mysqldump表名前綴

如何創建數據庫,其中既有內部轉儲,也有old_前綴,用於來自第二個數據庫的表的first和new_前綴的表?

是否有任何mysqldump選項來設置前綴或其他解決方案?

回答

1
  1. 還原兩個數據庫原樣。
  2. 使用以下存儲過程在添加前綴後將所有表從一個DB移動到另一個DB。
  3. 移動後刪除源數據庫。

此存儲過程從information_schema中的MySQL的內存表中獲取表列表,並使用RENAME命令自動移動到另一個數據庫。

DELIMITER $$ 

USE `db`$$ 

DROP PROCEDURE IF EXISTS `renameDbTables`$$ 

CREATE DEFINER=`db`@`%` PROCEDURE `renameDbTables`(
    IN from_db VARCHAR(20), 
    IN to_db VARCHAR(30), 
    IN to_name_prefix VARCHAR(20) 
) 
BEGIN 
/* 
call db.renameDbTables('db1','db2','db_'); 
db1.xxx will be renamed to db2.db_xxx 
*/ 
    DECLARE from_state_table VARCHAR(20) DEFAULT ''; 
    DECLARE done INT DEFAULT 0; 
    DECLARE b VARCHAR(255) DEFAULT ''; 
    DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES 
     WHERE TABLE_SCHEMA=from_db; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

    OPEN cur1; 

    REPEAT 
     FETCH cur1 INTO from_state_table; 
     IF NOT done THEN 
--   select from_state_table; 
      SET @QUERY = ''; 
      SET @QUERY = CONCAT(@QUERY,'RENAME TABLE ',from_db,'.', from_state_table,' TO ',to_db,'.', to_name_prefix, from_state_table,';'); 
--   SELECT @query; 
      PREPARE s FROM @QUERY; 
      EXECUTE s; 
      DEALLOCATE PREPARE s; 
     END IF; 
    UNTIL done END REPEAT; 
    CLOSE cur1; 
    END$$ 

DELIMITER ; 
0

將它們導入到不同的數據庫中。說他們叫newdbolddb。然後,你可以複製表1到old_table1,如:

insert into newdb.old_table1 
select * 
from olddb.table1 

如果你有表的一個巨大的數字,生成一個腳本來複制它們:

select concat('insert into newdb.old_', table_name, 
    'select * from olddb.', table_name, ';') 
from information_schema.tables 
where table_schema = 'olddb' 
+0

如果表的約束取決於表還沒有被複制,那麼它是行不通的 – 2015-07-28 08:07:54

1

A「mysqldump檔案」只是一個文本文件的完整的SQL語句,因此您可以在文本編輯器中進行類似的快速修改。

1)分別轉儲兩個數據庫。

2)編輯「舊」轉儲文件:

  • 添加正確的use mydatabase;
  • 做搜索和替換在表名前加old_

3)然後,cat dump1 dump2 > combined_dump

4)mysql < combined_dump

+1

+1這些文件可能非常大,但是,請確保使用像樣的文本編輯器(例如notepad ++)來進行更改。另一種方法是對一個轉儲使用'--no-data'標誌,對另一個轉儲使用'--no-create-info'。這會給你一個更小的文件來進行初始編輯,並讓你確保你正在創建你想要的。請確保更改第二個文件表的名稱,否則最終可能會將舊文件的內容放入新文件的表中。 – aronchick 2009-12-16 20:05:06

+0

@aronchick +1關於bigness。一些編輯器在遇到幾兆字節的行時(絕對數據在mysqldump文件中是一個巨大的插入語句,全部在一行上)時,絕對會發生崩潰和燒燬。 – Seth 2009-12-16 21:15:48

0

我已經做了,在過去使用mysqldumpsed以下,但我承認它可能只爲一個表是有效的在時間。

$ mysqldump -u user --password=mypass MyDB MyTable | sed s/MyTable/old_Mytable/ | mysql -u other_user -p NewDB 

您可以創建一個shell腳本的命令,每個表一個,或者其他用戶的方式來修改這個打擊多個表有效一次拍攝工作的列表。

同伴

0

我可能誤解了問題,但它聽起來像你想的2個數據庫轉儲到一個SQL文件被用來恢復DBS,與舊錶進入一個模式和新表進入另一個。

如果您正在嘗試這麼做,最簡單的方法就是在每次轉儲之前插入正確的「use database」命令。

像這樣:

echo "use old_db;" > /tmp/combined_dump.sql 
mysqldump old_db >> /tmp/combined_dump.sql 
echo "use new_db;" >> /tmp/combined_dump.sql 
mysqldump new_db >> /tmp/combined_dump.sql 
2

這sed腳本也許是一個小更安全。將其保存到一個文件並使用sed -f篩選轉儲文件。

s/\(-- Table structure for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(DROP TABLE IF EXISTS `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(CREATE TABLE `\)\([^`]\+\)\(` (\)/\1xyzzy_\2\3/ 
s/\(-- Dumping data for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` DISABLE KEYS \*\/\)/\1xyzzy_\2\3/ 
s/\(LOCK TABLES `\)\([^`]\+\)\(` WRITE\)/\1xyzzy_\2\3/ 
s/\(INSERT INTO `\)\([^`]\+\)\(` VALUES (\)/\1xyzzy_\2\3/ 
s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` ENABLE KEYS \*\/\)/\1xyzzy_\2\3/ 

搜索並用您想要的表前綴替換xyzzy_。

+0

這是不夠的;你必須處理約束 – 2015-07-28 08:06:03