地球上的大熊, 巧遇上火星的你

[經驗分享]MySQL資料快速轉移到另一台主機 - Linux下適用

@ 2013-3-4 04:10 PM

這方法不需要temp file,可以同時dump,zip,send&import,

問題是不支持resume,如果中途斷線…就需要重來。

@Receiver (先執行這裡,Receiver的nc必須先啟動)

nc -l {port} -v | gzip -d -c | mysql {db} -u{user} -p
@Sender

mysqldump {db} -u{user} -p | gzip | nc {ip of Receiver} {port}
FAQ:

1. nc (netcat) 安裝

yum install nc
2. 查看進度 (估計值)

a)傳送前先到Sender執行下面的sql...並記下要傳的db size是多少。

b)傳送中…在Receiver執行下面的sql...用來查看已import的資料有多大

查看db size SQL:

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024
"Data Base Size in MB" FROM information_schema.TABLES GROUP BY table_schema ;
另外,如果你的db是MyISAM你也可以用(如果是innoDB, 則需要開啟innodb_file_per_table)

du -h /var/lib/mysql/{db}
來查看Sender & Receiver現在的data size而估計進度

6 評論

如果資料庫很大…而且網絡慢/不穩…上面的方法可能不適用。

建議

1)直接tar整個/var/lib/mysql/{db} 或者 mysqldump整個db…

2)用rsync(支持resume)來傳出去

rsync -P --rsh=ssh {user}@{host}:{remote_file} {local_file}
-P: same as "--partial --progress"

3)之後再untar 或者 mysql {db} -u{user} -p < dump.sql

發佈者 : Vic 等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32  @ 2013-3-4 11:32 PM

以前有個案子 舊機房在內湖 新辦公大樓新機房 在南港
雖然他們自己有搞 VPN, 兩邊都是用 LAN IP
為了要即時同步兩邊資料
本來是想互相 同時當 master and slave
please google "MySQL master slave"
結果 可能是 OS是 MS-Win的關係?
只有 Master資料會往 slave丟, slave的東西丟不回來
搞好久,最後放棄

上面這方式 似乎是把master MySQL做的事情 寫成一個 log file, 丟給 slave去執行
所以,只要 start slave之前 確認兩邊資料都一樣,後面應該就不用理他
應該還蠻方便的
可惜 我還需要反向同步
如果只有單向同步(備份?)需求的 可以參考看看

如果不是需要很即時的同步
我是都直接stop mysqld
趕緊先 copy到別的資料夾後
再趕緊 start mysqld
然後把 copy的資料夾  tar/zip起來
用 rsync/ftp/sftp/UVNC丟到另一邊 再解開
另一邊當然也是要 stop mysqld之後, copy進去 再重新 start mysqld

發佈者 : innova 等級: 14等級: 14等級: 14等級: 14  @ 2013-3-5 02:01 AM

熊上面提到的2種方面都是做一次性轉移…之後的資料並不會自動同步。

如innova兄所言

如果需要2(n)台主機同步…可以用master-slave(master可讀寫,slave只可讀)replication…

參考文章:
http://blog.longwin.com.tw/2008/ ... ter_slave_set_2008/


引用:
innova寫到:
只有 Master資料會往 slave丟, slave的東西丟不回來


如果想2台都可以同時讀寫…就需要所謂master-master replication(mysql官方並不支援…是人們弄出來的)

參考文章:
http://blog.longwin.com.tw/2008/ ... ger-mmm-intro-2008/
http://blog.wu-boy.com/2008/12/m ... %E5%90%8C%E6%AD%A5/

發佈者 : Vic 等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32  @ 2013-3-5 08:49 AM

我那時候 只有兩台 需要同步
所以 我兩邊都設成 master, 同時也都設 slave
想說 兩邊都是master, 兩邊也都是 slave...
這樣 資料可以雙向同步
忘記在哪邊查到 有人這樣搞 有搞成功的樣子
不過 我兩邊都是 MS-OS
搞到最後 火大了 就不爽try了
... 反正 db也不是我在維護 XD

發佈者 : innova 等級: 14等級: 14等級: 14等級: 14  @ 2013-3-6 12:22 AM

Master-master的原理好像就是這樣…熊沒有真的做過…所以也不是很清楚。

發佈者 : Vic 等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32  @ 2013-3-6 05:54 AM

innova網友提的是dual master架構
前陣子剛剛實作, 分享一下心得

基本上兩邊作replication 可以選擇
master-slave 和 dual master

不過dual master的架構並不是兩邊都開放寫
比方說, 我們在a和b各有一台DB, 我們讓 甲群使用者寫a, 乙群使用者寫b
我們另外用mysql proxy來監控兩邊狀態.
這時候雖然兩邊似乎都在寫, 但是寫到b的資料卻是透過mysql proxy寫到a, 而b就有點像是slave, 會去跟a的binlog
這樣雖然看似是master-slave架構, 但是如果a掛了, mysql proxy就會通知b接手
這樣就可以完成redundant.

當然也可以單純兩邊設master並且開啟binlog讓對方跟
不過如果在table中有auto increment 的話, 因為兩邊跟會有網路延時的時間差
大量寫入的狀況下應該會有點風險
這時候可以能要用比較特殊的方法來避開風險
這部分我就沒有實作過 不過有google到相關文章可以參考

[monkle 在  2013-3-7 02:35 AM 作了最後編輯]

發佈者 : monkle 等級: 3等級: 3  @ 2013-3-7 02:28 AM

   


  可打印版本 | 推薦給朋友 | 評分