MySQL傳統主從複製(第二彈)

0、引言html

 

GTID是MySQL 5.6 的新特性之一,全稱global transaction identifier全局事務標誌符。GTID官方定義是:mysql

GTID = source_id:transaction_id算法

source_id:源服務器標識(通常是server_uuid),數據保存在auto.cnf 文件sql

transaction_id:是一個從 1 開始的自增計數,表示在這個主庫上執行的第 n 個事務,MySQL 會保證事務與 GTID 之間的 1 : 1 映射。安全

 

server_uuid: mysql 使用128位的server_uuid 替代原先32位的server_id 的大部分功能。 由於server_id依賴於my.cnf的配置,容易產生衝突。自動產生的128位的uuid算法能夠保證全部的uuid都不衝突。首次啓動mysql 會調用generate_server_uuid()函數自動生成一個server_uuid ,並保存到auto.cnf文件中,刪除這個文件,實例下次從新的時候會從新生成。服務器

 

 

1、MySQLGTID複製簡介微信

 

一、GTID是一個事務一一對應,而且全局惟一ID。socket

二、一個GTID在一個服務器上只執行一次,避免重複執行致使數據混亂或者主從不一致。ide

三、它用來代替傳統複製方法,再也不使用MASTER_LOG_FILE+MASTER_LOG_POS開啓複製。而是使用MASTER_AUTO_POSTION=1的方式開始複製。函數

四、它在MySQL-5.6.5開始支持的,MySQL-5.6.10後開始完善。

五、在傳統的slave端,binlog是不用開啓的,可是在GTID中slave端的binlog是必須開啓的,目的是記錄執行過的GTID(強制)。

六、GTID將主從複製變得簡單化,不須要再找MASTER_LOG_FILE、MASTER_LOG_POS,並且比傳統複製更加安全,由於GTID是連續的,在保證數據一致性方面表現優異

 

 

2、MySQLGTID實現主從同步的原理

 

 

 

一、master上執行和提交一個事務,這個事務被分配一個GTID,這個GTID會放在事務的前面,一同寫入BINLOG

二、當binlog傳輸到slave,並存儲到slave的relay log之後,slave獲取GTID,而後設置到gtid_next變量中.也就是告訴Master,下一個要執行的事務的GTID必定是這個變量中的值.

三、SQL thread從relay log中獲取GTID,並對比slave 的binlog中是否有該GTID,保證GTID在一個服務器上只執行一次,而且禁止多個線程同時執行一個GTID。若是沒有,slave會執行這個GTID,而且將這個GTID和事務一塊兒寫到本身的binlog中。若是有,忽略。

四、若是gtid_next沒有設置,那麼就會自動生成一個新的GTID,這就是爲何GTID要寫在事務的前面

 

 

 

3、MySQLGTID的配置

 

對於想要搭建基於GTID主從的童鞋們,使用mysql-5.6.5以上版本,建議使用最新版本

一、主:

[mysqld]

#GTID:

server_id=135              #服務器id

gtid_mode=on              #開啓gtid模式

enforce_gtid_consistency=on  #強制gtid一致性,開啓後對於特定create table不被支持

在mysql-5.6.9以前,enforce-gtid-consistency對應的是--disable-gtid-unsafe-statements參數.

詳細見:http://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html


#binlog

log_bin=mysql-bin

log-slave-updates=1   

binlog_format=row            #強烈建議,其餘格式可能形成數據不一致


#relay log

skip_slave_start=1  

 

二、從:

[mysqld]

#GTID:

gtid_mode=on

enforce_gtid_consistency=on

server_id=143



#binlog

log-bin=slave-binlog

log-slave-updates=1

binlog_format=row      #強烈建議,其餘格式可能形成數據不一致



#relay log

skip_slave_start=1

 

 

4、MySQLGTID主從模式配置

 

1、在新配置的服務器上搭建GTID主從

啓動之後先不要運行事務,而是先change master後,再運行事務

(root@localhost) [(none)]> CHANGE MASTER TO 

    ->  MASTER_HOST='xxxxx',   

    ->  MASTER_USER='xxxx',   

    ->  MASTER_PASSWORD='xxx',   

    ->  MASTER_PORT=xxxx,   

    ->  MASTER_AUTO_POSITION = 1;     

Query OK, 0 rows affected, 2 warnings (0.01 sec)



change master to master_host='10.0.0.6', master_user='root', master_password='123456', master_port=3306, master_auto_position=1;



(root@localhost) [(none)]> start slave;

Query OK, 0 rows affected (0.01 sec)



(root@localhost) [(none)]> show slave status \G ###能夠看到複製工做已經開始且正常

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                 ……

……

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

2、基於傳統複製的MySQL轉向GTID複製

a、按本文描述配置參數文件;

b、必定先關閉master的寫入,保證全部的slave都已經和master數據同步。而後在重啓,全部slave須要加上skip_slave_start的配置參數,避免啓勱之後仍是使用老的複製協議.全部服務器設置global.read_only參數,等待主從服務器同步完畢;

mysql> SET @@global.read_only = ON;

c、依次重啓主從服務器;

d、使用change master 更新主從配置;

mysql> CHANGE MASTER TO

     > MASTER_HOST = xxxx,

     > MASTER_PORT = xxxx,

     > MASTER_USER = xxxx,

     > MASTER_PASSWORD = xxxx,

     > MASTER_AUTO_POSITION = 1;

 

e、從庫開啓複製

mysql> START SLAVE;

f、驗證主從複製

 

 

5、搭建基於MySQL GTID的從庫

 

兩種方式:

一、若是你的master全部的binlog還在,能夠選擇相似於剛纔的方法,安裝slave後,直接change master到master。原理是直接獲取master全部的gtid並執行。

優勢:是簡單

缺點:是若是binlog太多,數據徹底同步須要的時間較長,而且master一開始就啓用了GTID

總結:適用於master也是新建不久的狀況。

 

二、經過master或者其餘slave的備份搭建新的slave.

原理:獲取master的數據,和這些數據對應的GTID範圍,而後經過在slave設置@@GLOBAL.GTID_PURGED從而跳過備份包含的GTID

優勢:是能夠避免第一種方法中的不足

缺點:是相對來講會複雜一點點

總結:適用於擁有較大數據集的狀況

 

三、經過mysqldump搭建基於GTID的從庫

 

 

l  備份從庫

[root@bogon ~]# mysqldump -h10.0.0.7 -uroot -p123456 --master-data=2 --triggers --routines --events --single-transaction --all-databases >all.sql

若是主從不是一個版本,從master上備份到salve,啓動實例後,應該再執行mysql_upgrade升級相關表結構performance_schema、information_schema以及mysql等系統表結構。

此時報錯

[root@bogon ~]# mysql <all.sql

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

l  在slave上執行

root@localhost [(none)]>show variables like 'gtid_purged';

+---------------+--------------------------------------------+

| Variable_name | Value                                      |

+---------------+--------------------------------------------+

| gtid_purged   | 60b08d3b-9c23-11e6-81c2-000c29d40ed7:1-605 |

+---------------+--------------------------------------------+

1 row in set (0.00 sec)

l  在master上執行

root@localhost [(none)]>show master status;

+------------------+----------+--------------+------------------+--------------------------------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                          |

+------------------+----------+--------------+------------------+--------------------------------------------+

| mysql-bin.000001 |  7527969 |              |                  | 60b08d3b-9c23-11e6-81c2-000c29d40ed7:1-605 |

+------------------+----------+--------------+------------------+--------------------------------------------+

(END)

l  在新的slave上執行

root@localhost [(none)]>reset master;

Query OK, 0 rows affected (0.01 sec)



root@localhost [(none)]>SET GLOBAL gtid_purged='60b08d3b-9c23-11e6-81c2-000c29d40ed7:1-605';

Query OK, 0 rows affected (0.01 sec)

l  鏈接到主

root@localhost [(none)]>change master to master_host='10.0.0.6', master_user='root', master_password='123456', master_port=3306, master_auto_position=1;

Query OK, 0 rows affected, 2 warnings (0.13 sec)



root@localhost [(none)]>start slave;

Query OK, 0 rows affected (0.01 sec)



root@localhost [(none)]>show slave status\G

l  校驗數據一致性

 

四、用xtrabackup搭建基於GTID的從庫

l  在主上作:

[root@bogon ~]# innobackupex --user=root --password=123456 --defaults-file=/data/etc/my.cnf --socket=/home/work/mysql/tmp/mysql.sock /home/dbbackup/        

l  在從上作:

[root@bogon ~]# innobackupex --copy-back --user=root --password=123456 /data/test/test/2016-12-13_23-05-52/

l  重啓slave reset master;

如果在slave作xtrabackup,要注意GTID範圍

l  從新鏈接

change master to master_host='10.0.0.6', master_user='root', master_password='123456', master_port=3306, master_auto_position=1;

l  校驗數據一致性

 

 

PS:很是抱歉,本文是做者前面整理的,當時沒有記錄參考文檔,再次向原創做者說聲抱歉。

爲了方便你們交流,本人開通了微信公衆號,和QQ羣291519319。喜歡技術的一塊兒來交流吧

相關文章
相關標籤/搜索