通过一个完整的数据全量备份(快照)以及后续一段时间的Redo日志,就可以将部分库或部分表的数据恢复到日志保存期限内任意时间点。在知晓误操作发生的时间点后,可以通过此方式,将误操作的数据库或者表恢复到误操作发生之前。
前提条件
已存在备份集。因为按时间点恢复是先将所选时间点前的一个全量数据备份恢复到集群,然后根据Redo日志恢复增量数据到所选时间点。若您希望提升恢复速度,可以开启增强备份,从而缩短备份周期,增加备份密度。
适用范围
集群版本
库表恢复功能支持PolarDB企业版和标准版,但对集群的修订版本有特定要求。不同场景下的最低版本要求如下表所示。
基础功能:代表支持库表恢复所需满足的最低版本。
GDN主集群/新版恢复流程:代表在全球数据库(GDN)主集群上使用,或想获得新版恢复流程速度优化时,所需满足的最低版本要求。
说明库表恢复的新版恢复流程是在旧版的基础上,对数据恢复至原集群的速度进行了优化。其原理和速度可参见整体流程和预估时间。
版本系列 | MySQL 版本 | 架构 | 基础功能(最低修订版本) | GDN主集群/新版恢复流程(最低修订版本) |
企业版(集群版) | 5.6 | X86 |
|
|
5.7 | X86 |
|
| |
8.0.1 | X86 |
|
| |
8.0.2 | X86 |
|
| |
标准版 | 5.6 | X86 |
|
|
5.7 | X86 |
|
| |
8.0.1 | X86 |
|
| |
倚天(ARM) |
|
| ||
8.0.2 | X86 |
|
|
您可在PolarDB MySQL版集群的基本信息页面的配置信息区域查看当前集群的内核版本。
其他限制
在使用库表恢复功能时,请注意以下不支持的场景:
集群:
不支持多主集群(Limitless)和全球数据库(GDN)中的从集群。
在以下任一情况下,不支持对超过50,000张表的集群进行库表恢复:
存储空间类型为ESSD云盘。
集群中无只读(RO)节点。
表结构与索引:
不支持包含全局二级索引(GSI)的表。
不支持恢复列存索引(IMCI)。
存储引擎:仅支持恢复InnoDB存储引擎的表。
数据状态:不支持恢复已归档为冷数据的表。
注意事项
时间点恢复是指选择一个特定的时间点,对数据库表进行恢复操作。恢复后,数据库表将仅包含该时间点的数据,即此时数据库中的表数据将与该时间点一致。
当前库表恢复方式只支持从一级备份恢复,不支持从二级备份恢复。
库表恢复只会恢复指定的表,操作时请确认已选中所有需要恢复的表。
说明若无法确定所有涉及的表,建议您使用集群恢复的方式恢复全量集群。
集群内的表(包括系统表)超过50000张时也可以使用库表恢复功能。
若选择非整库恢复,该库每次最多支持恢复100张表。若选择恢复库,则支持恢复的表数量为该库下所有的表。
说明若您需要恢复的表数量较多,建议您使用集群恢复的方式恢复全量集群。
库表恢复功能不支持恢复触发器(Trigger),若原表设置了Trigger,该Trigger不会被恢复。
库表恢复功能不支持恢复外键(Foreign Key),若原表设置了Foreign Key,该Foreign Key不会被恢复。
建议在业务低峰期进行数据恢复。
步骤一、获取误操作的时间点
如果您已知误操作的时间点,可以跳过本步骤。如果您不记得误操作的具体时间点,可以通过此步骤查看。
方式一:SQL洞察
对于PolarDB MySQL集群版,若集群已开通SQL洞察功能,可通过该功能查看审计日志,获取误操作的时间点。
SQL洞察功能仅支持查看开通该功能后产生的SQL日志。因此若集群未开通SQL洞察,可通过方式二查看误操作时间点。
方式二:远程获取并解析Binlog日志
- 为集群开启Binlog。详细操作步骤,请参见开启Binlog。说明 您需要先为集群开启Binlog才能查看并获取Binlog日志,否则将出现
You are not using binary logging
错误提示。 - 在本地服务器上安装MySQL,并通过MySQL客户端连接集群。详细操作步骤,请参见连接数据库集群。本文以Linux系统为例。
- 在已连接集群的客户端中执行如下命令查看目标集群的Binlog文件列表:
返回结果如下:show binary logs;
+------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000005 | 2639 | +------------------+-----------+ 1 row in set (0.00 sec)
- 在客户端执行如下命令,远程获取Binlog日志并保存至本地。本文中以Linux系统为例,需先执行exit退出MySQL后,才能远程获取Binlog日志并保存至本地。
执行如下语句:
mysqlbinlog -u<用户名> -p<密码> -h<连接地址> --read-from-remote-server --raw mysql-bin.******
参数 说明 示例值 -u
集群中的账号名称。 test_api
-p
以上账号的密码。如果此处留空,则在执行此命令后会被要求输入。 TestPwd123
-h
集群的公网连接地址。 说明- 若您的集群连接地址使用的是默认的端口号3306,端口号可省略不写,否则需要在连接地址后加上端口号。
- 当前仅支持通过主地址或集群地址(包括默认集群地址和自定义集群地址)的公网连接地址远程获取Binlog。如何申请公网连接地址,请参见管理连接地址。
test-polardb.rwlb.rds.aliyuncs.com
--raw
表示将获取到的Binlog文件按数据原有格式打印,而不会展示解析后的数据。 --raw
mysql-bin.******
通过 show binary logs;
命令获取的目标Binlog文件的名字,即Log_name
。mysql-bin.000005
示例:mysqlbinlog -utest_api -p -htest-polardb.rwlb.rds.aliyuncs.com --read-from-remote-server --raw mysql-bin.000005
- 执行如下命令,通过mysqlbinlog工具查看Binlog日志文件内容:
mysqlbinlog -vv --base64-output=decode-rows mysql-bin.****** | more
说明-vv
:查看具体SQL语句及备注。--base64-output=decode-rows
:解析Binlog日志文件。
具体的Binlog日志内容如下图中红框所示部分:
- 在获取Binlog日志文件内容后,可参见解析Binlong日志进行Binlog日志解析。
步骤二、开始库表恢复
登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。
在左侧导航栏中,选择
,单击库(表)恢复。在弹出的对话框中,选择恢复方式为按时间点,并选择需要恢复至的时间点。
说明恢复至的时间点选择需符合可恢复时间点的限制,同时离该时间点最近一份全量备份集中必须存在需要恢复的表,才能正常使用按时间点恢复功能。可恢复时间点的范围与备份设置中的日志备份保留期限有关,默认为7天。
库表恢复功能根据所占用的IOPS可分为快速、常规和安全三种配置,您可以根据实际需求进行选择。恢复速度配置的预估耗时请参见库表恢复速度测试数据参考。
快速:向当前集群恢复数据期间,可能占用大量IOPS(约60%),建议在业务低峰期选择。
常规【推荐】:向当前集群恢复数据期间,可能占用部分IOPS(约30%)。
安全:向当前集群恢复数据期间,仅占用少量IOPS(约15%),可能会大幅影响恢复速度。
在需要恢复的库和表区域左侧,选中需要恢复的目标库,并在右侧选中目标表。
说明若您未指定库名和表名,则系统会通过在原库名或原表名后添加
_backup
的方式,来自动生成新的库名和表名。如原表为test
,则自动生成的新的表名为test_backup
。若选中目标库后但未指定具体的数据表,默认恢复该库下的所有数据。
确认已选择您需要恢复的库和表后,单击确定即可。
步骤三、进行数据比对
当库表恢复完成后,您可以登录集群进行数据比对,验证数据。
您可通过DMS登录集群,也可通过其他客户端或命令行的方式。本文介绍通过DMS登录集群进行验证,关于其他方式,请参考连接数据库集群。
在集群的基本信息页面右上角,单击登录数据库。
在弹出的对话框中,输入集群的数据库账号和数据库密码,单击登录。
登录DMS后请刷新页面,在左侧导航栏中,单击已登录实例。
在已登录实例列表中,单击目标集群名称,找到并双击目标数据库名称,即可切换到目标数据库进行管理。
查找到误操作的数据,确认其是否已恢复到误操作前,且其他数据也和误操作发生前一致。