如何將表從 MySqlServer_A 複製到 MySqlServer_B?
我有一個日常任務從 3 個 MySql 伺服器收集數據,然後將聚合數據推送回每個伺服器,刪除前幾天的數據。所有伺服器都是MySql。我想把它放到一個儲存過程中。
我一直在尋找一種從一個 MySql 伺服器連接到另一個伺服器、執行查詢、下一個伺服器的方法 - 沖洗並重複。除了沒有找到連接到另一個 MySql 伺服器的儲存過程的任何範例之外,我的直接印像是這不是真正可以接受的,也不是有意的。
我可以選擇一個創建 CSV 的輸出文件。有沒有辦法強制使用 Xml 文件?我不想為了獲取 Xml 而讀入數據表。當然,Xml 不能與 Bulkload 方法一起使用,不是嗎?
我有哪些現實的選擇?選擇到 outfile 的一個問題是使用奇怪的字元:
' , \ \\ & @ `` / //
等等……這些字元將如何影響 Bulkload 過程?
由於三 (3) 個原因,我傾向於迴避 FEDERATED 儲存引擎:
- 它只支持 MyISAM
- 在源表上執行的 DDL 需要手動更改外部服務上的 FEDERATED 表設計。
- 針對 FEDERATED 表的批量操作可能會立即成為可怕的事情!!!
該怎麼辦 ???
一種可能性是使用 mysqldump 並合併它們
範例
假設所有表具有相同的結構
假設所有表不使用 auto_increment ID
假設所有表都是 InnoDB
在將合併三個表的伺服器上,創建四 (4) 個導入數據庫(一次操作):
CREATE DATABASE ImportDB1; CREATE DATABASE ImportDB2; CREATE DATABASE ImportDB3; CREATE DATABASE ImportCombined;
導入過程是這樣的
mysqldump 三(3)張表
mysqldump -hHOSTIP1 -Pportnumber1 -u... -p... dbname tbname > /root/ImportTable1.sql & mysqldump -hHOSTIP2 -Pportnumber2 -u... -p... dbname tbname > /root/ImportTable2.sql & mysqldump -hHOSTIP3 -Pportnumber3 -u... -p... dbname tbname > /root/ImportTable3.sql & wait
將 mysqldump 並行載入到單獨的導入數據庫中:
mysql -hHOSTIP4 -u... -p... -A -DImportDB1 < /root/ImportTable1.sql & mysql -hHOSTIP4 -u... -p... -A -DImportDB2 < /root/ImportTable2.sql & mysql -hHOSTIP4 -u... -p... -A -DImportDB3 < /root/ImportTable3.sql & wait rm -f /root/ImportTable1.sql & rm -f /root/ImportTable2.sql & rm -f /root/ImportTable3.sql & wait
接下來,合併數據。
DROP TABLE IF EXISTS ImportCombined.tbname; CREATE TABLE ImportCombined.tbname LIKE ImportDB1.tbname; ALTER TABLE ImportCombined.tbname DISABLE KEYS; INSERT INTO ImportCombined.tbname SELECT * FROM ImportDB1.tbname; INSERT INTO ImportCombined.tbname SELECT * FROM ImportDB2.tbname; INSERT INTO ImportCombined.tbname SELECT * FROM ImportDB3.tbname; ALTER TABLE ImportCombined.tbname ENABLE KEYS; ALTER TABLE ImportCombined.tbname ENABLE KEYS;
現在,針對 ImportCombined.tbname 表執行您已有的任務。
“你填寫這些步驟”
然後,當表準備好導出時,mysqldump 並複制 2 次:
mysqldump -hHOSTIP4 -Pportnumber4 -u... -p... ImportCombined tbname > /root/ExportTable1.sql cp /root/ExportTable1.sql /root/ExportTable2.sql & cp /root/ExportTable1.sql /root/ExportTable3.sql & mysql -hHOSTIP1 -Pportnumber1 -u... -p... -A -Ddbname < /root/ExportTable1.sql & mysql -hHOSTIP2 -Pportnumber2 -u... -p... -A -Ddbname < /root/ExportTable2.sql & mysql -hHOSTIP3 -Pportnumber3 -u... -p... -A -Ddbname < /root/ExportTable3.sql & wait rm -f /root/ExportTable[123].sql &
從這些步驟中可以看出,這些東西應該是 shell 腳本,也許是 crontab。
這是另一個策略:如果表是 MyISAM,您可以將 MyISAM 表(每個表的 .frm、.MYD 和 .MYI 文件)複製到其他文件夾(mysqld 眼中的數據庫)中,而不是執行 mysqldumps,然後執行與前面提到的類似操作。確保在複製期間沒有對錶進行寫入。