MYSQL主從資料庫搭建
這是我自己通過參考網上的資料,根據其步驟搭建MYSQL主從資料庫的過程中遇到的一些問題。整理的一篇小記,方便以後查閱。也能給網上的朋友提供一點參考的資料。
寫該文章時間:2012/8/27
環境:
(以下是我這次搭建所使用的環境)
- 主資料庫:
- 從資料庫
步驟:
1.在兩臺mysql上建立同步使用者,讓兩個mysql可以互相通過root/root訪問對方。
主執行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.51.127' IDENTIFIED BY 'root' WITH GRANT OPTION;
從執行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.28.128' IDENTIFIED BY 'root' WITH GRANT OPTION;
2.修改兩臺的配置檔案。
ubuntu 上:
- 開啟/etc/my.cnf : sudo gedit /etc/my.cnf 找到[mysqld]在其下新增下面選項。
log-bin=MySQL-bin
innodb_flush_log_at_trx_commit = 1
sync_binlog=1
binlog-do-db=game
binlog-ignore-db=test
binlog-ignore-db=mysql
replicate-do-db=game
其中binlog-do-db和replicate-do-db標記出需要進行同步的資料庫,對於多個數據庫,重複選項多次即可,如上面的配置則表示同步bookmark和debate。binlog-ignore-db表示不
進行同步的資料庫,上面的配置表示不同步test, mysql庫。
-
對於主mysql(192.168.28.128),開啟選項:
server-id=1
- 對於從mysql,開啟選項
server-id=2
注意server-id選項必須開啟,並且叢集中每個mysql都要有一個單獨的值,不能重複。一般設定主為1,從為2, 3, 4....。手冊上說只要不相同什麼整數都沒有關係,可以設定為IP的值,如:202,203.
-
得到主資料庫二進位制log檔案和位置ip:重啟mysql,執行sql語句:show master status;
結果:
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
|mysql-bin.000005
+------------------+----------+--------------+--------------------------+
1 row in set (0.00 sec)
記住File = mysql-bin.000005 Position =106;下面有下劃線步驟用到。
window上:
- 配置my.ini檔案
log-bin=mysql-bin #啟用二進位制日誌檔案
server-id=2 #設定資料庫ID
binlog-do-db=databasename #二進位制需要同步的資料庫(多個用逗號分隔)
binlog-ignore-db=mysql #避免同步的資料庫(多個用逗號分隔)
#配置主從同步
server-id=2 #從伺服器ID
master-host=192.168.28.128 #主伺服器IP
master-user=gnh1 #主伺服器登陸名
master-password=112233 #主伺服器登陸密碼
master-port=3306 #主伺服器斷口
master-connect-retry=60 #斷點從新連線時間(秒)
replicate-ignore-db=mysql #遮蔽對MYSQL庫的同步
replicate-do-db=wuliu #二進位制需要同步的資料庫
文中該顏色部分可能已經過時,據網上訊息介紹,Mysql版本從5.1.7以後開始就不支援“master-host” 類似的引數。所以可能報錯:
[ERROR] mysqld: unknown variable ‘master-host=192.168.28.128′。
所以只需新增兩行:
server-id = 2
replicate-do-db = game /*共享的資料庫*/
-
執行SQL語句:
change master to master_host=’192.168.28.127,master_user=’root’,master_password=’******’,master_log_file=’mysql-bin.000005′,master_log_pos=106;
-
檢視從資料庫配置狀態
show slave status;
察看結果欄位Slave_IO_State,一般應該為"Waiting for master to send event";此時Slave_IO_Running和Slave_SQL_Running應該為true,
如果不是,在slave端執行: stop slave; start slave; 重啟複製程序。Replicate_Do_DB為要複製的資料庫,和my.cnf配置的相同。
測試:
- 如上文操作:實現了game資料庫的主從關係。
0). 在master端建立一個表abc,然後察看slave端是否同步建立了。
1). 在abc插入幾條記錄,察看slave端資料是否同步插入。
2). 更新abc的記錄,察看slave端資料是否同步
3). 刪除abc的記錄,察看slave端資料是否同步
4). 停掉slave伺服器,重新執行2,3,4的內容,重啟slave,看slave端資料是否同步。
在執行上面的操作過程中,每執行一次都用第6步的方法察看master的File, Position值和slave的Master_Log_File,Read_Master_Log_Pos是否相同,如果主從工作正常,這
兩個值在一次同步完成以後(slave status的Slave_IO_State顯示:Waiting for master to send event)將會完全相同。
-
日誌檢查
如果有錯誤,檢查mysql data目錄的 ...machinname.err 檔案。
-
應用切換到slave
如果master mysql壞掉了,需要將應用轉移到slave段。首先在slave端執行:show master status; 把輸出儲存下來,然後再把應用切換過去。儲存輸出的File和Position值將可以用於以後從slave恢復master.
具體從slave恢復master的辦法:
在master端執行:
CHANGE MASTER to MASTER_HOST='192.168.0.203', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=98 ;
其中 MASTER_HOST 為slave的ip, MASTER_LOG_FILE, MASTER_LOG_POS為切換到slave時記錄下的File和Position值。
在master執行:start slave;
待master內容基本恢復以後(在master執行:show slave status \G; Slave_IO_State顯示為Waiting for master to send event)
將應用切換回master。
待系統穩定後master執行:stop slave停止slave。如果要避免master重啟以後自動開啟slave,可以將master mysql的data資料夾的master.info檔案刪掉。