mysql主從搭建和測試步驟
主從配置步驟:
假設兩臺機器分別為192.168.0.202, 192.168.0.203,其中202做主,203做從。
1. 在兩臺mysql上建立同步使用者。202執行:
GRANT ALL PRIVILEGES ON *.* TO 'repl'@'192.168.0.203' IDENTIFIED BY 'repl' WITH GRANT OPTION;
203執行:
GRANT ALL PRIVILEGES ON *.* TO 'repl'@'192.168.0.202' IDENTIFIED BY 'repl' WITH GRANT OPTION;
讓兩個mysql可以互相通過repl/repl訪問對方。
2. 對兩臺機器,開啟/etc/my.cnf mysql配置檔案,在[mysqld]下開啟以下選項:
log-bin=mysql-bin
innodb_flush_log_at_trx_commit = 1
sync_binlog=1
binlog-do-db=bookmark
binlog-do-db=debate
binlog-ignore-db=test
binlog-ignore-db=mysql
replicate-do-db=bookmark
replicate-do-db=debate
其中binlog-do-db和replicate-do-db標記出需要進行同步的資料庫,對於多個數據庫,重複選項多次即可,如上面的配置則表示同步bookmark和debate。binlog-ignore-db表示不
進行同步的資料庫,上面的配置表示不同步test, mysql庫。
對於主mysql(202),開啟選項:
server-id=1
對於203,從mysql,開啟選項
server-id=2
注意server-id選項必須開啟,並且叢集中每個mysql都要有一個單獨的值,不能重複。一般設定主為1,從為2, 3, 4....。手冊上說只要不相同什麼整數都沒有關係,可以設定為IP的值,如:202,
203.
3. 重新啟動兩個mysql. 分別輸入:show master status; 命令,此時應該顯示:
+------------------+----------+-----------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+-----------------+------------------+ | mysql-bin.000006 | 98 | bookmark,debate | test,mysql | +------------------+----------+-----------------+------------------+ 1 row in set (0.00 sec)
輸入:show slave status; 命令,應該顯示:
Empty set (0.00 sec)
表示還沒有從。
4. 為了避免風險,主mysql現在最好不要對外提供服務,就是說主mysql的已有資料不要在動了。主mysql(202), 執行下面的命令:
FLUSH TABLES WITH READ LOCK;
鎖定表,這個時候所有的commit都會失敗。
執行:show master status;
把輸出結果記錄下來,尤其是那個File和Position的值,後面要用。這裡就是:mysql-bin.000006和98
把2個mysql都停掉,命令:./mysqladmin -u root shutdown
現在把master mysql(202)的資料複製到203上,讓slave的資料和master的同步。例如用sftp把202 data目錄的bookmark, debate複製到203的data目錄內。兩邊一定要保持一致。
5. 啟動slave mysql(203),執行命令:
CHANGE MASTER to MASTER_HOST='192.168.0.202', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=98
其中master_host就是主mysql, master_log_file, master_log_pos為上一步在master端執行show master status; 獲得的File和Position值,此處換成那些值。注意數字是沒有單
引號引起來的。如果上面一步File和Position沒有值,master_log_file='', master_log_pos=4
然後執行: start slave;
6. 啟動master mysql(202).
在master端執行:unlock tables; 解除第4步的鎖表。
在slave端執行:show slave status \G ; 察看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配置的相同。
在master端執行: show master status; 對比File, Position的值和上面slave端的Master_Log_File,Read_Master_Log_Pos,兩邊相同則表示搭建完成。
7. 測試叢集正確。
1). 在master端建立一個數據庫abc,然後察看slave端是否同步建立了。
2). 在abc插入幾條記錄,察看slave端資料是否同步插入。
3). 更新abc的記錄,察看slave端資料是否同步
4). 刪除abc的記錄,察看slave端資料是否同步
5). 停掉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)將會完全相同。
8. 日誌檢查
如果有錯誤,檢查mysql data目錄的 ...machinname.err 檔案。
9. 應用切換到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檔案刪掉。
===================================================================================================================
1 |
mysql>start
slave;
|