zoukankan      html  css  js  c++  java
  • MySQL复制(三)--基于全局事物标识符(GTID)配置复制

    image

    基础环境:

      主库 从库
    服务器IP地址 192.168.10.11 192.168.10.12
    版本 5.7.24 5.7.24
    已存在的数据库
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | lijiamandb         |
    | mysql              |
    | performance_schema |
    | sys                |
    | testdb             |
    +--------------------+
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+

    (一)什么是GTID

    GTID全称为全局事物标识符(global transaction identifiers),GTID具有唯一性,与主服务器上提交的每个事务相关联,如果客户端提交事务到主服务器上,则为其分配一个新的GTID,GTID是单调递增的。该标识符不仅对于主数据库是惟一的,而且在给定复制拓扑中的所有服务器上也是唯一的。GTID信息存储在数据库mysql.gtid_executed表中,该表中的一行包含它代表的每个GTID或一组GTID,始发服务器的UUID以及该组的起始和结束事务ID。

    如果具有给定GTID的事务已开始在服务器上执行,但尚未提交或回滚,则在具有相同GTID的服务器上启动并发事务的任何尝试都将被阻止。服务器既不开始执行并发事务,也没有将控制权返回给客户端。一旦对事务的第一次尝试提交或回滚,在同一GTID上阻塞的并发会话可能会继续进行。如果第一次尝试回滚,则一个并发会话将继续尝试事务,并且在同一GTID上阻塞的任何其他并发会话将保持阻塞状态。如果进行了第一次尝试,则所有并发会话都将停止阻塞,并自动跳过事务的所有语句。

    GTID由2部分构成:

    GTID = source_id:transaction_id

    其中source_id为server_uuid,对单台服务器来说,是一个固定值。transaction_id是事物的id。

    GTID举例:

    3E11FA47-71CA-11E1-9E33-C80AA9429562:23

    (二)使用GTID配置复制

    (2.1)开启GTID(主从都需配置)

    要启用基于GTID的复制,必须将gtid_mode变量设置为ON,并启用变量enforce_gtid_consistency为ON。

    [mysqld]
    # 启用GTID
    gtid_mode=ON
    enforce-gtid-consistency=ON

    配置完成,重启数据库生效。可以使用show master status来查看gtid值

    -- 开启gtid后,数据库需要有事物执行,Executed_Gtid_Set才会有值
    
    mysql> show master status;
    +-------------------+----------+--------------+------------------+----------------------------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
    +-------------------+----------+--------------+------------------+----------------------------------------+
    | master-bin.000027 |      352 |              |                  | caa64a22-481a-11ea-b0f1-000c29fb6200:1 |
    +-------------------+----------+--------------+------------------+----------------------------------------+

    (2.2)创建用于复制的用户(主)

    每个从服务器都需要使用MySQL的用户和密码连接到主服务器上,因此需要在主服务器上创建MySQL的用户,用于进行复制操作。可以为每个从库单独创建一个账号,也可以使用同一个账号。账号需具有“replication slave”权限。

    mysql> grant replication slave on *.* to 'rep'@'%' identified by '123';

    (2.3)初始化从库(从)

    备份主数据库,直接在备库节点执行:

    [root@slavedb ~]# mysqldump -uroot -p123456 -h 192.168.10.11 --single-transaction --all-databases --master-data=2  > master.sql

    将备份还原到从库:

    [root@slavedb ~]# mysql -uroot -p123456 < master.sql

    还原报错:

    [root@slavedb ~]# mysql -uroot -p123456 < master.sql
    mysql: [Warning] Using a password on the command line interface can be insecure.
    ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

    处理方法:
    [root@slavedb ~]# mysql -uroot -p123456

    mysql> reset master;
    Query OK, 0 rows affected (0.03 sec)

    (2.4)从库配置(从)

    如果尚未设置从服务器ID,或者当前值与您为主服务器选择的值冲突,请关闭从服务器并编辑[mysqld]配置文件的 部分以指定唯一的服务器ID。例如:

    [mysqld]
    server_id = 2

    (2.5)将从数据库添加到复制环境(从)

    这里是与“使用二进制日志文件复制”差别最大的地方,在使用二进制方法时,我们需要指定二进制日志文件的位置(master_log_file,master_log_pos),但是在使用GTID时,MySQL会自动查找位置。

    mysql> CHANGE MASTER TO
        -> master_host='192.168.10.11',
        -> master_port=3306,
        -> master_user='rep',
        -> master_password='123',
        -> MASTER_AUTO_POSITION = 1;
    Query OK, 0 rows affected, 2 warnings (0.00 sec)

    启动从库复制相关进程:

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


     (2.6)确认复制状态(从)

    在从库执行“ show slave status ”,如果Slave_IO_Running和Slave_SQL_Running都是“YES”,说明复制正常。

    mysql> show slave status G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.10.11
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: master-bin.000027
              Read_Master_Log_Pos: 83440352
                   Relay_Log_File: slavedb-relay-bin.000002
                    Relay_Log_Pos: 37156249
            Relay_Master_Log_File: master-bin.000027
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 39897784
                  Relay_Log_Space: 80699026
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: 430
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 1
                      Master_UUID: caa64a22-481a-11ea-b0f1-000c29fb6200
                 Master_Info_File: /mysql/data/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: System lock
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: caa64a22-481a-11ea-b0f1-000c29fb6200:9202-280001
                Executed_Gtid_Set: caa64a22-481a-11ea-b0f1-000c29fb6200:1-133885
                    Auto_Position: 1
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
    1 row in set (0.00 sec)

    【完】

    附录:

    MySQL复制(replication)文档集合:

    1.复制概述
    2.基于二进制日志文件位置(binlog)配置复制
    3.基于全局事物标识符(GTID)配置复制
    4.多源复制
    5.级联复制
    6.半同步复制
    7.延迟复制
    8.复制过滤规则
    9.对复制进行故障排除
    10.故障切换
    11.复制管理
  • 相关阅读:
    2.如何搭建MQTT环境
    1.如何安装maven
    4.线程同步-未使用线程同步的生产者/消费者关系
    3.线程的优先级和线程调度
    2.如何使用matlab拟合曲线
    1.如何安装matlab2016a
    2.线程状态:一个线程的声明周期
    Oracle"TNS监听程序找不到符合协议堆栈要求的可用处理程序"解决方案
    快速登录MySQL数据库
    数据仓库模型建设基础及kimball建模方法总结
  • 原文地址:https://www.cnblogs.com/lijiaman/p/12315379.html
Copyright © 2011-2022 走看看