2010-04-20 99 views
1

如果我在一個活動服務器上有一個帶有多個表的MySQL數據庫,現在我想將這個數據庫遷移到另一個服務器。當然,我的意思是這裏的遷移涉及到一些數據庫表格,例如:爲幾個表格添加一些新列,添加一些新表格等等。現在,我能想到的唯一方法是使用一些php/python(兩個我知道的腳本)腳本,連接兩個數據庫,從舊數據庫轉儲數據,然後寫入新數據庫。但是,這種方法根本沒有效率。例如:在舊數據庫中,表A有28列;在新的數據庫中,表A有29列,但對於所有舊行,額外列的默認值爲0。我的腳本仍然需要逐行轉儲數據,並將每行插入到新數據庫中。關於MySQL數據庫遷移的問題

使用MySQLDump等..將無法正常工作。這是細節。例如:我有四個舊數據庫,我可以將它們命名爲'DB_a','DB_b','DB_c','DB_d'。現在舊錶A有28列,我想用新的列ID'DB_x'(x來表示它來自哪個數據庫)將表A中的每一行添加到新數據庫中。如果我無法通過行的內容區分數據庫ID,唯一可以識別它們的方法是通過一些用戶輸入參數。

有沒有比自己編寫腳本更好的工具或更好的方法?在這裏,我不需要擔心多線程寫入問題等。我的意思是舊的數據庫將關閉(不公開使用等,僅用於升級)一段時間。

謝謝!

回答

1

我不完全理解你的情況與列(遷移後添加任何新列不是更明智嗎?),但跨服務器複製數據庫的最快速的方法之一是mysqlhotcopy。它只能複製myISAM並具有許多其他要求,但速度非常快,因爲它完全跳過了創建轉儲/導入轉儲步驟。

+0

好吧,轉儲數據然後更改模式在這裏不起作用。實際情況是:我需要將當前4個數據庫合併爲1個。我將更詳細地修改我的問題。 – WilliamLou 2010-04-20 21:42:07

0

當然有些工具可以幫助你實現你想要做的事情。 Mysqldump是這類工具的首要例子。只要看看這裏一目瞭然: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

你可以做的是:

1)你使當前數據庫的轉儲,使用mysqldump(使用--no-data選項),只取架構

2)你改變你有傾倒的模式,添加新列

3)創建了新的架構(MySQL的< dump.sql - 只是谷歌的的MySQL備份的語法恢復更多的幫助)

4)使用mysqldump的完整,插入選項轉儲數據(見上面的鏈接)

5)導入數據,請用mysql < data.sql

這應該爲你做的工作,好運氣!

0

使用mysqldump轉儲數據,然後echo output.txt > msyql。現在舊數據位於新服務器上。必要時操作。

1

通常,當您將數據庫遷移到新服務器時,由於您現在運行的原因,您不會同時應用一堆模式更改。

MySQL有一個名爲mysqldump的轉儲工具,可用於輕鬆地進行數據庫的快照/備份。然後可以將快照複製到新服務器並安裝。

您應該計算出對「新」數據庫所做的所有更改,並寫出一個腳本,其中包含將舊數據庫「升級」爲所用新版本所需的所有SQL命令例如ALTER TABLE a ADD COLUMN x等)。在確定它正在工作之後,請轉儲舊的,複製它,安裝它,然後應用您的更改腳本。

0

增加額外行可在活動數據庫上進行:

ALTER TABLE [table-name] ADD [row-name] MEDIUMINT(8) default 0; 

MySQL將默認情況下所有現有的行爲默認值。

因此,這裏是我會做什麼:

  1. 進行復印的你是舊的數據庫與MySql dump命令。

  2. 針對你運行生成的SQL文件是新數據庫,現在你有一個確切的副本。

  3. 編寫migration.sql文件,該文件將修改您的數據庫修改表命令和複雜的轉換一些臨時的MySql過程。

  4. 測試你的腳本(失敗時,轉到(2))。

  5. 如果一切正常,然後轉到(1),並與您同時是新的數據庫。

0

這些都是有效的方法,但我相信你想寫一個sql語句,寫其他插入語句,支持你有新的列。