mysql主从复制,对于一致性的校验和恢复

一:主从一致性问题校验

在理想情况下,备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误,备库同样可能因为MySQL自身的特 性导致数据不一致,例如MySQL的Bug感、网络中断、服务器崩溃,非正常关闭或者其他一些错误。 
按照我们的经验来看,主备一致应该是一种规范,而不是例外,也就是说,检查你的主备库一致性应该是一个日常工作,特别是当使用备库来做备份时尤为重 要,因为肯定不希望从一个已经损坏的备库里获得备份数据。 
我们可以使用percona-toolkit工具做校验,而该工具包含 
1. pt-table-checksum 负责检测MySQL主从数据一致性 
2. pt-table-sync负责当主从数据不一致时修复数据,让他们保存数据的一致性
3. pt-heartbeat 负责监控MySQL主从同步延迟

安装(主上安装)
1、 yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y
2、yum install percona-toolkit-3.0.3-1.el6.x86_64.rpm
3、yum list | grep percona-toolkit
4、pt-table-checksum --help
在这里插入图片描述
5、使用工具检测
注意常用的参数解释:
–nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用
–databases来指定需要检查的数据库。
–no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
–replicate-check-only :只显示不同步的信息。
–replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
–databases= :指定需要被检查的数据库,多个则用逗号隔开。
–tables= :指定需要被检查的表,多个用逗号隔开
–host | h= :Master的地址
–user | u= :用户名
–passwork | p=:密码
–Post | P= :端口

pt-table-checksum --nocheck-replication-filters --replicate=check_data.checksums --databases=laravel --tables=test --user=root --password=root

在这里插入图片描述
可能出现问题:
要是在执行命令的过程遇到找不到从服务器的错误:
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.

在这里插入图片描述

默认是通过show processlist 找到host的值或show slave hosts 找到host的值
主库使用show slave hosts;查询从库hosts
在这里插入图片描述
在从库的配置文件里加: /etc/my.cnf
report_host = 192.168.124.134 #设置成本地地址
在这里插入图片描述

如果这种方式不行,可以替换为dsn的方式进行校验。

什么是dsn?
dsn方法:dsn是参数–recursion-method的一个参数值。注意是dsn,不是dns…

DSN:DSN,即DATA SOURCE NAME,数据源名称。DSN包含从库的各个连接参数(user、password、port等),由逗号分隔的多个option=value字符串 组成。
如:h=host,P=3309,u=username,p=passwd。
dsn方法是指将从库的DSN信息存储在表(DSN表)里,然后将该表和DSN信息赋值给dsn,作为–recursion-method的参数值。
格式如:–recursion-method dsn=D=percona,t=dsns,h=host,P=3309,u=username,p=passwd。
当指定pt-table-checksum的–recursion-method参数值为dsn时,它只会连接和检测这些指定的从库。当从库的MySQL用户名、密码、端口与主库不相同时,也 可以通过dsn的方式来指定。

DSN的部分选项如下:
D:DSN表所在的数据库名。
h:从库的host。
p:小写p,从库的密码。当密码包括逗号(,)时,需要使用反斜杠转义。
P:大写P,从库的端口。
S:连接使用的socket文件。
t:存储DSN信息的DSN表名。
u:从库的MySQL用户名。
每一个选项和其值的形式为option=value,=的前后不能空格,如果选项值有空格,则必须使用引号引起来。

DSN表结构如下:
在主库中创建:
CREATE TABLE dsns (
id int(11) NOT NULL AUTO_INCREMENT,
parent_id int(11) DEFAULT NULL,
dsn varchar(255) NOT NULL,
PRIMARY KEY (id)
);
存储在表中的DSNs是以id值排序,但是这里可以忽略id和parent_id列,只需将从库的DSN信息存储在dsn列即可。存储的DSN格式如前面在命令行上指定DSN一样, 如:
h=host,P=3309,u=username,p=passwd。

先在从库中创建一个可以让主库远程连接的账号
CREATE USER ‘check1’@’%’ IDENTIFIED WITH mysql_native_password BY ‘check1’;
grant all privileges on . to ‘check1’@’%’ with grant option;
如果连接不上,可能是防火墙问题
service iptables stop(关闭防火墙)
创建好表后新增从节点的连接信息:
INSERT INTO laravel.dsns(dsn) VALUES (“h=192.168.124.136,P=3306,u=check1,p=check1”);
INSERT INTO laravel.dsns(dsn) VALUES (“h=192.168.124.134,P=3306,u=check2,p=check2”);、

检测:

[root@localhost ~]# pt-table-checksum --tables=test --socket=/tmp/mysql.sock --databases=laravel --user=root --password=‘root’ --replicate=check_data.checksum --no-check-binlog-format --recursion-method dsn=t=laravel.dsns,h=192.168.124.136,P=3306,u=check1,p=check1
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
05-12T01:30:30 0 0 2 1 0 1.050 laravel.test
在这里插入图片描述

二。主从数据库数据恢复一致性请看
https://editor.csdn.net/md/?articleId=106423571

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值