mysql基于GTID恢复数据
下面我将完整模拟从建库建表、误删数据库,到通过GTID进行数据恢复的全过程,包括导出和导入对应GTID事务的具体操作。
1. 环境准备:启用GTID配置
开启 GTID 需要设置以下关键参数(MySQL 5.6 及以上版本支持):
gtid_mode=ON:启用 GTID 模式(必填)
enforce_gtid_consistency=ON:强制 GTID 一致性(防止执行不支持 GTID 的语句,必填)
首先确保MySQL已启用GTID,配置如下(my.cnf/my.ini):
[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = /var/log/mysql/mysql-bin.log
server-id = 1
binlog_format = row
log_slave_updates = ON
重启MySQL服务使配置生效。
2. 完整操作流程
– 步骤1: 创建数据库和表并插入数据
CREATE DATABASE testdb;
USE testdb;CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE
);INSERT INTO users (username, email) VALUES
('alice', 'alice@example.com'),
('bob', 'bob@example.com'),
('charlie', 'charlie@example.com');
– 查看当前GTID执行情况
SHOW GLOBAL VARIABLES LIKE 'gtid_executed';
– 记录此时的GTID值,例如: c27a37ff-978f-11f0-b5d6-0050563a4b27:1-16
mysql> SHOW GLOBAL VARIABLES LIKE 'gtid_executed';
+---------------+-------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------+
| gtid_executed | c27a37ff-978f-11f0-b5d6-0050563a4b27:1-16 |
+---------------+-------------------------------------------+
1 row in set (0.01 sec)
– 步骤2: 模拟误删除操作
DROP DATABASE testdb;
– 确认数据库已删除
SHOW DATABASES LIKE 'testdb';
– 应返回空结果
– 步骤3: 查找需要恢复的GTID范围
– 查看二进制日志列表
SHOW BINARY LOGS;
或者使用
show master status;
mysql> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 177 |
| mysql-bin.000002 | 201 |
| mysql-bin.000003 | 201 |
| mysql-bin.000004 | 444 |
| mysql-bin.000005 | 3755 |
| mysql-bin.000006 | 1505 |
| mysql-bin.000007 | 1701 |
| mysql-bin.000008 | 3523 |
| mysql-bin.000009 | 2838 |
+------------------+-----------+
9 rows in set (0.00 sec)
可以确定当前使用的日志文件是mysql-bin.000009
– 查看具体日志文件中的GTID事件(假设日志文件为mysql-bin.000009)
SHOW BINLOG EVENTS IN 'mysql-bin.000009';
– 从日志中找到创建数据库到插入数据的GTID范围
– 例如: c27a37ff-978f-11f0-b5d6-0050563a4b27:14-16
– 步骤4: 在命令行使用mysqlbinlog导出指定GTID事务
– 注意:此命令在操作系统命令行执行,不是MySQL客户端
mysqlbinlog --skip-gtids --include-gtids='c27a37ff-978f-11f0-b5d6-0050563a4b27:14-16' /data/mysql/mysql-bin.000009 > recovery.sql
–skip-gtids参数的作用是忽略 binlog 中的 GTID 信息,即执行时不记录或不应用这些 GTID 到目标库的gtid_executed集合中
– 步骤5: 导入恢复文件
– 注意:此命令在操作系统命令行执行
mysql -u root -p < recovery.sql
– 步骤6: 验证恢复结果
USE testdb;
SELECT * FROM users;
– 应能看到之前插入的3条记录
– 查看当前GTID执行情况,确认已恢复
SHOW GLOBAL VARIABLES LIKE 'gtid_executed';
关键操作说明
-
GTID范围确定:
- 每个操作(创建库、创建表、插入数据)都会生成一个GTID
- 通过
SHOW BINLOG EVENTS
可以查看每个事务对应的GTID - 我们需要恢复的是从创建数据库到删除之前的所有GTID
-
导出GTID事务:
# 导出指定GTID范围的事务 mysqlbinlog --skip-gtids --include-gtids='UUID:起始编号-结束编号' 二进制日志文件 > 恢复文件.sql# 示例 mysqlbinlog --skip-gtids --include-gtids='3a1b2c3d-4e5f-6789-abcd-1234567890ab:1-4' /var/log/mysql/mysql-bin.000001 > recovery.sql
–skip-gtids参数的作用是忽略 binlog 中的 GTID 信息,即执行时不记录或不应用这些 GTID 到目标库的gtid_executed集合中
3. **导入恢复文件**:
```bash
# 导入恢复文件
mysql -u 用户名 -p < recovery.sql
- 验证恢复:
- 检查数据库和表是否重建
- 确认数据是否完整恢复
- 查看
gtid_executed
变量确认事务已应用
这种方法的优势在于可以精确恢复特定范围的事务,避免了全量备份恢复的冗余操作,特别适合处理误删除数据库这类场景。