返回顶部
首页 > 资讯 > 数据库 >DM7闪回与闪回查询
  • 572
分享到

DM7闪回与闪回查询

2024-04-02 19:04:59 572人浏览 八月长安
摘要

闪回 当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的UNDO记录来完成历史记

闪回
当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。

闪回技术主要是通过回滚段存储的UNDO记录来完成历史记录的还原。设置ENABLE_FLASHBACK为1后,开启闪回功能。DM会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。由UNDO_RETENTioN参数指定。

sql> select sf_get_para_value(1,'ENABLE_FLASHBACK');
LINEID     SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')
---------- ---------------------------------------
1          0
used time: 204.313(ms). Execute id is 62.
SQL> select sf_get_para_value(1,'UNDO_RETENTION');
LINEID     SF_GET_PARA_VALUE(1,'UNDO_RETENTION')
---------- -------------------------------------
1          90
used time: 6.236(ms). Execute id is 63.

下面修改动态参数ENABLE_FLASHBACK,scope=1同时修改内存和dm.ini文件

SQL> call sp_set_para_value(1,'ENABLE_FLASHBACK',1);
DMSQL executed successfully
used time: 13.216(ms). Execute id is 64.
SQL> select sf_get_para_value(1,'ENABLE_FLASHBACK');
LINEID     SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')
---------- ---------------------------------------
1          1
used time: 5.703(ms). Execute id is 65.

回滚段保留的时间缺省值为90秒,我们要修改它为1天

SQL> select sf_get_para_value(1,'UNDO_RETENTION');
LINEID     SF_GET_PARA_VALUE(1,'UNDO_RETENTION')
---------- -------------------------------------
1          90
used time: 6.236(ms). Execute id is 63.
SQL> call sp_set_para_value(1,'UNDO_RETENTION',86400);                            
DMSQL executed successfully
used time: 7.155(ms). Execute id is 74.
SQL> select sf_get_para_value(1,'UNDO_RETENTION');
LINEID     SF_GET_PARA_VALUE(1,'UNDO_RETENTION')
---------- -------------------------------------
1          86400
used time: 5.877(ms). Execute id is 75.

开启闪回功能后,DM会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的UNDO记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。闪回查询功能完全依赖于回滚段管理,对于DROP等误操作不能恢复。闪回特性可应用在以下方面:
1. 自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复;

2. 用于分析数据变化:可以对同一张表的不同闪回时刻进行链接查询,以此查看变化的数据。

闪回查询
当系统INI参数ENABLE_FLASHBACK置为1时,闪回功能开启,可以进行闪回查询。MPP环境不支持闪回查询。

SQL> select sf_get_para_value(1,'ENABLE_FLASHBACK');
LINEID     SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')
---------- ---------------------------------------
1          1
used time: 5.703(ms). Execute id is 65.
[root@shard1 jydm]# strings dm.ini | grep flash
ENABLE_FLASHBACK            =  1                    #Whether to enable flashback function

闪回查询子句
闪回查询子句的语法,是在数据查询语句(参考第4章)的基础上,为FROM子句增加了闪回查询子句。
语法格式
< 闪回查询子句>::=WHEN |

参数
1.time_exp 一个日期表达式,一般用字符串方式表示
2.trxid 指定事务ID号

语句功能
用户通过闪回查询子句,可以得到指定表过去某时刻的结果集。指定条件可以为时刻,或事务号

使用说明
1.闪回查询只支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、垂直分区表、列存储表、外部表与视图;

2.闪回查询中trxid的值,一般需要由闪回版本查询(见下节)的伪列来确定。实际使用中多采用指定时刻的方式。

例1闪回查询特定时刻的PERSON_TYPE表。
查询PERSON_TYPE表。

SQL> SELECT * FROM PERSON.PERSON_TYPE;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
used time: 15.321(ms). Execute id is 78.

在插入数据之前记录时间,在闪回查询时使用

SQL> select sysdate;
LINEID     SYSDATE                    
---------- ---------------------------
1          2019-12-01 23:34:12.761683
used time: 0.480(ms). Execute id is 79.
SQL> INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('防损员');
affect rows 1
used time: 0.615(ms). Execute id is 80.
SQL> INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('保洁员');
affect rows 1
used time: 0.562(ms). Execute id is 81.
SQL> commit;
executed successfully
used time: 16.237(ms). Execute id is 82.
SQL> SELECT * FROM PERSON.PERSON_TYPE;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          7             防损员
6          8             保洁员
6 rows Got
used time: 0.626(ms). Execute id is 83.

使用闪回查询取得2019-12-01 23:34:12时刻的数据。此时刻在插入数据的操作之前,可见此时的结果集不应该有2019-12-01 23:34:12时刻以后插入的数据。

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2019-12-01 23:34:12';
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
used time: 1.416(ms). Execute id is 84.

在2019-12-01 23:39:26时刻删除数据,并提交。

SQL> select sysdate;
LINEID     SYSDATE                    
---------- ---------------------------
1          2019-12-01 23:39:26.865328
used time: 0.580(ms). Execute id is 85.
SQL> DELETE FROM PERSON.PERSON_TYPE WHERE PERSON_TYPEID > 5;
affect rows 2
used time: 1.797(ms). Execute id is 86.
SQL> commit;
executed successfully
used time: 19.834(ms). Execute id is 87.
SQL> SELECT * FROM PERSON.PERSON_TYPE;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          5             防损员
used time: 0.691(ms). Execute id is 88.

使用闪回查询得到删除前的数据。

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2019-12-01 23:39:26';
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          5             防损员
6          6             保洁员
6 rows got
used time: 1.262(ms). Execute id is 89.

闪回查询指定TRXID的PERSON_TYPE表。
要获得TRXID信息,需要通过闪回版本查询的伪列VERSIONS_ENDTRXID。

在2019-12-01 23:45:27 时刻修改数据,并提交。

SQL> select sysdate;
LINEID     SYSDATE                    
---------- ---------------------------
1          2019-12-01 23:48:27.983996
used time: 0.509(ms). Execute id is 90.
SQL> SELECT * FROM PERSON.PERSON_TYPE;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          9             防损员
6          10            保洁员
6 rows got
used time: 0.515(ms). Execute id is 97.
SQL> UPDATE PERSON.PERSON_TYPE SET NAME='保安员' WHERE PERSON_TYPEID=9;
affect rows 1
used time: 1.460(ms). Execute id is 99.
SQL> commit;
executed successfully
used time: 16.640(ms). Execute id is 100.
SQL> UPDATE PERSON.PERSON_TYPE SET NAME='收银员' WHERE PERSON_TYPEID=9;
affect rows 1
used time: 1.851(ms). Execute id is 101.
SQL> commit;
executed successfully
used time: 16.781(ms). Execute id is 102.
SQL> SELECT * FROM PERSON.PERSON_TYPE;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          9             收银员
6          10            保洁员
6 rows got
used time: 0.516(ms). Execute id is 103.

进行闪回版本查询,确定TRXID。

SQL> SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2019-12-01 23:48:27.983996' AND SYSDATE;
LINEID     VERSIONS_ENDTRXID    NAME    
---------- -------------------- --------
1          NULL                 采购经理
2          NULL                 采购代表
3          NULL                 销售经理
4          NULL                 销售代表
5          NULL                 收银员
6          NULL                 保洁员
7          749195               保安员
7 rows got
used time: 1.384(ms). Execute id is 104.

根据TRXID确定版本。

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749195;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          9             保安员
6          10            保洁员
6 rows got
used time: 1.261(ms). Execute id is 105.

第二次更新的事务ID为749195,那么第一次更新的事务ID为749194

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749194;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          9             防损员
6          10            保洁员
6 rows got

闪回版本查询
语法格式
< 闪回版本查询子句>::=VERSIONS BETWEEN |

参数
1.time_exp 日期表达式,一般用字符串方式表示。time_exp1表示起始时间,time_exp2表示结束时间

2. trxid 指定事务ID号,整数表示。trxid1表示起始trxid,trxid2表示结束trxid

使用说明
1.闪回版本查询支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、垂直分区表、列存储表、外部表与视图;

2.支持伪列,作为闪回版本查询的辅助信息。
伪列 说明
VERSIONS_START{TRXID|TIME} 起始TRXID或时间戳
VERSIONS_END{TRXID|TIME} 提交TRXID或时间戳。如果该值为NULL,表示行版本仍然是当前版本
VERSIONS_OPERATION 在行上的操作(I=Insert,D=Delete,U=Update)

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

例1 闪回版本查询指定时间段内,PERSON_TYPE表的记录变化

SQL> select sysdate;
LINEID     SYSDATE                    
---------- ---------------------------
1          2019-12-02 00:00:18.221877
used time: 0.662(ms). Execute id is 107.

在2019-12-02 00:00:18时刻修改数据,并提交。

SQL> UPDATE PERSON.PERSON_TYPE SET NAME='打字员' WHERE PERSON_TYPEID=9;
affect rows 1
used time: 1.758(ms). Execute id is 110.
SQL> commit;
executed successfully
used time: 16.964(ms). Execute id is 111.
SQL> 
SQL> UPDATE PERSON.PERSON_TYPE SET NAME='卫生员' WHERE PERSON_TYPEID=9;
affect rows 1
used time: 1.268(ms). Execute id is 112.
SQL> commit;
executed successfully
used time: 15.983(ms). Execute id is 113.
SQL> SELECT * FROM PERSON.PERSON_TYPE;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          9             卫生员
6          10            保洁员
6 rows got
used time: 0.669(ms). Execute id is 114.

进行闪回版本查询,获得指定时间段内变化的记录。

SQL> SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2019-12-02 00:00:17' AND SYSDATE;
LINEID     VERSIONS_ENDTRXID    NAME    
---------- -------------------- --------
1          NULL                 采购经理
2          NULL                 采购代表
3          NULL                 销售经理
4          NULL                 销售代表
5          NULL                 卫生员
6          NULL                 保洁员
7          749197               打字员
7 rows got
used time: 1.412(ms). Execute id is 115.

第二次更新的事务ID为749197

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749197;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          9             打字员
6          10            保洁员
6 rows got
used time: 1.371(ms). Execute id is 120.

第一次更新的事务ID为749196

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749196;
LINEID     PERSON_TYPEID NAME    
---------- ------------- --------
1          1             采购经理
2          2             采购代表
3          3             销售经理
4          4             销售代表
5          9             收银员
6          10            保洁员
6 rows got
used time: 0.585(ms). Execute id is 121.

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

使用说明
系统视图名为V$FLASHBACK_TRX_INFO,定义如下所示。

SQL> desc V$FLASHBACK_TRX_INFO
LINEID     NAME             TYPE$         NULLABLE
---------- ---------------- ------------- --------
1          START_TRXID      BIGINT        Y        事务中第一个DML的TRXID
2          START_TIMESTAMP  DATETIME(6)   Y        事务中第一个DML的时间戳
3          COMMIT_TRXID     BIGINT        Y        提交事务的TRXID
4          COMMIT_TIMESTAMP DATETIME(6)   Y        提交事务时的时间戳
5          LOGIN_USER       VARCHAR(256)  Y        拥有事务的用户
6          UNDO_CHANGE#     INTEGER       Y        记录修改顺序序号
7          OPERATION        CHAR(1)       Y        DML操作类型 D:删除;U:修改;I:插入;N:更新插入(专门针对CLUSTER PRIMARY KEY的插入);C:事务提交;P:预提交记录;O:default
8          TABLE_NAME       VARCHAR(256)  Y        DML 修改的表     
9          TABLE_OWNER      VARCHAR(256)  Y        DML修改表的拥有者      
10         ROW_ID           BIGINT        Y        DML修改行的ROWID
11         UNDO_SQL         VARCHAR(3900) Y        撤销DML操作的SQL语句
11 rows got
used time: 88.801(ms). Execute id is 122.

查询指定时间之后的事务信息,可为闪回查询操作提供参考

SQL> SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > '2019-12-01 23:13:28';
LINEID     START_TRXID          START_TIMESTAMP             COMMIT_TRXID         COMMIT_TIMESTAMP            LOGIN_USER UNDO_CHANGE# OPERATION TABLE_NAME TABLE_OWNER ROW_ID               UNDO_SQL
---------- -------------------- --------------------------- -------------------- --------------------------- ---------- ------------ --------- ---------- ----------- -------------------- --------
1          749189               2019-12-01 23:13:28.000000  749190               2019-12-01 23:33:57.588000  SYSDBA     16           C         NULL       NULL        NULL                 NULL
used time: 1.437(ms). Execute id is 126.
您可能感兴趣的文档:

--结束END--

本文标题: DM7闪回与闪回查询

本文链接: https://lsjlt.com/news/48439.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • DM7闪回与闪回查询
    闪回 当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的UNDO记录来完成历史记...
    99+
    2024-04-02
  • oracle的闪回查询,闪回删除:
    create table t1 as select * from dba_objects;SCOTT@ORA12C> select sysdate from dual;SYSDAT...
    99+
    2024-04-02
  • oracle闪回查询和闪回数据库
    oracle闪回查询和闪回数据库 区别:数据闪回查询,只需要启用撤销表空间自动管理回滚信息。使用闪回删除技术和闪回数据库技术,需要启动回收站,闪回恢复区。(归档模式使用) 具体设...
    99+
    2024-04-02
  • JOE_达梦DM_闪回查询实践
    达梦数据库中与闪回技术相关的参数      1 .  ENABLE_FLASHBACK      &n...
    99+
    2024-04-02
  • Oracle闪回查询功能怎么使用
    Oracle的闪回查询功能可以用来在数据库中查询之前的数据状态,类似于数据库的时间旅行功能。使用闪回查询功能可以在不备份数据库的情况...
    99+
    2024-04-19
    Oracle
  • 从回收站闪回表
    查看回收站有没有开启,默认开启状态 SQL> show parameter recy NAME TYPE VALUE buffer_pool_recyc...
    99+
    2024-04-02
  • Oracle 闪回技术
    一、配置闪回数据库1、数据库处于归档日志模式SQL> select log_mode from v$database;  LOG_MODE     &...
    99+
    2024-04-02
  • oracle开启闪回
    查看数据库是否是归档模式:SQL> show parameter db_flashback;NAME               ...
    99+
    2024-04-02
  • 【Oracle Database】闪回(FlashBack)
    闪回版本查询 SQL> set line 200 SQL> col starttime for a30 SQL>&nb...
    99+
    2024-04-02
  • 12c rac开闪回
    一、步骤1.关闭节点二2.配置相关参数3.关闭节点14.启用闪回5.打开节点二 二、操作过程 [root@rac01 ~]# su - oracle Last login: Thu Jan 4 10:33...
    99+
    2024-04-02
  • 闪回脚本:mysql_rollback.py
    #!/bin/env python # -*- coding:utf-8 -*- import os,sys,re,getopt import MySQLdb host = '127.0.0.1' us...
    99+
    2024-04-02
  • oracle怎么闪回
    oracle 闪回允许将数据库或表恢复到过去时间点,无需完整恢复。闪回数据库可通过 flashback database 语句指定时间点进行恢复;闪回表可通过 flashback tab...
    99+
    2024-04-02
  • 11G 闪回数据库
    第一种场景 库是用来培训或测试环境的,测试完毕后恢复原来的样子SYS@ odb>archive log list;Databaselog mode    &nb...
    99+
    2024-04-02
  • MyFlash MySQL闪回工具
    安装:环境要求:1、binlog格式必须为row,且binlog_row_image=full2、仅支持5.6与5.73、只能回滚DML(增、删、改) 下载地址:https://github.com/Me...
    99+
    2024-04-02
  • oracle闪回那些事
    开启闪回数据库alter database flashback on;alter database open;修改日期时间显示格式:alter session  set nls_date_form...
    99+
    2024-04-02
  • mysql闪回工具binlog2sql
         在生产环境中经常会遇到误删除、改错数据的情况,binlog2sql是一个mysql闪回工具,它可以实现数据的快速回滚,从binlog中提取sql,并能生成回滚...
    99+
    2024-04-02
  • oracle备份与恢复--闪回技术
    一•启用闪回数据库1.启用归档模式sql>shutdown immediate;sql>startup mount;sql>alter database archivelog;2.建立闪回...
    99+
    2024-04-02
  • 如何开启oracle闪回
    首先查看是否开启闪回: SQL> select flashback_on from V$database; FLASHBACK_ON --------...
    99+
    2024-04-02
  • 12c 闪回常用视图
    SYS@orcl1> set lines 200 SYS@orcl1> col name for a50 SYS@orcl1> select * from v$recovery_...
    99+
    2024-04-02
  • oracle闪回怎么恢复
    数据库恢复到过去时间点的方法是通过oracle闪回恢复功能:确定恢复的时间点。启动闪回恢复会话。应用更改。提交更改。完成会话。可以指定时间戳、scn或回滚段名称来恢复数据库。闪回恢复允许...
    99+
    2024-05-21
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作