zoukankan      html  css  js  c++  java
  • my04_Mysql复制数据一致性校验

    1. 搭建一套双节点的Mysql主从复制数据库

    2. 主库初始化测试数据

    drop table if exists test;
    create table  test ( tid int,tname varchar(12),test_id  int NOT NULL AUTO_INCREMENT COMMENT '主键',PRIMARY KEY (test_id));
    
    
    DROP PROCEDURE IF EXISTS `p_addtest`;
    DELIMITER ;;
    CREATE DEFINER=`automng`@`10.%` PROCEDURE `p_addtest`(IN n int)
    BEGIN
        DECLARE i int;
        SET i = 0;
        WHILE i < n DO
            insert into test(tid,tname) values(i,'aaabbb');
            set i = i + 1;
        END WHILE;
    END
    ;;
    DELIMITER ;
    
    call p_addtest(20000);

     3. 安装 percona-toolkit

    wget https://www.percona.com/downloads/percona-toolkit/3.0.11/binary/redhat/7/x86_64/percona-toolkit-3.0.11-1.el7.x86_64.rpm
    
    yum localinstall percona-toolkit-3.0.11-1.el7.x86_64.rpm -y

    4. shell命令行执行校验,主库此时无业务数据插入

    在哪个数据库服务器上执行没关系,关键是该命令连接的是主库,即host指向的是主库的IP地址,pt-table-checksum命令会自动查找该主库有哪些从库,无须人工干预

    automng用户具有ALL PRIVILEGES 权限。

     pt-table-checksum --nocheck-binlog-format --recursion-method="processlist" --replicate=vodb.checksums  --host=10.168.21.186 --port=3313 -uautomng -pAutomng_123 --databases=vodb

    输出结果,注意输出结果正常情况下是没有警告或者错误信息的,如果有,则输出结果可能不准确

    Checking if all tables can be checksummed ...
    Starting checksum ...
                TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
    07-24T14:21:01      0      0    20000          0       4       0   0.075 vodb.test

    重点在于DIFFS列,0表示主从数据一致,非0值表示不一值

    5. 从库执行命令校验,主库模拟业务数据

    主库模拟业务数据

    mysql> call p_addtest(200000);

    执行数据库一致校验,可以看到表中的数据一直在增长,但DIFFS的值为一直为0,这表示在使用 pt-table-checksum 命令做数据库一致校验时,无需关心主库是否存在业务

    # pt-table-checksum --nocheck-binlog-format --recursion-method="processlist" --replicate=vodb.checksums  --host=10.168.21.186 --port=3313 -uautomng -pAutomng_123 --databases=vodb
    Checking if all tables can be checksummed ...
    Starting checksum ...
                TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
    07-24T14:22:59      0      0    28850          0       4       0   0.203 vodb.test
    
    # pt-table-checksum --nocheck-binlog-format --recursion-method="processlist" --replicate=vodb.checksums  --host=10.168.21.186 --port=3313 -uautomng -pAutomng_123 --databases=vodb
    Checking if all tables can be checksummed ...
    Starting checksum ...
                TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
    07-24T14:23:04      0      0    37302          0       4       0   0.581 vodb.test

    6. 在从库插入数据使主从数据不一致

    mysql> use vodb;Database changed
    mysql> desc test;
    +---------+-------------+------+-----+---------+----------------+
    | Field   | Type        | Null | Key | Default | Extra          |
    +---------+-------------+------+-----+---------+----------------+
    | tid     | int(11)     | YES  |     | NULL    |                |
    | tname   | varchar(12) | YES  |     | NULL    |                |
    | test_id | int(11)     | NO   | PRI | NULL    | auto_increment |
    +---------+-------------+------+-----+---------+----------------+
    3 rows in set (0.01 sec)
    
    mysql> select max(test_id) from test;
    +--------------+
    | max(test_id) |
    +--------------+
    |       220000 |
    +--------------+
    1 row in set (0.00 sec)
    
    mysql> insert into test values(220001,'实打实的手敲代码',220001);
    Query OK, 1 row affected (0.03 sec)

    查看主从数据一致性

    # pt-table-checksum --nocheck-binlog-format --recursion-method="processlist" --replicate=vodb.checksums  --host=10.168.21.186 --port=3313 -uautomng -pAutomng_123 --databases=vodb
    Checking if all tables can be checksummed ...
    Starting checksum ...
                TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
    07-24T14:24:48      0      1   220000          1       4       0   0.605 vodb.test

    DIFFS列值不为零,就表示vodb.test这张表数据存在主从不一致的情况

    7.  pt-table-sync命令可以修改主从数据不一致的情况,但不推荐使用,建议还是手工排查出数据库不一致的原因,以防该现象重复出现,而不是一个命令执行完毕,数据库数据一致了,也不清楚该命令到底做了些什么。

    这里不再操作该命令,若有兴趣可参考官方文档进行操作 https://www.percona.com/doc/percona-toolkit/3.0/pt-table-sync.html

    8. 手工删除从库不一致数据

    mysql> select max(test_id) from test;
    +--------------+
    | max(test_id) |
    +--------------+
    |       220001 |
    +--------------+
    1 row in set (0.00 sec)
    
    mysql> 
    mysql> 
    mysql> delete from test where test_id=220001;
    Query OK, 1 row affected (0.05 sec)

    9. 再次验证数据库一致性

    # pt-table-checksum --nocheck-binlog-format --recursion-method="processlist" --replicate=vodb.checksums  --host=10.168.21.186 --port=3313 -uautomng -pAutomng_123 --databases=vodb
    Checking if all tables can be checksummed ...
    Starting checksum ...
                TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
    07-24T15:28:30      0      0   220000          0       4       0   0.659 vodb.test

    回顾总结

    工具的安装不需要在主库上,也不需要在从库上,只需要在一台能够连接到主库的服务器上安装即可

    连接用户要具有ALL PRIVILEGES 权限

    pt-table-checksum --nocheck-binlog-format --recursion-method="processlist" --replicate=vodb.checksums --host=10.168.21.186 --port=3313 -uautomng -pAutomng_123 --databases=vodb

    DIFFS列值为0则数据一致,反之则不一致。

  • 相关阅读:
    NFS服务
    SSH服务
    DNS服务器
    FTP服务器
    linux(磁盘配额)
    linux(ACL权限控制)
    linux(日志)
    linux(系统安全)
    linux(进程和计划任务)
    linux(引导)
  • 原文地址:https://www.cnblogs.com/perfei/p/9359532.html
Copyright © 2011-2022 走看看