2017年注会音频:Replication in MySQL

来源:百度文库 编辑:中财网 时间:2024/04/28 14:15:46
Replication in MySQL
MySQL 在 3.23.29 版以後, 已提供了資料覆寫 (Replication) 功能, 設定的方法很簡單:
※範例環境說明:
Linux OS MySQL 資料庫路徑: /var/lib/mysql MySQL 設定檔: /etc/my.cnf Master IP: 192.168.1.1 Slave IP: 192.168.1.2 要進行資料同步的資料庫: abc
※Master 的設定說明:
Step 1. 確認 Master 與 Slave 機器上所安裝的 MySQL 版本是否為 3.23.29 或更高的版本.
#rpm -q mysql
Step 2. 在 MySQL 開放一個帳號給 Slave:
#mysql -u root -p
mysql>grant file on *.* to repl@192.168.1.2 identified by ‘abc123‘; *註
mysql>quit
*註: MySQL 4.0.2 以後的版本, 請將 GRANT FILE 改為 GRANT REPLICATION SLAVE.
Step 3. 停止 MySQL:
#/etc/rc.d/init.d/mysqld stop 或 #mysqladmin -u root -p shutdown
Step 4. 使用 tar 指令, 將 abc 資料庫備份到 /tmp:
#cd /var/lib/mysql
#tar -zcpf /tmp/mysql_snapshot.tar.gz ./abc
請注意 tar 指令加了參數 p, 將檔案權限一併記錄起來, 解壓縮的時候才不用再變更檔案屬性.
Step 5. 修改 /etc/my.cnf, 在 [mysqld] 區段內加入以下參數:
server-id=1
log-bin
sql-bin-update-same
binlog-do-db=abc (針對 abc 這個 database 做記錄)
Step 6. 啟動 MySQL:
#/etc/rc.d/init.d/mysqld start
此時因為有加入 log-bin 參數, 因此開始有 index 產生了, 在 /var/lib/mysql 目錄下可以發現 .index 檔案記錄資料庫的異動 log.
Step 7. 將備份資料庫檔案複製到 Slave 機器上:
#scp /tmp/mysql_snapshot.tar.gz root@192.168.1.2:/tmp
※Slave 的設定說明:
Step 1. 停止 MySQL:
#/etc/rc.d/init.d/mysqld stop 或 #mysqladmin -u root -p shutdown
Step 2. 修改 /etc/my.cnf, 在 [mysqld] 區段加入以下參數:
server-id=2
log-slave-updates
replicate-do-db=abc (告訴 slave 只做 abc 資料庫的更新)
master-host=192.168.1.1
master-user=repl
master-password=abc123
master-port=3306
master-connect-retry=60 (預設重試間隔 60 秒)
Step 3. 解開 Master 備份好的資料庫檔案:
#cd /var/lib/mysql
#tar -zxf /tmp/mysql_snapshot.tar.gz
如果解出來的檔案、目錄權限不對的話, 記得要用 chown、chmod 修正.
Step 4. 啟動 MySQL:
/etc/rc.d/init.d/mysqld start
此時, 在 /var/lib/mysql 目錄裡會出現 master.info, 這個檔案記錄了 Master MySQL Server 的資訊.
以上步驟完成後, 只要在 Master 異動 abc 資料庫的資料, Slave 的 abc 資料庫亦會跟著變更; 如果 Slave 掛點, 不影響 Master 的運作, 待 Slave 恢復後, 會自動進行覆寫的動作.
如果 Slave 重新啟動後, 覆寫功能並未恢復者, 將 /var/lib/mysql 裡的 *.index 與 *.001, .002... 都刪除掉後, 再重新啟動 Master 與 Slave 的 MySQL 即可.
若要讓兩台機器同時具備 Master 與 Slave 的功能, 只要在兩台機器都執行 Master 的 Step 2. (mysql grant command), 然後將上述 Master 與 Slave 的設定都寫入 /etc/my.cnf 即可. 要注意的是 server-id 一定要錯開, 不能使用相同的 server-id. 這樣不管是在哪台機器異動資料, 都會互相進行覆寫的動作.
※參考資料:
Instructions for setting up MySQL Replication (作者: myz)MySQL 官方文件: Replication in MySQL
Posted by Jamyy at 2004年12月27日 11:17
Trackback Pings
TrackBack URL for this entry:
http://cha.homeip.net/cgi-bin/mt/mt-tb.cgi/31
Comments
我想請問一下喔
因為我安裝4.1.12的版本on Linux
可是我都找不到my.cnf
請問這檔案到底在哪裡呢?
請幫我解惑一下!!!
Posted by: Jessie at 2005年06月10日 13:55
您可以在 /usr/share/mysql 路徑中找到 *.cnf
只要將其中一個 .cnf 檔複製成 /etc/my.cnf 即可
如: cp /usr/share/mysql/my-small.cnf /etc/my.cnf
Posted by: Jamyy at 2005年06月13日 09:19
Thanks !!!
感動收到你的回應~~~
後來我也是這樣解決問題的...真是感謝!
因為我之前粉少接觸MySQL,最近被指派建立相關MySQL資料庫
我最近安裝幾台電腦時,有遇到2個問題,可否順便請問一下:
[1]就是那台電腦本來就有安裝MySQL 3.2.23 (後面序號我有點忘記,反正就是3系列的)
那我要安裝4.1.12版本時,使用rpm安裝
他說版本有衝突
我使用rpm -Uvh 還是不行
因此我就使用 rpm -e 把舊版本拿掉
然後再使用rpm -ivh 把4.1.12的版本安裝
安裝過程正常
可是使用時,會發生一個現象
>mysql -u root -p
mysql> use mysql
程式記憶體發生錯誤
可是後來我使用my.cnf的設定檔案後,就不會發生了?
請問這現象是因為我使用rpm安裝新舊檔案讀寫有異常嗎?
還是我都要使用source install (tar ball) 才會可以避掉這些現象呢?
[2]因為你寫設定replication粉完整
請問使用source install on linux有沒有哪裡可以找到完整步驟的啊?可以給我點建議嗎?因為我從來沒有自己make過檔案安裝ㄋㄟ
Thanks ^^
ps :到首頁才發現你出去玩ㄋ...幸福唷!!!
Posted by: Jessie at 2005年06月13日 11:54
呵, 謝謝~ ^^
1) 我在 FC3 試了一下, 不過沒遇見您說的情況. source install 和 rpm install 只是安裝程序上的不同而已, 不會造成功能或 bug 上的差異.
2) 其實 source install 並沒有一定的步驟, 因為每個套件的安裝方式都不太一樣, 要看解包出來的 INSTALL 說明檔才能知道要怎麼安裝. 不過一般常見的步驟是:
./configure
make
make install
Posted by: Jamyy at 2005年06月13日 22:25
Thanks ~~~
希望我的MySQL會給我乖乖的跑著
不要再出什麼亂狀況給我~~~
我還有幾台機器要安裝,到時再練習看看使用source install
因為不是專職當DBA
每次安裝設定完..都有點小心虛
不知道會有沒有遺漏的設定
還是感謝大大你的回應啦~~~~
Posted by: Jessie at 2005年06月14日 09:37
好像還要加上grant replication 到 master server:
e.g. :mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl‘@192.168.1.2 IDENTIFIED BY ‘abc123‘;
thanks!
Posted by: Eric Ko at 2006年04月06日 12:30
謝謝您的提醒
原來在 MySQL 4.0.2 以前, 是用 GRANT FILE 的語法;
4.0.2 以後是用 GRANT REPLICATION SLAVE 來處理.
參考資料:
http://dev.mysql.com/doc/refman/4.1/en/replication-howto.html
Posted by: Jamyy at 2006年04月06日 16:27
from: http://cha.homeip.net/blog/archives/2004/12/replication_in.html#more