Mysql

如何將表從 MySqlServer_A 複製到 MySqlServer_B?

  • March 8, 2018

我有一個日常任務從 3 個 MySql 伺服器收集數據,然後將聚合數據推送回每個伺服器,刪除前幾天的數據。所有伺服器都是MySql。我想把它放到一個儲存過程中。

我一直在尋找一種從一個 MySql 伺服器連接到另一個伺服器、執行查詢、下一個伺服器的方法 - 沖洗並重複。除了沒有找到連接到另一個 MySql 伺服器的儲存過程的任何範例之外,我的直接印像是這不是真正可以接受的,也不是有意的。

我可以選擇一個創建 CSV 的輸出文件。有沒有辦法強制使用 Xml 文件?我不想為了獲取 Xml 而讀入數據表。當然,Xml 不能與 Bulkload 方法一起使用,不是嗎?

我有哪些現實的選擇?選擇到 outfile 的一個問題是使用奇怪的字元:' , \ \\ & @ `` / //等等……這些字元將如何影響 Bulkload 過程?

由於三 (3) 個原因,我傾向於迴避 FEDERATED 儲存引擎:

  1. 它只支持 MyISAM
  2. 在源表上執行的 DDL 需要手動更改外部服務上的 FEDERATED 表設計。
  3. 針對 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,然後執行與前面提到的類似操作。確保在複製期間沒有對錶進行寫入。

引用自:https://dba.stackexchange.com/questions/3071