MST

星途 面试题库

面试题:MariaDB中如何利用mysqlbinlog工具进行数据恢复与主从复制一致性校验?

假设在MariaDB主从复制架构中,从库数据出现不一致情况,同时有完整的二进制日志。请详细说明如何借助mysqlbinlog工具进行数据恢复,以及如何校验主从库数据一致性,包括可能用到的命令、参数及操作流程。
42.0万 热度难度
数据库MariaDB

知识考点

AI 面试

面试题答案

一键面试

借助mysqlbinlog工具进行数据恢复

  1. 确定主库二进制日志位置
    • 在主库上执行 SHOW MASTER STATUS; 命令,记录下 FilePosition 的值,这两个值标识了主库当前二进制日志的位置。例如:
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)
  • 这里 Filemysql - bin.000003Position154
  1. 从库停止复制
    • 在从库上执行 STOP SLAVE; 命令停止主从复制。
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)
  1. 使用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
  1. 重启从库复制
    • 在从库上执行 START SLAVE; 命令重新启动主从复制。
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

校验主从库数据一致性

  1. 基于表行数校验
    • 在主库和从库上分别对需要校验的数据库和表执行 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)
  • 如果主从库对应表的行数一致,说明数据在数量上可能是一致的,但这种方法不能保证数据内容完全一致。
  1. 基于数据校验工具
    • 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 表读取主库计算的校验和,并与从库数据进行对比。如果输出没有错误信息,说明主从库数据一致。如果有错误,会显示哪些表的数据不一致。
  2. 基于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 且有从库数据写入主库等复杂情况,还需要结合其他方法进一步确认。