1. 程式人生 > >MYSQL主從資料庫搭建

MYSQL主從資料庫搭建

說明:
這是我自己通過參考網上的資料,根據其步驟搭建MYSQL主從資料庫的過程中遇到的一些問題。整理的一篇小記,方便以後查閱。也能給網上的朋友提供一點參考的資料。
寫該文章時間:2012/8/27
環境:
(以下是我這次搭建所使用的環境)
  • 主資料庫:
              系統:ubuntu ; MYSQL  5.1.63 ;ip:192.168.28.128
  • 從資料庫
              系統:window 7 ;MYSQL  5.5.8 ;ip:192.168.51.127
步驟:

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

 |     106 | game         | information_schema,mysql |
+------------------+----------+--------------+--------------------------+
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檔案刪掉。