1. 程式人生 > >windows下實現mysql主從複製

windows下實現mysql主從複製

MySQL的主從複製是通過binlog日誌來實現的,主從複製中的“主”指的是MySQL主伺服器上的資料庫,“從”指的是MySQL從伺服器上的資料庫,且這種複製是基於資料庫級別的,為此從伺服器中的資料庫名稱必須和主伺服器中的資料庫名稱保持一致,那麼,要想實現主從複製,我們至少要有兩個MySQL伺服器(最好是兩個MySQL伺服器分別位於不同的主機上,或者在一個主機上安裝兩個MySQL,埠不同即可)。

一般來說,MySQL資料庫的主庫和從庫是分佈在不同的主機上。假如,現在我們只有一臺主機,且是windows系統,如何實現MySQL的主從複製呢?方法如下:


資料庫伺服器的引數:

    主伺服器(master): IP為192.168.1.122,埠為3306
    從伺服器(slave): IP為192.168.1.250,埠為3307


主伺服器配置:
修改主伺服器的資料庫配置檔案(G:\xampp\mysql\bin\my.ini),在 [mysqld] 標籤的最下面,新增如下程式碼:

#需要備份的資料庫  
binlog-do-db=test

#不需要備份的資料庫  
binlog-ignore-db=mysql  

#開啟二進位制日誌
log-bin=mysql-bin

#伺服器id
server-id=1

儲存退出,重啟MySQL主伺服器。
binlog-do-db用於指定需要同步的資料庫,binlog-ignore-db指定不需要同步的資料庫,如果這兩個引數都不設定,則從伺服器會複製主伺服器的所有資料庫。

一般不用root賬號作同步賬號,為此,我們需要在主伺服器上建立一個新的使用者(如 user01,密碼為123456)。
這裡我們用命令列的方式建立,方法如下:
開啟cmd,切換至 G:\xampp\mysql\bin,用 root 賬戶連線MySQL主伺服器: 
mysql -uroot -p -P3306
建立新使用者: 
create user 'user01'@'127.0.0.1' identified by '123456';
(@後面的ip地址為允許連線的客戶端的ip地址。)

然後,給新使用者配置主從複製的許可權:
grant replication slave on *.* to 'user01'@'127.0.0.1' identified by '123456';
(@後面的ip地址為允許連線的客戶端的ip地址,如果改為 '%',就表示客戶端沒有ip地址的限制)

如果主伺服器的資料庫(test)中,已經有資料,我們需要先手動把主伺服器中的資料複製到從伺服器。方法如下:
在本案例中,我們只備份一個數據庫(test),test中有一個表basic_user,表中也已經有了資料。為了防止我們複製資料的時候,資料庫test中的資料發生更新,我們需要先鎖定資料庫,命令如下:
flush tables with read lock;
這個命令是全域性讀鎖定,它會給主伺服器中的所有資料庫都加上讀鎖,這裡順便說一下讀鎖和寫鎖的區別:

    read lock(讀鎖):也叫共享鎖,允許所有的讀操作,但阻塞寫操作,即所有連線只可以讀資料,但不允許寫資料。
    write lock(寫鎖):也叫排它鎖、獨佔鎖,只允許當前連線的讀和寫,不允許其他併發的讀操作和寫操作。

鎖定主伺服器的資料庫後,我們在從伺服器中,也建立一個數據庫test,並將所有的表(包括表結構和表資料)都匯入。
然後,我們執行下面的命令,解鎖:
unlock tables;  

檢視主伺服器的 master 狀態:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      108 | test         | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+

從伺服器配置:
修改從伺服器的資料庫配置檔案(E:\mysql\my.ini),在 [mysqld] 標籤的最下面,新增如下程式碼:

#埠
port = 3307

#伺服器id
server_id = 2

#開啟二進位制日誌(從伺服器不是必須要開啟二進位制日誌)
log-bin=mysql-bin 

儲存退出,重啟MySQL服務。

連線MySQL從伺服器:
mysql -uroot -p -P3307

配置複製的引數:
change master to master_host='127.0.0.1',master_user='user01',master_password='123456',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=108;

引數詳解:

master_host: 主伺服器的IP
master_user: 主伺服器上新建立的使用者名稱
master_password: 使用者的密碼
master_port: 主伺服器的埠,如果未曾修改,預設即可。

master_log_file: 主伺服器二進位制日誌檔案的名稱,填寫檢視主伺服器的master狀態時顯示的File的值

master_log_pos: 日誌的位置,填寫檢視主伺服器的master狀態時顯示的Position的值

啟動從伺服器的slave複製功能:
start slave;

檢視從伺服器的slave狀態:
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: user01
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 120
               Relay_Log_File: hp-PC-relay-bin.000004
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

如果 Slave_IO_Running 和 Slave_SQL_Running 的值都為 Yes,則說明主從複製的所有配置已成功,即從伺服器已經可以自動與主伺服器的資料庫資料實現同步了。

此後,只要主伺服器的資料有更新(比如:在 test資料庫中新建了一張表或者表中的資料發生了變化),從伺服器都會自動與主伺服器保持一致。但如果有人刻意改變了從伺服器的資料,主伺服器中的資料並不會同步更新,除非我們把這兩個MySQL伺服器設定為互為主從。