• 12 : mysql 主从复制


    一.什么是GTID
    GTID(Global Transaction ID)全局事务标识符:是一个唯一的标识符,它创建并与源服务器(主)上提交的每个事务相关联。
    此标识符不仅对其发起的服务器是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。 所有交易和所有GTID之间都有1对1的映射。
    GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

    下面是一个GTID的具体形式:
    它的官方定义如下:
    GTID = source_id :transaction_id
    3E11FA47-71CA-11E1-9E33-C80AA9429562:23
    什么是sever_uuid,和Server-id 区别?
    source_id 也叫uuid 默认在是第一次启动数据库时,自动生成的
    /application/mysql/data/auto.cnf
    手工删除掉此文件,重启数据库,可以生成新的。


    二.GTID新特性
    (1).支持多线程复制:事实上是针对每个database开启相应的独立线程,即每个库有一个单独的(sql thread).

    (2).支持启用GTID,在配置主从复制,传统的方式里,你需要找到binlog和POS点,然后change master to指向.
    在mysql5.6里,无须再知道binlog和POS点,只需要知道master的IP/端口/账号密码即可,因为同步复制是自动的,MySQL通过内部机制GTID自动找点同步.

    (3).基于Row复制只保存改变的列,大大节省Disk Space/Network resources和Memory usage.

    (4).支持把Master 和Slave的相关信息记录在Table中
    原来是记录在文件里,记录在表里,增强可用性

    (5).支持延迟复制

     

    基于GTID复制构建过程(3307主,3308从)
    1、更新参数文件

    vim /data/3307/my.cnf
    添加:
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    去掉复制过滤功能!!!!


    vim /data/3308/my.cnf
    添加:
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1


    2、删除历史数据
    pkill mysqld
    rm -rf /data/3307/data/*
    rm -rf /data/3307/mysql-bin*
    rm -rf /data/3308/data/*
    rm -rf /data/3308/mysql-bin*

    3、重新初始化数据
    mv /etc/my.cnf /etc/my.cnf.bak ----》如果有就mv一下,没有的话就不做

    /application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3307/data/
    /application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3308/data/


    修改目录权限
    [root@db01 3307]# touch /data/330{7..8}/mysql.log
    [root@db01 3307]# chown -R mysql.mysql /data/330*

    启动多实例

    mysqld_safe --defaults-file=/data/3307/my.cnf &
    mysqld_safe --defaults-file=/data/3308/my.cnf &


    4、构建主从

    (1)主库创建用户:
    mysql -S /data/3307/mysql.sock
    grant replication slave on *.* to repl@'10.0.0.%' identified by '123';

    (2)备份主库数据
    mysqldump -S /data/3307/mysql.sock -A -R --triggers --master-data=2 --single-transaction >/tmp/full.sql

    (3)开启主从
    mysql -S /data/3308/mysql.sock


    mysql> CHANGE MASTER TO
    MASTER_HOST='10.0.0.51',
    MASTER_USER='repl',
    MASTER_PASSWORD='123',
    MASTER_PORT=3307,
    MASTER_AUTO_POSITION = 1;

    mysql> start slave;

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

    GTID 从库误写入操作 处理

    注入空事物的方法:
    stop slave;
    set gtid_next='8c49d7ec-7e78-11e8-9638-000c29ca725d:2';
    begin;commit;
    set gtid_next='AUTOMATIC';
    start slave;
    这里的xxxxx:N 也就是你的slave sql thread报错的GTID,或者说是你想要跳过的GTID。

     

    最好的解决方案:重新构建主从环境

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

    GTID 复制和普通复制的区别
    (0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover
    (1)额外功能参数(3个)
    (2)change master to 的时候不再需要binlog 文件名和position号
    (3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号
    (4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式
    SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
    告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。

  • 相关阅读:
    大三寒假学习进度(3)
    大三寒假学习进度(2)
    大三寒假学习进度(1)
    Tensorflow深度学习(二)
    Tensorflow深度学习(一)
    了解使用Pyppeteer
    为什么我还可以继续使用python自动填问卷星?
    周总结(十四)
    docker常用命令总结
    周总结(十三)
  • 原文地址:https://www.cnblogs.com/jim-xu/p/11676310.html
Copyright © 2020-2023  润新知