mysql 之 主從同步(單向同步和雙向同步)


一、 實驗環境部署

主服務器(MySQL-01) IP: 192.168.8.241  端口3306  ,操作系統:Centos6.5 64位

從服務器(MySQL-02)  IP: 192.168.8.242  端口3306,操作系統:Centos6.5 64位


虛擬機配置:內存2G,硬盤28G,2塊網卡(1塊網卡也可以),注意複製虛擬機 時候選擇生成不同的MAC地址,虛擬機生成之後,網卡的的名稱會變爲eth2、eth3,修改/etc/udev/rules.d/70-persistent-net.rules文件,將無效的MAC記錄屏蔽掉,將真實的MAC對應的記錄改名爲eth0、eth1。
兩臺虛擬機的網絡配置好,配置網關、配置DNS,將虛擬機網卡設置爲物理橋接模式,使之能夠訪問外網,通過 ping www.baidu.com 測試是否能訪問外網。
通過yum安裝mysql數據庫server/client/develop:
yum -y install mysql-server mysql mysql-devel

二、mysql單向主從同步配置


I. 主服務器的操作
1. 關於主服務器的相關配置
1.1  設置server-id值並開啓binlog參數
根據mysql的同步原理:關鍵因素就是binlog日誌。
編輯/etc/my.cnf配置文件,修改和添加相關參數。

[root@localhost ~]# vi /etc/my.cnf        
        [mysqld]
        server-id = 1
        log-bin = mysql-bin

備註:
#. 上面兩參數放在my.cnf中的[mysqld]模塊下,否則會出錯;
#. 要先在my.cnf文件中查找相關參數,並按具體要求修改,不存在時添加相關參數,切記,參數不能重複;
#binlog-do-db = test :需要備份數據,多個寫多行,不寫全部都備份
#binlog-ignore-db = mysql :不需要備份的數據庫,多個寫多行

修改完配置文件,檢查配置後的結果:
[root@localhost ~]# grep -E "server-id|log-bin" /etc/my.cnf

重啓mysql數據庫
service mysqld restart

設置數據庫根用戶root的密碼:
mysqladmin -u root password 'mysql'

設置的密碼是“mysql"

1.2 建立用於主、從數據同步的帳號 "rep"
[root@localhost ~]#mysql -u root -pmysql
mysql>select user();
mysql>grant replication slave on *.* to 'rep'@'192.168.8.%' identified by '123456';

mysql>flush privileges;

備註:
#replication slave:爲mysql同步的必須權限,此處不要授權all
#*.*:表示所有庫所有表,庫也是可以指定具體的庫和表進行復制,如test.test1(test庫的test1表);
# [email protected].%: rep爲同步賬號,192.168.1.%爲授權主機,使用了%表示允許整個192.168.8.0網段以rep用戶訪問;
#identified by "123456" : 123456爲密碼,實際環境用複雜密碼

1.3 對主數據庫鎖表只讀:
注:實際環境中,操作主從複製,需要申請停機時間,鎖表會影響業務。
mysql>flush tables with read lock;

注:這個鎖表命令的時間,在不同引擎的情況,會受下面參數的控制,鎖表超過設置時間不操作會自動解鎖;
默認情況下的時長爲:
mysql>show variables like "%timeout%"; 可以查看到默認鎖表時間最大值。
mysql> show variables like "%timeout%";
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
..........
| interactive_timeout        | 28800 |
........
| wait_timeout               | 28800 |
+----------------------------+-------+
10 rows in set (0.00 sec)

完成後測試是否鎖表成功:打開另一窗口創建一test1表,是不會執行的,證明鎖表不能更新,但可讀,不可寫,因爲是read讀鎖,鎖表主要是爲了導出數據庫文件,從而取得正確的偏移量的值,保證導入從數據庫,數據一致。

1.4 查看主庫狀態
查看主庫狀態,即當前日誌文件名和二進制日誌偏移量
mysql>show master status;
命令顯示的信息要記錄在案,後面的從庫複製時是從這個位置開始的。

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      619 |              | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

1.5  導出主數據庫數據
[root@localhost ~]#mkdir /backup
[root@localhost ~]#mysqldump -uroot -pmysql -A -B |gzip >/backup/mysql_bak.$(date +%F)sql.gz
注:-A表示備份所有庫, -B表示增加user DB和drop等參數(導庫時會直接覆蓋所有的)。

[root@mysql-master backup]# ll
total 144
-rw-r--r-- 1 root root 144884 Feb 23 08:58 mysql_bak.2016-02-23sql.gz

爲了確保導庫期間,數據庫沒有數據插入,可以再檢查下主庫狀態信息
[root@mysql-master backup]# mysql -uroot -pmysql -e "show master status"
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      619 |              | mysql            |
+------------------+----------+--------------+------------------+

注:無特殊情況,binlog文件及位置點是保持不變的。
導庫後,解鎖主庫,恢復可寫;
mysql>unlock tables;
Query OK, 0 rows affected (0.00 sec)

特別提示,有讀者這裏犯迷糊,實際上做從庫的,無論主庫更新多少數據了,最後從庫都會從上面show master status 的位置很快趕上主庫的位置進度的。

1.6  把主庫備份的mysql數據遷移到從庫
[root@mysql-master backup]# scp /backup/mysql_bak.2016-02-23sql.gz 192.168.8.242:/backup/

II.  從服務器的操作
1. 關於從服務器的相關配置
1.1 設置server-id值並關閉binlog設置
注:數據庫的server-id在LAN內是唯一的,這裏的server-id要和主庫及其他從庫不同,並註釋掉從庫的binlog參數配置;
編輯/etc/my.cnf配置文件,修改相關的參數設置
master-connect-retry=60 #如果從服務器發現主服務器斷掉,重新連接的時間差

[root@localhost ~]# vi /etc/my.cnf     
    [mysqld]
    server-id = 2
    #log-bin = mysql-bin

檢查配置後的結果
[root@localhost ~]#grep -E "server-id|log-bin" /etc/my.cnf

設置數據庫根用戶root的密碼:
mysqladmin -u root password 'mysql'
設置的密碼是“mysql"

重啓從數據庫
[root@localhost ~]#service mysqld restart
1.2 還原主庫導出的數據到從庫
gunzip mysql_bak.2016-02-23sql.gz
mysql -uroot -pmysql <mysql_bak.2016-02-23sql

1.3 登錄從庫配置同步參數

mysql>change master to #連接主數據庫
mysql>master_host="192.168.8.241",  #主庫的IP地址
mysql>master_port=3306, #主庫的端口,從庫的端口可以和主庫不同
mysql>master_user="rep", #主庫上建立的用於數據同步的用戶《rep》
mysql>master_password="123456", #用戶《rep》的密碼
mysql>master_log_file="mysql-bin.000003",  #是mysql>show master status時看到的二進制日誌文件名稱,不能多空格。
mysql>master_log_pos=619;  #是mysql>show master status時查看到的二進制日誌偏移量,不能多空格。
(change master to master_host="192.168.8.241",master_port=3306,master_user="rep",master_password="123456",master_log_file="mysql-bin.000003",master_log_pos=619; )

1.4  啓動從庫同步開關
啓動從庫同步開關,並查看同步狀態
[root@localhost backup]#mysql -uroot -pmysql -e "start slave"
[root@localhost backup]#mysql -uroot -pmysql -e "show slave status\G"

也可以登錄從庫,在數據庫下面執行相關命令:
mysql>start slave;
mysql>show slave status\G;

判斷搭建是否成功就看如下IO和SQL兩個線程是否顯示爲“yes”狀態

Slave_to_Running:YES #負責從庫去主庫讀取binlog日誌,並寫入從庫中繼日誌中
Slave_SQL_Running:YES #負責讀取並執行中繼日誌中的binlog轉換sql語句後應用到數據庫彙總。

也可以執行命令過濾查看如下:

[root@mysql-slave tmp]# mysql -uroot -pmysql  -e "show slave status\G" | egrep "IO_Running|SQL_Running"
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

1.5 測試主從同步

在主庫創建 —>數據庫以及查看
在主庫中創建庫“mytable”用於主從同步:

[root@localhost ]#mysql -uroot -pmysql -e "show databases;"
[root@localhost ]#mysql -uroot -pmysql -e "create database mytable;"

在從庫查看是否主從同步:
[root@mysql-master ~]# mysql -uroot -pmysql -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytable            |
| test               |
+--------------------+
[root@mysql-master ~]#

[root@mysql-slave tmp]# mysql -uroot -pmysql -e "show databases;"

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytable            |
| test               |
+--------------------+
[root@mysql-slave tmp]#

到此!單向主從數據庫同步成功完成;從數據庫可以實現數據同步。

三、mysql雙向主從同步的配置

3.1在MySQl-01上操作,用戶授權,略過,是因爲在做單向主從的時候已經對192.168.8.0/24整個網段都進行了授權。如果單向主從關係創建複製用戶“rep”的時候只制定了單獨地址192.168.8.242,那麼就需要增加對地址192.168.8.241的授權。執行下面的命令:

mysql -u root -pmysql
mysql> grant replication slave on *.* to 'rep'@'192.168.8.241' identified by '123456'; //建立權限
mysql> flush privileges;
注:因爲做的是所有庫的主從,所以在MySQL-01上的操作會同步到MySQL-02上

3.2在MySQL-02上的操作
修改MySQL-02的數據庫文件,在[mysql]下修改如下內容  
server_id = 2
log_bin = mysql-bin

重啓 MySQL-02的mysql數據庫:
service mysqld restart
查看MySQL-02上的日誌文件:
mysql> show master status;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

3.3在MySQL-01上操作
mysql> change master to master_host='192.168.8.242',master_user='rep',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;
mysql> start slave;
檢查是否成功

mysql>show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

表示成功。
至此,mysql的雙向主從同步已完成

附:mysql主從同步常見異常及恢復方法


1. 一般的異常只需要跳過一步即可恢復
>slave stop;
>SET GLOBAL sql_slave_skip_counter = 1;
>slave start;

2.斷電導致主從不能同步時,通主庫的最後一個bin-log日誌進行恢復
在主庫服務器上,mysqlbinlog mysql-bin.xxxx > binxxxx.txt
tail -n 100000  binxxxx.txt > tail-binxxxx.txt
vim tail-binxxxx.txt 打開tail-binxxxx.txt文件找到最後一個postion值
然後在從庫上,change host to 相應正確的值
>slave stop;
>change master to master_host='ip', master_user='username', master_password='password', master_log_file='mysql-bin.xxxx', master_log_pos=xxxx;
>slave start;
>show slave status\G;

3.主鍵衝突、表已存在等錯誤代碼如1062,1032,1060等,可以在mysql主配置文件指定
略過此類異常並繼續下條sql同步,這樣也可以避免很多主從同步的異常中斷
[mysqld]
slave-skip-errors = 1062,1032,1060

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章