借助mysqlbinlog工具进行数据恢复
- 确定主库二进制日志位置:
- 在主库上执行
SHOW MASTER STATUS;
命令,记录下 File
和 Position
的值,这两个值标识了主库当前二进制日志的位置。例如:
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql - bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
- 这里
File
为 mysql - bin.000003
,Position
为 154
。
- 从库停止复制:
- 在从库上执行
STOP SLAVE;
命令停止主从复制。
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)
- 使用mysqlbinlog工具重放日志:
- 找到主库上对应的二进制日志文件(根据上面记录的
File
值),假设该文件在 /var/lib/mysql - data
目录下。
- 使用
mysqlbinlog
工具将二进制日志内容重定向到一个SQL脚本文件。例如:
mysqlbinlog --start - position=154 /var/lib/mysql - data/mysql - bin.000003 > recovery.sql
- 这里
--start - position
参数指定了从哪个位置开始重放日志,数值为上面记录的 Position
值。
- 然后将生成的
recovery.sql
文件传输到从库。
- 在从库上执行这个SQL脚本,将数据恢复。假设从库上
mysql
命令路径为 /usr/bin/mysql
,数据库用户为 root
,密码为 password
,数据库名为 test
,执行命令如下:
/usr/bin/mysql - uroot - ppassword test < recovery.sql
- 重启从库复制:
- 在从库上执行
START SLAVE;
命令重新启动主从复制。
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
校验主从库数据一致性
- 基于表行数校验:
- 在主库和从库上分别对需要校验的数据库和表执行
SELECT COUNT(*) FROM table_name;
命令。例如:
-- 主库
mysql> USE test;
Database changed
mysql> SELECT COUNT(*) FROM users;
+----------+
| COUNT(*) |
+----------+
| 100 |
+----------+
1 row in set (0.00 sec)
-- 从库
mysql> USE test;
Database changed
mysql> SELECT COUNT(*) FROM users;
+----------+
| COUNT(*) |
+----------+
| 100 |
+----------+
1 row in set (0.00 sec)
- 如果主从库对应表的行数一致,说明数据在数量上可能是一致的,但这种方法不能保证数据内容完全一致。
- 基于数据校验工具:
- pt - table - checksum工具:
- 安装
Percona Toolkit
,如果使用的是 yum
安装(适用于CentOS等系统),执行 yum install percona - toolkit
。
- 在主库上执行
pt - table - checksum --user=root --password=password --host=127.0.0.1 --recursion - method=dsn="h=127.0.0.1,u=root,p=password" database=test
。这里 --recursion - method
参数用于指定递归获取数据库和表信息的方式,database
参数指定要校验的数据库。
- 该工具会在主库上计算数据的校验和,并将结果写入
percona.checksums
表(如果不存在会自动创建)。
- 在从库上执行
pt - table - checksum --replicate=percona.checksums --user=root --password=password --host=127.0.0.1
。该命令会从 percona.checksums
表读取主库计算的校验和,并与从库数据进行对比。如果输出没有错误信息,说明主从库数据一致。如果有错误,会显示哪些表的数据不一致。
- 基于GTID(全局事务标识符)校验:
- 在主库上执行
SHOW GLOBAL VARIABLES LIKE 'gtid_executed';
,记录下 Value
的值。
mysql> SHOW GLOBAL VARIABLES LIKE 'gtid_executed';
+------------------+--------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------+
| gtid_executed | 123e4567 - e89b - 12d3 - a456 - 426614174000:1 - 10 |
+------------------+--------------------------------------+
1 row in set (0.00 sec)
- 在从库上执行
SHOW GLOBAL VARIABLES LIKE 'gtid_executed';
,并对比主从库 gtid_executed
的值。如果值完全相同,说明主从库执行的事务完全一致,数据大概率是一致的。但如果主库开启了 log - slave - updates
且有从库数据写入主库等复杂情况,还需要结合其他方法进一步确认。