闪回查询

本章节主要介绍闪回技术在日常开发和数据库运维中所发挥的作用。

一、适用场景

软件 版本
操作系统 Redhat 7 及以上版本
DM 数据库 DM 8.0 及以上版本
CPU 架构 x86、ARM、龙芯、飞腾等国内外主流 CPU

二、使用说明

  • 闪回查询只支持普通表(包括加密表与压缩表)、水平分区表和堆表,不支持临时表、列存储表、外部表与视图;
  • 闪回查询中 trxid 的值,一般需要由闪回版本查询的伪列来确定。实际使用中多采用指定时刻的方式。

三、相关参数设置

查询闪回功能状态,数据库默认关闭 (0-关闭,1-打开)。示例语句如下所示:

SELECT name,
       TYPE,
       VALUE,
       sys_value,
       file_value
  FROM v$parameter
 WHERE name LIKE '%FLASHBACK%';

输出结果:

image.png

  • 开启闪回功能方法一,示例语句如下所示:
alter system set 'enable_flashback'=1 both;

输出结果:

image.png

注意

该方法设置参数时,参数名必须加单引号。

  • 开启闪回功能方法二,示例语句如下所示:
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);

--scope 为 1 表示 dm.ini 文件和内存参数都修改,不需要重启服务器。
--scope 为 2 表示只修改 dm.ini 文件,服务器重启后生效。
--value: 设置的值。

获取参数,示例语句如下所示:

SELECT SF_GET_PARA_VALUE (1, 'ENABLE_FLASHBACK') in_file,
       SF_GET_PARA_VALUE (2, 'ENABLE_FLASHBACK') in_mem;

由于回滚段默认每秒种都会自动清理,所以需要延长回滚记录的保留时间,单位是秒。回滚段参数太大容易引发回滚段膨胀,这里设置为 1200s。示例语句如下所示:

ALTER SYSTEM SET 'undo_retention'=1200 BOTH;

SELECT name,
       TYPE,
       VALUE,
       sys_value,
       file_value
  FROM v$parameter
 WHERE name = 'UNDO_RETENTION';

输出结果:

image.png

四、闪回查询

4.1 按时间查询历史记录

通过指定一个时间(timestamp 类型),通常可以用一个日期时间字符串表达。

测试在 disql 工具中进行,使用 dmhr 模式下的 city 表。示例语句如下所示:

--查询 city_id = 'CD' 时 city 表中的信息
SELECT * FROM dmhr.city WHERE city_id = 'CD';

--更新 city_id = 'CD' 时 REGION_ID 的值,更新时间为 '2024-7-17 16:01:06'
UPDATE dmhr.city SET region_id = 6 WHERE city_id = 'CD';

--再次查询 city_id = 'CD' 时 city 表中的信息,此时 REGION_ID 的值为更新后的值
SELECT * FROM dmhr.city WHERE city_id = 'CD';

--闪回查询 update 操作前的 city 表中的信息,结果显示的是更新前 'REGION_ID' 的值
SELECT * FROM dmhr.city WHEN TIMESTAMP '2024-7-17 16:00:00' WHERE city_id='CD';

输出结果如下图所示:

image.png

4.2 按事务 id 号查询历史记录

首先使用 versions_endtrxid 伪列查询事务 id 号。用户通过闪回版本查询子句,可以得到指定表过去某个时间段内,事务导致记录变化的全部记录,指定条件可以为时刻或事务号。

执行闪回版本查询,示例语句如下所示:

SELECT versions_endtrxid, *
  FROM dmhr.job VERSIONS BETWEEN TIMESTAMP '2024-7-17 16:06:00' AND SYSDATE
 WHERE JOB_ID = 22;

输出结果:

image.png

NULL 表示该行的版本仍然是当前版本。

  • 第一次调整文员的最低工资为 3500 并提交,示例语句如下所示:
UPDATE dmhr.job SET MIN_SALARY = 3500 WHERE JOB_ID = 22;COMMIT;
  • 第二次调整文员的最低工资为 2800 并提交,示例语句如下所示:
UPDATE dmhr.job SET MIN_SALARY = 2800 WHERE JOB_ID = 22;COMMIT;

再次执行闪回版本查询,示例语句如下所示:

SELECT versions_endtrxid, *
  FROM dmhr.job VERSIONS BETWEEN TIMESTAMP '2020-11-03 10:30:00' AND SYSDATE
 WHERE JOB_ID = 22;

输出结果:

image.png

五、闪回事务查询

闪回事务查询提供系统视图 V$FLASHBACK_TRX_INFO,查看在事务级对数据库所做的更改。根据该视图信息,可以确定如何还原指定事务或指定时间段内的修改。

查询指定时间之后的事务信息,示例语句如下所示:

SELECT commit_trxid, operation,table_name,undo_sql FROM V$FLASHBACK_TRX_INFO;

六、参考文档

更多 SQL 语言使用说明,请参考《DM_SQL 语言使用手册》,手册位于数据库安装路径 /dmdbms/doc 文件夹下。如有其他问题,请在社区内咨询。

微信扫码
分享文档
扫一扫
联系客服