闪回查询

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

适用场景

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

相关参数设置

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

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

输出结果:

参数设置

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

输出结果:

disql 参数设置

注意

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

  • 开启闪回功能方法二,示例语句如下所示:
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';

输出结果:

参数设置

闪回查询

按时间查询历史记录

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

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

SELECT *
  FROM dmhr.city
 WHERE city_id = 'CD';

UPDATE dmhr.city
   SET region_id = 10
 WHERE city_id = 'CD';

SELECT *
  FROM dmhr.city
 WHERE city_id = 'CD';

SELECT *
  FROM dmhr.city 
  WHEN TIMESTAMP '2020-11-03 09:56:06'
  WHERE city_id='CD';

输出结果:

按时间查询历史记录

按事务 id 号查询历史记录

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

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

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

输出结果:

按事务 id 号查询历史记录

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;

输出结果:

执行闪回版本查询

两个事务分别对应了 2 个版本,可以随意查询任何版本。示例语句如下所示:

SELECT * FROM dmhr.job WHEN TRXID 58519 WHERE JOB_ID=22;

输出结果:

执行闪回版本查询

显示了第一次提交后的数据。

闪回事务查询

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

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

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

输出结果:

闪回事务查询

参考文档

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

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