通过一个完整的数据全量备份(快照)以及后续一段时间的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存储引擎的表。
数据状态:不支持恢复已归档为冷数据的表。
注意事项
时间点恢复是指选择一个特定的时间点,对数据库表进行恢复操作。恢复后,数据库表将仅包含该时间点的数据,即此时数据库中的表数据将与该时间点一致。
当前库表恢复方式中的恢复到过去时间点,只支持从一级备份的过去时间点恢复,不支持从二级备份恢复。
在以下场景执行库表恢复操作时,库表恢复会执行失败。
指定的库名或表名在原集群中已存在。
从备份集生成时间点到恢复时间点期间,恢复的表被删除或集群中存在与目标库或目标表同名的库表。
库表恢复只会恢复指定的表,操作时请确认已选中所有需要恢复的表。
说明若无法确定所有涉及的表,建议您将整个集群的历史数据恢复到一个新集群后再迁移至原集群。更多详情,请参见全量恢复方式1:从备份集恢复和全量恢复方式2:恢复到过去时间点。
若选择非整库恢复,该库每次最多支持恢复100张表。若选择恢复库,则支持恢复的表数量为该库下所有的表。
说明若一次恢复的表数量太多,恢复时间会较长,因此不建议一次恢复过多表。
若您需要恢复的表数量较多,建议您选择恢复全量历史数据到新集群中的方案,详细操作步骤,请参见全量恢复方式1:从备份集恢复和全量恢复方式2:恢复到过去时间点。
集群内的表(包括系统表)超过50000张时也可以使用库表恢复功能。
说明该功能目前处于灰度阶段,如需使用,您可以联系我们加入白名单,启用该功能。
查询集群内的表(包括系统表)数量。SQL语句如下:
SELECT COUNT(*) FROM information_schema.tables;查询集群内的系统表数量。SQL语句如下:
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema IN ('sys', 'performance_schema', 'mysql', 'information_schema', '__recycle_bin__');
库表恢复功能不支持恢复触发器(Trigger),若原表设置了Trigger,该Trigger不会被恢复。
库表恢复功能不支持恢复外键(Foreign Key),若原表设置了Foreign Key,该Foreign Key不会被恢复。
建议在业务低峰期进行数据恢复。
步骤一、获取误操作的时间点
如果您已知误操作的时间点,可以跳过本步骤。如果您不记得误操作的具体时间点,可以通过此步骤查看。
方式一:SQL洞察
对于PolarDB MySQL版集群版,若集群已开通SQL洞察功能,可通过该功能查看审计日志,获取误操作的时间点。
SQL洞察会收费,费用与审计日志的存储容量和存储时长有关。关于更多SQL洞察的说明,请参见SQL洞察。
SQL洞察功能仅支持查看开通该功能后产生的SQL日志。因此若集群未开通SQL洞察,可通过方式二查看误操作时间点。
方式二:远程获取并解析Binlog日志
-
为集群开启Binlog。详细操作步骤,请参见开启Binlog。
说明您需要先为集群开启Binlog才能查看并获取Binlog日志,否则将出现
You are not using binary logging错误提示。 -
在本地服务器上安装MySQL,并通过MySQL客户端连接集群。详细操作步骤,请参见连接数据库集群本文以Linux系统为例。
root@xxx:~# mysql -h xxx-polardb.rwlb.rds.aliyuncs.com -P3306 -utest_api -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is xxx Server version: 8.0.13 Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> -
在已连接集群的客户端中执行如下命令查看目标集群的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--read-from-remote-server表示从MySQL服务器读取二进制日志,而不是从本地日志文件读取。
--read-from-remote-server--raw表示将获取到的Binlog文件按数据原有格式打印,而不会展示解析后的数据。
--rawmysql-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日志内容如下所示:
[root@iZxxx ~]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000110 | more /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #160217 23:04:37 server id 2802943055 end_log_pos 107 Start: binlog v 4, server v 5.5.18.1-log created 160217 23:04:37 # at 107 #160217 23:04:38 server id 2802943055 end_log_pos 171 Query thread id=584632 exec time=0 error code=0 SET TIMESTAMP=1xxx8/*!*/; SET @@session.pseudo_thread_id=584632/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=2097152/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 171 -
-
在获取Binlog日志文件内容后,可解析Binlog日志。
步骤二、开始库表恢复
登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。
在左侧导航栏中,选择,单击库(表)恢复。
在弹出的对话框中,选择恢复方式为按时间点,并选择需要恢复至的时间点。
说明恢复至的时间点选择需符合可恢复时间点的限制,同时离该时间点最近一份全量备份集中必须存在需要恢复的表,才能正常使用按时间点恢复功能。可恢复时间点的范围与备份设置中的日志备份保留期限有关,默认为7天。
库表恢复功能根据所占用的IOPS可分为快速、常规和安全三种配置,您可以根据实际需求进行选择。恢复速度配置的预估耗时请参见库表恢复速度测试数据参考。
快速:向当前集群恢复数据期间,可能占用大量IOPS,建议在业务低峰期选择。
常规(4核以上规格推荐):向当前集群恢复数据期间,可能占用部分IOPS。
安全(4核及以下规格推荐):向当前集群恢复数据期间,仅占用少量IOPS,可能会大幅影响恢复速度。
4核及以下规格的集群建议确认
innodb_io_capacity以及innodb_io_capacity_max的设置和规格匹配。集群规格和最大支持IOPS请参见企业版计算节点规格以及标准版计算节点规格,并建议使用安全速度恢复。
在需要恢复的库和表区域左侧,选中需要恢复的目标库,并在右侧选中目标表。
说明若您未指定库名和表名,则系统会通过在原库名或原表名后添加
_backup的方式,来自动生成新的库名和表名。如原表为test,则自动生成的新的表名为test_backup。若选中目标库后但未指定具体的数据表,默认恢复该库下的所有数据。
确认已选择您需要恢复的库和表后,单击确定即可。
步骤三、进行数据比对
当库表恢复完成后,您可以登录集群进行数据比对,验证数据。
您可通过DMS登录集群,也可通过其他客户端或命令行的方式。本文介绍通过DMS登录集群进行验证,关于其他方式,请参考连接数据库集群。
在集群的基本信息页面右上角,单击登录数据库。
在弹出的对话框中,输入集群的数据库账号和数据库密码,单击登录。
登录DMS后请刷新页面,在左侧导航栏中,单击已登录实例。
在已登录实例列表中,单击目标集群名称,找到并双击目标数据库名称,即可切换到目标数据库进行管理。
查找到误操作的数据,确认其是否已恢复到误操作前,且其他数据也和误操作发生前一致。