美文网首页
MySQL:12.基于GTID的主从复制

MySQL:12.基于GTID的主从复制

作者: 小六的昵称已被使用 | 来源:发表于2019-08-13 10:14 被阅读0次

    环境

    [root@gtid2]# cat /etc/centos-release
    CentOS Linux release 7.6.1810 (Core)
    
    [root@gtid2]# mysql -V
    mysql  Ver 14.14 Distrib 5.7.25, for Linux (x86_64) using  EditLine wrapper
    

    第零步:安装 MySQL(by all)

    ## 安装
    yum install -y mysql-community-client-5.7.25-1.el7.x86_64.rpm \
    mysql-community-common-5.7.25-1.el7.x86_64.rpm \
    mysql-community-libs-5.7.25-1.el7.x86_64.rpm \
    mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm \
    mysql-community-server-5.7.25-1.el7.x86_64.rpm
    
    ## 启动
    systemctl enable mysqld
    systemctl stop mysqld
    systemctl start mysqld
    systemctl status mysqld
    
    ## 初始化
    grep 'temporary password' /var/log/mysqld.log
    mysql -u root -p
    
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'Xiaoliu123!';
    

    第一步:修改 my.cnf 配置文件(by all)

    注意修改 server-id,要求两台服务器不能一样

    cp /etc/my.cnf /etc/my.cnf.bak
    vim /etc/my.cnf
    ## 指定 Server-ID
    server-id=101
    ## 开启二进制日志
    log-bin=mysql-bin
    ## 基于行
    binlog_format=row
    ## 保留2天自动删除
    expire_logs_days=2
    ## 开启 GTID
    gtid-mode=ON
    ## 启用后,服务器通过仅允许执行可使用GTID安全记录的语句来强制执行GTID一致性
    ## 仅在语句进行二进制日志记录时才生效
    ## 如果禁用了二进制日志记录,或者过滤器删除了语句而未将语句写入二进制日志,则不会对未记录的语句检查或强制执行GTID一致性
    enforce-gtid-consistency=ON
    ## 将从主库同步数据写入 binlog
    log-slave-updates
    ## 启用并行复制
    slave_parallel_type=logical_clock
    

    第二步:配置并开始同步

    ## 查看是否开启 GTID
    show variables like "%gtid%";
    
    ## 查看服务器 UUID
    show global variables like '%uuid%';
    cat /var/lib/mysql/auto.cnf
    
    ## 查看当前二进制日志名称
    SHOW MASTER STATUS;
    ## 查看二进制日志列表
    SHOW BINARY LOGS;
    SHOW BINLOG EVENTS;
    SHOW SLAVE HOSTS;
    

    1.创建复制用账号(主服务器)

    grant replication slave on *.* to 'slave'@'192.168.30.%' identified by 'Xiaoliu123!';
    select user,host from mysql.user;
    

    2.连接到主服务器(从服务器)

    ## 连接到主服务器
    CHANGE MASTER TO \
            MASTER_HOST='192.168.30.102',\
            MASTER_PORT =3360,\
            MASTER_USER='slave',\
            MASTER_PASSWORD='Xiaoliu123!',\
            MASTER_AUTO_POSITION=1;
    
    ## 开启复制
    START SLAVE;
    
    ## 再次查看主从状态
    show master status;
    show slave status\G
    

    第三步:测试

    1.测试数据是否同步

    ## 主库创建数据库并写入数据
    CREATE DATABASE galeratest;
    USE galeratest;
    CREATE TABLE test_table (
            id INT PRIMARY KEY AUTO_INCREMENT,
            msg TEXT ) ENGINE=InnoDB;
    INSERT INTO test_table (msg)
            VALUES ("Hello my dear cluster.");
    INSERT INTO test_table (msg)
            VALUES ("Hello, again, cluster dear.");
    
    select * from galeratest.test_table;
    
    ## 登录从库查看是否复制成功
    select * from galeratest.test_table;
    

    2.测试性能

    ## 读性能
    mysqlslap -uroot -pXiaoliu123!  \
        --auto-generate-sql \
        --auto-generate-sql-load-type=read \
        --number-char-cols=10 \
        --number-int-cols=5 \
        --number-of-queries=10000 \
        --concurrency=300 \
        --iterations=5
    
    ## 写性能
    mysqlslap -uroot -pXiaoliu123!  \
        --auto-generate-sql \
        --auto-generate-sql-load-type=write \
        --number-char-cols=10 \
        --number-int-cols=5 \
        --number-of-queries=10000 \
        --concurrency=300 \
        --iterations=5
    

    第四步:GTID与备份恢复

    1.备份

    在做备份恢复的时候,有时需要恢复出来的 MySQL 实例可以作为从库连上原来的主库继续复制,这就要求从备份恢复出来的 MySQL 实例拥有和主数据库数据一致的 gtid_executed 值。这也是通过设置 gtid_purged 实现的,下面看下 mysqldump 做备份的例子。

    这里使用 --all-databases选项是因为基于 GTID 的复制会记录全部的事务, 所以要构建一个完整的dump。

    mysqldump \
    --all-databases \
    --single-transaction  \
    --triggers \
    --routines \
    --events \
    --host=127.0.0.1 \
    --port=3306 \
    --user=root \
    -p000000 > dump.sql
    
            ## 生成的 dump.sql 文件里包含了设置 gtid_purged 的语句
            SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
            SET @@SESSION.SQL_LOG_BIN= 0;
            ...
            SET @@GLOBAL.GTID_PURGED='f75ae43f-3f5e-11e7-9b98-001c4297532a:1-14:20';
            ...
            SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
    

    2.从库恢复

    ## 恢复迁需要先清空``gtid_executed`` 变量
    reset master
    
    ## 执行恢复
    mysql -uroot -p123456 < /home/dump.sql
    
    ## 查看恢复出实例的 GTID_EXECUTED 是否和主库一致
    show master status;
    
    ## 由于恢复出 MySQL 实例已经被设置了正确的 GTID_EXECUTED
    ## 下面以 master_auto_postion = 1 的方式 CHANGE MASTER 到原来的主节点即可开始复制。
    CHANGE MASTER TO MASTER_HOST='192.168.2.210', \
                    MASTER_PORT =3360, \
                    MASTER_USER='repl', \
                    MASTER_PASSWORD='000000', \
                    MASTER_AUTO_POSITION = 1;
    
    ## 如果不希望备份文件中生成设置 ``GTID_PURGED`` 的 SQL,可以给 mysqldump传入 ``--set-gtid-purged=OFF`` 关闭。
    

    附录:注意事项

    参考:https://www.hi-linux.com/posts/47176.html

    1.enforce_gtid_consistency 强制 GTID 一致性, 启用后以下命令无法再使用。

    ## 因为实际上是两个独立事件,所以只能将其拆分。先建立表,然后再把数据插入到表中。
    create table … select …
        mysql> create table test2 select * from test1;
        ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
    

    2.事务内部不能创建临时表

    同一事务中不能同时更新事务表与非事务表(MyISAM),建议都选择 Innodb 作为默认的数据库引擎。

        mysql> begin;
        Query OK, 0 rows affected (0.00 sec)
    
        mysql> create temporary table test2(id int);
        ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context.  These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.
    
        ## 同一事务中不能同时更新事务表与非事务表(MyISAM),建议都选择 Innodb 作为默认的数据库引擎。
        mysql> CREATE TABLE `test_innodb` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT);
        Query OK, 0 rows affected (0.04 sec)
        
        mysql> CREATE TABLE `test_myisam` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT)   ENGINE = `MyISAM`;
        Query OK, 0 rows affected (0.03 sec)
        
        mysql> begin;
        Query OK, 0 rows affected (0.00 sec)
        
        mysql> insert into test_innodb(id) value(1);
        Query OK, 1 row affected (0.00 sec)
        
        mysql> insert into test_myisam(id) value(1);
        ERROR 1785 (HY000): Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
    

    相关文章

      网友评论

          本文标题:MySQL:12.基于GTID的主从复制

          本文链接:https://www.haomeiwen.com/subject/zciujctx.html