mysql-5.7 調整mysql的復制方式由master_log_file+master_log_pos 到gtid 詳解


一、祖傳的master_log_file + master_log_pos的復制方式面臨的問題:

  在很久以前 那個時候我還沒有出道,mysql就已經就有復制這個功能了。如果要告訴slave庫從master二進制日志的哪個

  地方開始復制,就要通過change master to 的master_log_file & master_log_pos 參數來指定。但是這個有個問題,就

  是在slave出現問題后,slave要從那個地方開始重新同步呢?這個時候就比較小心了,因為show slave status 中對於文件

  名和位置的返回有三組。

Master_Log_File: mysql-bin.000052
Read_Master_Log_Pos: 190
Relay_Log_File: 74cstudio-relay-bin.0000031
Relay_Log_Pos: 355
Relay_Master_Log_File: mysql-bin.000050
Exec_Master_Log_Pos: 77

  如果dba在重新同步時指定的master_log_file + master_log_pos 參數不對,那么就會引起數據的不一致,而且這個不一致還

  不太好發現。

 

二、gtid出現了:

  1、有了gtid了之后對於重新同步時slave從哪里開始同步master的binlog不在由dba來管了,省心了!

  2、有了gtid了之后只要對比一下master和slave上的gtid數據量就可以知道master和slave是否一致了!

 

三、gtid這么吊 怎么建立一個基於gtid的復制呢?:

  根據官方文檔要把復制方式從master_log_file + master_log_pos 換到基於gtid的復制,要經過如下幾步:

  1、把master和slave都設置為read_only 這樣做是為了slave能同步所有master上的已有更新,同步完成之后

  slave的數據量就是等於master的數據量了。

  2、關閉master 和 slave 

  3、開啟master 和 slave 上的gtid功能 、開啟read_only 功能。這都通過my.cnf文件配置下就行啦。

  4、啟動master 和 slave 

  5、讓slave 以gtid的方式同步

  6、設置master 和 slave 可寫

 

四、舉例:

  還是先看一下已有master -> slave 環境的相關信息:

mysql> show slave status \G                                                                          
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.192.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 190
               Relay_Log_File: 74cstudio-relay-bin.000003
                Relay_Log_Pos: 355
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

  1、設置master 和 slave 為只讀: 

  master:

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> set @@global.read_only=1;                                                                     
Query OK, 0 rows affected (0.00 sec)

  slave:

mysql> set @@global.read_only=1;                                                                     
Query OK, 0 rows affected (0.00 sec)

  2、等slave完全同步了所有的master的更新后就關閉master 和 slave:

  master:

[root@74cstudio mysql]# mysqladmin -uroot shutdown

  slave:

[root@74cstudio mysql]# mysqladmin -uroot shutdown

  3、開啟master 和 slave 上的gtid功能並把它們設置成read_only

  master

[mysqld]
gtid_executed_compression_period    =1000                          #    1000                         
gtid_mode                           =on                            #    off                          
enforce_gtid_consistency            =on                            #    off 
read_only                           =1                              #   off

  slave

[mysqld]
gtid_executed_compression_period    =1000                          #    1000                         
gtid_mode                           =on                            #    off                          
enforce_gtid_consistency            =on                            #    off 
read_only                           =1                              #   off

   4、啟動master 和 slave 

  master

[root@cstudio mysql]# systemctl start mysql

  slave

[root@cstudio mysql]# systemctl start mysql

  5、讓slave 以gtid的方式同步

  slave

mysql>  change master to
    ->     master_host='172.16.192.10',
    ->     master_port=3306,
    ->     master_user='repl',
    ->     master_password='repl@352',
    ->     master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

  6、把master 和 slave 設置為可寫

  master

mysql> set @@global.read_only=0;                                                                     
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | OFF   |
+---------------+-------+

  slave

mysql> set @@global.read_only=0;                                                                     
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | OFF   |
+---------------+-------+

  7、還是show slave status 看一下slave 同步的狀態作為結束

mysql> show slave status \G                                                                          
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.192.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 509
               Relay_Log_File: 74cstudio-relay-bin.000005
                Relay_Log_Pos: 714
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                Auto_Position: 1

 

五、用gtid同步時可以方便的校對數據的一致性:

  master上看執行哪些事務

mysql> show master status \G                                                                         
*************************** 1. row ***************************
             File: mysql-bin.000006
         Position: 509
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 49d1e2c1-a8bc-11e7-8f4e-000c296c32b0:1-10
1 row in set (0.00 sec)

  slave上看執行了哪些事務

mysql> show master status \G                                                                         
*************************** 1. row ***************************
             File: mysql-bin.000006
         Position: 509
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 49d1e2c1-a8bc-11e7-8f4e-000c296c32b0:1-10
1 row in set (0.00 sec)

  由上面可以看出兩次執行show master status \G 的輸出中Executed_Gtid_Set的值是一樣的,說明master上的每一個事務都

  有在slave 上執行,所以可以得出master 和 slave是一致的結論。

 

六、在執行master_log_file + master_log_pos 到 gtid 同步方式的變更時的注意項:

  1、在四.2中那個關閉master 和 slave 的時候一定要確定slave 已經應用了master 的所以變更。

  2、在四.4中最好先把slave設置成skip-slave-start=1 , 不然會發現在執行change master to 的時候會報slave 已經啟動了

  當然這個報錯可能通過先執行stop slave  然后再執行change master to 來規避。

 

七、最后還是說一下什么是gtid

  gtid 這個哥們的中文全稱叫 “全局事務ID”,說白了就是事務的“身份證號碼”. 快10點了不想多說了。

 

----------------------------------------------------------------------

-----------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM