将 MySQL 数据库恢复到某个时间点

Bytebase 是一款开源数据库工具,它面向整个研发组织设计,旨在帮助应用开发者和 DBA 更安全、更高效地管理应用开发生命周期中的数据库操作 (Database DevOps)。

在日常工作中,如果遇到下面这些问题,你会如何处理呢?

  • 不小心删除了一张表或者删除了一些用户数据

  • 应用程序发布了一个包含数据库变更的新版本,但这个新版本上线后不能正常运行

此时此刻,你希望自己能拥有一台时光机

在 MySQL 中,用时光机回到过去的任意时刻,相当于用备份文件和数据库日志文件将数据库恢复到事故发生前的某个时间点。这个操作过程不仅复杂,而且依赖经验丰富的 DBA。如果用 Bytebase 来完成基于时间点恢复(PITR)的操作,仅需点击几次按钮即可,并且整个过程有明确的进度反馈。接下来,本文将介绍基于时间点恢复(PITR)在 Bytebase 中的工作原理和操作步骤。

工作原理

Bytebase 完成一次基于时间点恢复(PITR)的过程如下:

  1. 找到早于指定恢复时间点最近的一次备份

  2. 将上一步中的备份恢复到一个临时的数据库

  3. 在临时数据库上重新执行从备份时间点到指定恢复时间点之间的数据库日志文件

  4. 用临时数据库替换目标数据库,并将旧数据库重命名以供手动检查

最后一步表明 PITR 在 Bytebase 中是原地恢复(in-place recovery),因此在数据库恢复完成后不需要更改应用程序的代码

如何将数据库恢复到某个指定的时间点?

假设有一个 MySQL 数据库「db_pitr_example」,它有 2 个表「pitr_one」和「pitr_two」。

由于表「pitr_two」被不小心删除了,导致某个应用突然中断了服务。DBA 在得知此事故后,立即着手恢复被删除的表。

接下来,我们将演示在 Bytebase Console 中如何将数据库恢复到事故发生前的某个时间点。

1. 单击选项卡「备份和恢复」,然后点击「恢复到指定时间点」。

2. 指定数据库恢复的具体时间点,并单击「确认」。

3. 点击「批准」开始执行第一个任务,或者将这个 issue 重新指派给其他人进行审核。

当第一个任务完成后,再次点击「批准」开始执行第二个任务。

如下图所示,数据库「db_pitr_example」已完成了一次基于时间点恢复的操作。

我们来验证一下 PITR 的执行结果。如下图所示,被删除的表「pitr_two」已经被找回了,应用又恢复了服务。

了解更多

我们刚刚演示了如何用 Bytebase Console 来将事故数据库恢复到指定的时间点。Bytebase 提供的基于时间点恢复(PITR)功能是一种原地恢复(in-place recovery),这意味着在数据库恢复后无需更改应用程序代码即可恢复事故前的应用程序状态。要了解更多有关 Bytebase 基于时间点恢复的信息,请参阅我们的文档(https://www.bytebase.com/docs/operating/disaster-recovery#point-in-time-recovery-for-mysql)。

感谢您阅读本文。如果您有任何意见或问题,欢迎向我们反馈(https://github.com/bytebase/bytebase/issues)。

MySQL 数据库恢复到指定时间点有多种方法: - **使用备份文件和日志文件**:在 MySQL 中,可利用备份文件和数据库日志文件将数据库恢复到事故发生的某个时间点,但此操作过程复杂,依赖经验丰富的 DBA。而使用 Bytebase 完成基于时间点恢复(PITR)操作,仅需点击几次按钮,且整个过程有明确的进度反馈 [^1]。 - **确定 binlog 及位点**:假设要将数据库恢复到 2023 - 06 - 25 16:45:00,需根据各个 binlog 的时间信息,恢复到 binlog.000021,并从该 binlog 中找到 16:45:00 对应的位点,可使用命令:`mysqlbinlog --stop-datetime="2023-06-25 16:45:01" binlog/binlog.000021 | grep -A 1 "^# at" | tail -2`,示例结果为: ``` # at 340009 #230625 16:45:00 server id 23480 end_log_pos 340040 CRC32 0xa1841663 Xid = 88279 ``` [^2] - **在实例上执行命令**:到需要进行时间点恢复的实例上执行以下命令: ```sql mysql> reset slave all; Query OK, 0 rows affected, 1 warning (0.03 sec) mysql> change master to master_host='172.16.121.234', master_port=16380, master_user='rep', master_password='rep123', get_master_public_key=1, master_log_file='binlog.000020', master_log_pos=610; Query OK, 0 rows affected, 9 warnings (0.13 sec) mysql> start slave until master_log_file='binlog.000021', master_log_pos=340009; Query OK, 0 rows affected, 3 warnings (0.03 sec) ``` [^3] - **全备恢复**:先进行全备,使用命令 `mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > backup_sunday_1_PM.sql`,然后恢复全备,使用命令 `mysql < backup_sunday_1_PM.sql` [^4]。 - **指定时间和位置导出 binlog**:根据自身情况修改结束位置,使用命令 `mysqlbinlog -d aibuy --start-datetime='2022-05-05 16:36:46' --stop-position=116803630 mysql-bin.000001 > /usr/local/src/01.sql` [^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值