目录
5.1. 适用场景介绍 ¶
场景 | 描述 |
---|---|
表数据被误删除 | delete from <table_name>; |
表对象被误删除 | drop table <table_name>; |
数据库被误删除 | drop database <database_name>; |
数据文件(或data目录)被误删除 | 服务器数据文件或者data目录被误删除 |
数据分叉或应用回退 | 想数据还原至之前某个时间点 |
数据块损坏 | 出现数据坏块 |
5.2. 恢复数据矩阵 ¶
备份方式 | 归档日志是否存在 | 在线日志是否存在 | walminer是否可用 | 是否可恢复 | 是否丢数据 | 操作方式 |
---|---|---|---|---|---|---|
物理备份可用 | 存在 | 存在 | 可用 | 是 | 否 | 1.使用物理备份还原一个最新的版本 参考:高可用工具使用手册-物理 备份恢复工具手册 2.启动数据库会自动执行PITR |
不可用 | 是 | 否 | ||||
不存在 | 可用 | 是 | 恢复到物理备份+归档日志的状态 | |||
不可用 | 是 | 恢复到物理备份+归档日志的状态 | ||||
不存在 | 是 | 恢复到物理备份的状态 | ||||
逻辑备份可用 | 存在 | 存在 | 可用 | 是 | 否 | 1.使用物理备份还原一个最新的版本 参考:客户端工具-KingbaseES 客户端应用参考手册-sys_restore 2.使用WalMiner解析需要的归档和在线日志 参考:最佳实践-WalMiner最佳实践 3.导出解析出来的SQL结果 4.把SQL重新导入到刚还原的数据库里 |
不可用 | 是 | 恢复到逻辑备份的状态 | ||||
不存在 | 可用 | 是 | 恢复到物理备份+归档日志的状态 | |||
不可用 | 是 | 恢复到物理备份+归档日志的状态 | ||||
不存在 | 是 | 恢复到物理备份的状态 |
注意
如果物理备份和逻辑备份都不存在则无法恢复数据。
5.3. 常用恢复实践操作 ¶
5.3.1. RMAN恢复命令 ¶
另请参阅
有关RMAN恢复具体操作可参考《 KingbaseES物理备份恢复工具手册 》的还原章节。
5.3.2. 导出walminer表中数据 ¶
另请参阅
有关walminer的相关操作可参考《WalMiner日志逻辑解码工具使用指南》手册中的 WalMiner接口使用介绍 章节。
WalMiner日志逻辑解码工具使用指南
5.3.3. 把SQL文件数据导入到表中 ¶
另请参阅
有关SQL文件数据导入的相关操作可参考《 KingbaseES ksql工具用户指南及参考 》。
5.3.4. 数据块损坏恢复 ¶
数据库遇到外部故障、硬盘损坏或人为破坏等情况,可能会造成数据文件损坏,部分情况会造成数据完全无法读取。
5.3.4.1. 检查与发现数据损坏 ¶
从磁盘中读取数据或扫描磁盘数据时,均会触发数据块头损坏和数据块大小检测。校验和开启情况下,扫描时会进行校验和检查。
数据块头损坏、数据块大小不合法或校验和检查失败时,系统会进行数据损坏报错。
5.3.4.2. 应急恢复 ¶
针对数据块损坏的故障应急恢复,目前提供块自动恢复和使用物理备份进行恢复两种方式。
1) 对于主备&读写分离集群架构主库发生数据块损坏故障时,可以实现块自动恢复。
另请参阅
块自动恢复的前提条件请参阅本文 可自动恢复的故障场景 中的 “数据损坏故障” 相关说明 。
块自动恢复的使用说明请参阅 《KingbaseES主备和读写分离集群使用手册》 中的 在线自动块修复 。
2) 对于单机或者集群架构中所有节点均无数据正常且能完整工作的备用节点时,须使用物理备份进行恢复。
另请参阅
有关物理备份恢复的具体操作可参考《 KingbaseES物理备份恢复工具手册 》的恢复章节。
5.3.4.3. 数据抢救 ¶
需要进行数据抢救时,相关故障隔离参数如下。
5.3.4.3.1. IGNORE_CHECKSUM_FAILURE ¶
5.3.4.3.1.1. 参数功能 ¶
-
未开启,数据库读取数据页面时,检查checksums失败后,报错,中断
-
开启后,检查到checksum失败时,忽略error,报告一个warning并继续执行。读取出来的坏块页面的数据可能丢失或被篡改,其他正常数据页面的数据不受影响。
5.3.4.3.1.2. 参数影响范围 ¶
-
只有当data_checksums被启用时才有效。仅数据库实例读取页面时生效。
-
仅影响数据页面checksum失败的场景,如果数据页面头部被损坏,同样会报错中断,并不能输出数据内容。
-
对于大对象,toast表本身没有checksum位,不受影响;但执行toast表的普通表,和非大对象一样,会受到影响。
-
普通数据文件、vm文件、fsm文件都在checksum检查范围内,如果出现损坏会在检查时报错,可以忽略。但读取数据时,不会检查vm、fsm文件。
-
索引文件的数据块也在影响范围内,但只有通过索引进行查询时才会读取并检查索引文件。重建索引即可恢复正常。其他输出和检查逻辑同普通表一致。
5.3.4.3.1.3. 使用 ¶
-
配置文件
-
guc参数,默认不在目前的配置文件中出现。
-
可以将参数追加到kingbase.conf中,修改后reload生效,或者通过会话进行修改。
-
开启参数
-
超级用户可以使用set ignore_checksum_failure=on/off的方式即可设置参数,生效范围为当前会话。
-
可以将参数追加到kingbase.conf中,通过sys_ctl reload或restart生效,生效范围为所有会话。
5.3.4.3.1.4. 使用用例 ¶
-
块校验和检验失败
表testtable原存储内容如下。
test=# select * from testtable; a | b ---+--- 1 | a 2 | b (2 rows)
此时表遭遇外部破坏,在读取表testtable时遇到如下报错
test=# select * from testtable; WARNING: page verification failed, calculated checksum 51112 but expected 28384 ERROR: invalid page in block 1 of relation base/16172/16390
设置开启参数
test=# set ignore_checksum_failure=on; SET
之后重新进行查找表。
test=# select * from testtable; WARNING: page verification failed, calculated checksum 51112 but expected 28384 a | b ---+--- 1 | a 2 | c (2 rows)
校验和失败以warning形式报告,语句继续执行,能够正常读出数据,但读出数据可能被篡改。
-
块头数据损坏
块头数据损坏在读取时和校验和检验失败一致。
test=# select * from testtable; WARNING: page verification failed, calculated checksum 13238 but expected 13237 ERROR: invalid page in block 2 of relation base/16172/16390
通过sys_checksums进行检查能看到块头报错。
[test@admin release]$ ./bin/sys_checksums data -F sys_checksums: error: header verification failed in file "data/base/16172/16390", block 2
在这种情况下设置ignore_checksum_failure后仍然无法读取。程序报错error,无法读取数据。
test=# set ignore_checksum_failure=on; SET test=# select * from testtable; ERROR: invalid page in block 2 of relation base/16172/16390
需要使用其他参数辅助恢复。
5.3.4.3.2. ZERO_DAMAGED_PAGES ¶
5.3.4.3.2.1. 参数功能 ¶
-
未开启,出现任何形式的数据页面损坏,报错ERROR,中断退出
-
开启后,如果出现数据页面损坏(包括页面头损坏),该页的所有内容都会被暂时擦除,暂时作为空白页。该页对应的数据无法查询或更新,等同于丢失。除了在数据页面损坏时,使校验和未通过时不直接返回结束执行,也可以在文件和页不完整时忽略错误。
-
此参数生效优先级 < 自动块修复 < ignore_checksum_failure
改动只在内存中进行。该选项不会主动把改动刷入磁盘,关掉选项并重读页面即可恢复。autovacuum执行时会默认关闭zero_damaged_pages。
5.3.4.3.2.2. 参数影响 ¶
以下操作会使得数据发生改变(风险):
-
手动vacuum full,开启该选项会把空白页刷入磁盘覆盖文件中的错误数据块。
-
在开启参数的情况下insert、update写入,有覆盖该页原本内容的风险。
-
将表dump下来、或者select到另外一张临时表,把原来的表删除重建
5.3.4.3.2.3. 用户接口 ¶
-
配置文件
-
guc参数,默认不在目前的配置文件中出现,只能通过会话进行修改。
-
开启参数
-
超级用户可以使用set zero_damaged_pages=on的方式即可设置参数,生效范围为当前会话。
-
可以将参数追加到kingbase.conf中,通过sys_ctl reload或restart生效,生效范围为所有会话。
5.3.4.3.2.4. 使用用例 ¶
-
块校验和检验失败
表testtable原存储内容如下。
test=# select count(*) from testtable; count ------- 500 (1 row)
此时表遭遇外部破坏,在读取表testtable时遇到如下报错
test=# select count(*) from testtable; WARNING: page verification failed, calculated checksum 10488 but expected 10489 ERROR: invalid page in block 1 of relation base/16172/16400
设置开启参数
test=# set zero_damaged_pages=on; SET
之后重新进行查找。
test=# select count(*) from testtable; WARNING: page verification failed, calculated checksum 10488 but expected 10489 WARNING: invalid page in block1 of relation base/16172/16400; zeroing out page count ------- 226 (1 row)
错误块被清零处理,其他块可以正常读取。错误块中存储的数据丢失。
-
块头损坏
表testtable原存储内容如下。
test=# select count(*) from testtable; count ------- 2726 (1 row)
此时表遭遇外部破坏,在读取表testtable时遇到报错
test=# select count(*) from testtable; ERROR: invalid page in block 2 of relation base/16172/16400
通过sys_checksums进行检查能看到块头报错。
[test@admin release]$ ./bin/sys_checksums data -F sys_checksums: error: header verification failed in file "data/base/16172/16400", block 2
设置开启参数
test=# set zero_damaged_pages=on; SET
之后重新进行查找。
test=# select count(*) from testtable; WARNING: invalid page in block2 of relation base/16172/16400; zeroing out page count ------- 2500 (1 row)
错误块被清零处理,其他块可以正常读取。错误块中存储的数据丢失。