在mysql主从复制中,mysql5.1版本出现错误的次数比较高,如主库宕机或者从库宕机,日志损坏都会导致复制异常,通常需要手动修复或者重新同步。
如果数据不一致,会直接导致经济损失(电商),所以就利用pt-table-checksum工具来检查主从的一致性,以及通过pt-table-sync来同步未同步的数据。
服务器信息:
master:192.168.0.171
slave :192.168.0.178
数据库版本:mysql-5.1
数据库名称:test (安装完成后自带)
安装配置主从:
Master:
[root@localhost ~]# yum install -y mysql mysql-server perl perl-devel perl-Time-HiRes [root@localhost ~]# service mysqld start [root@localhost ~]# mysql mysql> use mysql; mysql> update user set password=password('root') where user = 'root'; mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; mysql> flush privileges;
Slava:
[root@localhost ~]# yum install -y mysql mysql-server perl perl-devel perl-Time-HiRes [root@localhost ~]# service mysqld start [root@localhost ~]# mysql mysql> use mysql; mysql> update user set password=password('root') where user = 'root'; mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; mysql> flush privileges;
master:
编辑/etc/my.cnf添加或修改:
log-bin=mysql-bin server-id=1 binlog-do-db=test binlog-ignore-db=mysql binlog_format=ROW
重启mysql服务。
show一下master信息:
[root@localhost ~]# mysql -uroot -proot mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 106 | test | mysql | +------------------+----------+--------------+------------------+
slave:
编辑/etc/my.cnf添加或修改:
master-port=3306 master-connect-retry=60 replicate-do-db=test replicate-ignore-db=mysql server-id=2
重启mysql服务。
配置从库同步:
[root@localhost ~]# mysql -uroot -proot mysql> stop slave; mysql> reset slave; mysql> change master to master_host='192.168.0.171', master_user='root', master_password='root', master_log_file='mysql-bin.000001', master_log_pos=106; mysql> start slave; mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.171 Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 106 Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
必须看到两个Yes为配置成功。
在主库上创建表:
create table teacher( id int(3) auto_increment not null primary key, name char(10) not null, address varchar(50) default 'qingdao', year date );
这里我用SQLyogEnt客户端工具往主数据库插入数据。
在从库上查看校验信息:
[root@localhost ~]# pt-table-checksum --user=root --password=root --host=192.168.0.171 --P=3306 --d=test --recursion-method=processlist --no-check-binlog-format --nocheck-replication-filters --replicate=test.checksums --set-vars innodb_lock_wait_timeout=50
解释:
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定–no-replicate-check时,会一直为0,当指定–replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
pt-table-checksum参数解释:
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。 --no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。 --replicate-check-only :只显示不同步的信息。 --replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。 更多参数可以 pt-table-checksum --help查看
继续往主库插入2条数据,查看从库是否同步。如果同步完成,把从库的最后两条数据(id=2 id=3)删除。
在从库上再查看校验信息:
看到DIFFS为1,说明数据不一致。需要同步。
pt-table-sync可以做单向和双向同步的表数据。可以同步单个表,也可以同步整个库。但它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。
[root@localhost ~]# pt-table-sync --execute --replicate test.checksums --sync-to-master h=192.168.0.178,P=3306,u=root,p=root --print
解释:
–replicate= :指定通过pt-table-checksum得到的表
–databases= :指定执行同步的数据库,多个用逗号隔开
–tables= :指定执行同步的表,多个用逗号隔开
–sync-to-master :通过show processlist或show slave status 去自动的找主
h=192.168.0.178 :Slave的地址
u=root :用户名
p=root :密码
–print :打印信息,但不执行命令
–execute :执行命令
再通过SQLyogEnt查看两台机器数据同步完成了。
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/3300.html