• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

mysql-5.7 调整mysql的复制方式由master_log_file+master_log_pos 到gtid 详解 - 蒋乐兴的技术随笔

Data: 2019-03-03 09:12:01Form: JournalClick: 8

笔 - 659, 文章 - 0, 评论 - 67, 引用 - 0

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              
Name:
<提交>