个人准备了三台服务器(虚拟机)
虚拟机名称 | IP地址 | MYSQL 版本 |
---|---|---|
虚拟机1 | 192.168.243.134 | mysql8.0.36(主) |
虚拟机2 | 192.168.243.133 | mysql8.0.36(从) |
虚拟机3 | 192.168.243.130 | mysql8.0.36(从) |
主从配置的流程设计为 虚拟机2复制虚拟机1,虚拟机3复制虚拟机2
vim /etc/my.cnf
server-id=1 #服务id
log-bin=mysql-bin #binlog 日志文件
binlog-ignore-db= mysql # 不同步的数据库
replicat-do-db= gname # 仅同步数据库
gtid-mode =on (#开启gtid 模式,用于gtid 主从复制)
enforce-gtid-consistency=on (#强制gtid一致性,用于gtid 主从复制)
binlog_format =ROW #binlog 的格式 (可以通过 show VARIABLES like 'binlog_format%' 查看)
vim /etc/my.cnf
server-id=2 #服务id
log-bin=mysql-bin #binlog 日志文件
log-save-updates=1 #从库从从库收到的更新记录到从服务器自己的二进制文件中
gtid-mode =on (#开启gtid 模式,用于gtid 主从复制)
enforce-gtid-consistency=on (#强制gtid一致性,用于gtid 主从复制)
relay_log =/var/lib/mysql/mysql-replay-bin #中继日志的位置和名称
relay-log-index=/var/lib/mysql/mysql-relay-bin.index #中继日志索引的位置和名称
slave_net_timeout = 2 (#当salve 从主库库中读取log 数据失败后,等待多久重新建立连接并获取数据)
read_only=1 (#只读)
1.创建账号,并授予replication slave 权限
# 主库执行
CREATE USER 'slave'@'192.168.243.%' IDENTIFIED WITH mysql_native_password BY 'slave';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.243.%';
FLUSH PRIVILEGES;
show master status\G;(#查看主库状态)
2.从库执行命令:
mysql>change master to (change replication source to )master_host='192.168.243.134(133)',master_port=3306,master_user='slave',master_password='slave',source_connect_retry=20, master_auto_position=1;(#gtid 模式进行主从复制)
change master to master_host='192.168.243.134',master_port=3306,master_user='slave',master_password='slave',master_log_file='binlog.000001',master_log_pos=155 (#传统主从复制)
mysql> start slave;
mysql> show slave status\G;(#查看从库状态)
主库执行 :show variables like 'gtid%';(#查看gtid_purged)
mysql> show variables like 'gtid%';
+----------------------------------+-------------------------------------------+
| Variable_name | Value |
+----------------------------------+-------------------------------------------+
| gtid_executed | 5df92845-bb4d-11ee-9565-000c29745dca:1-13 |
| gtid_executed_compression_period | 0 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | 5df92845-bb4d-11ee-9565-000c29745dca:1-13 |
+----------------------------------+-------------------------------------------+
6 rows in set (0.00 sec)
从库执行 : reset master;
mysql> reset master;
Query OK, 0 rows affected, 28 warnings (0.01 sec)
mysql> set global gtid_purged='5df92845-bb4d-11ee-9565-000c29745dca:1-13';
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
# 至此问题解决
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y #安装相关的依赖包
yum install percona-toolkit-3.5.5-1.el9.x86_64.rpm #安装percona-toolkit
yum list | grep percona-toolkit #查看安装percona-toolkit
pt-table-checksum --help # 帮助命令
#虚拟机1(ip 192.168.243.134)
mysql>user wine;
mysql>insert into wine_sign values(1,1,1,1),(2,2,2,2);
mysql> select * from wine_sign;
+-----------+----------+-----------+-------------+
| member_id | add_time | applet_id | merchant_id |
+-----------+----------+-----------+-------------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
+-----------+----------+-----------+-------------+
2 rows in set (0.00 sec)
#虚拟机2(ip 192.168.243.133)
mysql>user wine;
mysql>insert into wine_sign values(1,1,1,1),(2,2,2,2),(3,3,3,3);
mysql> select * from wine_sign;
+-----------+----------+-----------+-------------+
| member_id | add_time | applet_id | merchant_id |
+-----------+----------+-----------+-------------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | 3 | 3 | 3 |
+-----------+----------+-----------+-------------+
3 rows in set (0.00 sec)
虚拟机1和虚拟机2 数据是不同的,使用工具检测 常用参数解释:
-nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用–databases来指定需要检查的数据库。
–no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
–replicate-check-only :只显示不同步的信息。
–replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
–databases= :指定需要被检查的数据库,多个则用逗号隔开。
–tables= :指定需要被检查的表,多个用逗号隔开
–check-slave-lag=: 需要检查从库的延迟,指定参数,当主从延迟时,从库暂停从主库写入数据;未指定参数,默认会检查从库的延迟,但是不会停止从库从主库写入数据
–skip-check-slave-lag= :不检查从库延迟
–ignore–databases=:忽略指定的数据库
–host | h= :Master的地址
–user | u= :用户名
–passwork | p=:密码
–Post | P= :端口
#主库执行(特别注意如果指定了只复制的数据库,--replicate 填写就写要效验的数据库)
pt-table-checksum --nocheck-replication-filters --replicate=wine.checksums --no-check-binlog-format --databases=wine --host=192.168.243.134 --tables=wine_sign --user=slave --password=slave
[root@localhost precona-toolkit]# pt-table-checksum --nocheck-replication-filters --replicate=wine.checksums --no-check-binlog-format --databases=wine --host=192.168.243.134 --tables=wine_sign --user=slave --password=slave
Checking if all tables can be checksummed ...
Starting checksum ...
# A software update is available:
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
01-30T12:01:40 0 1 2 1 1 0 0.361 wine.wine_sign
[root@localhost precona-toolkit]# pt-table-sync --replicate=wine.checksums h=192.168.243.134(主),u=slave(主),p=slave(主) h=192.168.243.133(从),u=slave(从),p=slave(从) --print #打印
Can't make changes on the master because no unique index exists at /usr/bin/pt-table-sync line 11025. while doing wine.wine_sign on 192.168.243.133 #表中没有唯一索引(需要加上唯一索引)
[root@localhost precona-toolkit]# pt-table-sync --replicate=wine.checksums h=192.168.243.134,u=slave,p=slave h=192.168.243.133,u=slave,p=slave --print
DELETE FROM `wine`.`wine_sign` WHERE `member_id`='3' LIMIT 1 /*percona-toolkit src_db:wine src_tbl:wine_sign src_dsn:h=192.168.243.134,p=...,u=slave dst_db:wine dst_tbl:wine_sign dst_dsn:h=192.168.243.133,p=...,u=slave lock:1 transaction:1 changing_src:wine.checksums replicate:wine.checksums bidirectional:0 pid:32231 user:root host:localhost.localdomain*/;
[root@localhost precona-toolkit]# pt-table-sync --replicate=wine.checksums h=192.168.243.134,u=slave,p=slave h=192.168.243.133,u=slave,p=slave --execute # 执行
[root@localhost precona-toolkit]# pt-table-checksum --nocheck-replication-filters --replicate=wine.checksums --no-check-binlog-format --databases=wine --host=192.168.243.134 --tables=wine_sign --user=slave --password=slave
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
01-30T14:07:27 0 0 2 0 1 0 0.335 wine.wine_sign
# 至此主从数据一致性恢复
pt-table-sync 参数解释
–replicate= :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
–databases= : 指定执行同步的数据库,多个用逗号隔开。
–tables= :指定执行同步的表,多个用逗号隔开。
–sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
h=127.0.0.1 :服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。
u=root :帐号。 p=123456 :密码。
–print :打印,但不执行命令。
–execute :执行命令。
[root@localhost ~]# touch pt-check-sync.sh
[root@localhost ~]# vi pt-check-sync.sh
#!/usr/bin/env bash
NUM=`pt-table-checksum --nocheck-replication-filters --replicate=wine.checksums --no-check-binlog-format --databases=wine --host=192.168.243.134 --tables=wine_sign --user=slave --password=slave | awk 'NR>1{sum+=$3}END{print sum}'`
if [ $NUM -eq 0 ] ;then
echo "Data is ok!"
else
echo "Data is error!"
pt-table-sync --replicate=wine.checksums h=192.168.243.134,u=slave,p=slave h=192.168.243.133,u=slave,p=slave --print
pt-table-sync --replicate=wine.checksums h=192.168.243.134,u=slave,p=slave h=192.168.243.133,u=slave,p=slave --execute
fi
[root@localhost ~]# sh pt-check-sync.sh