ORACLE_OCP之闪回技术
- 文章目标:
- 了解如何使用闪回技术来防止各种类型的错误并从中恢复
- 配置数据库以使用闪回技术
- 执行闪回操作
- 区分时间有效性和时间历史
一、使用闪回技术进行错误检测和纠正
- 闪回使错误恢复更加容易:
- 使您能够查看过去的时间点的数据
- “重演操作”不需要的数据更改
- 减少纠正错误所需的时间
- 闪回易于使用,并且包含简单的命令,没有复杂的过程。
二、事务和撤消
三、闪回技术
- 使用闪回技术:
- 查看过去的数据状态
- 及时修复数据
- 协助用户进行错误分析和恢复
三、Flashback Technology
四、准备数据库以进行闪回
- 赋予FLASHBACK权限.
- 查看UNDO相关参数:
- UNDO_TABLESPACE=‘UNDOTBS1’
- UNDO_MANAGEMENT=‘AUTO’
- UNDO_RETENTION=900
- Guaranteeing undo retention
五、配置保留时间的保证参数
SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
六、使用闪回技术查询数据(闪回查询)
-
Flashback Query(闪回查询)
-
用于查询指定时间点或SCN的所有数据
SELECT employee_id, salary FROM employees
AS OF TIMESTAMP <T1>
WHERE employee_id = 200
-
-
Flashback Version Query(闪回版本查询)
- 查询存在于两个时间点或两个SCN之间的所有行的版本
- 仅查询已提交的数据
- 不能用于查询外部表,临时表,固定表或视图
- 可用于创建视图
- 无法跨越DDL命令
- 过滤掉段收缩(shrink)操作
SELECT versions_xid, salary FROM employees
VERSIONS BETWEEN TIMESTAMP <t1> and <t2>
WHERE employee_id = 200; -
Flashback Transaction Query(闪回事务查询)
- 查看事务处理所做的所有更改。
七、Flashback Table(闪回表): Overview
- 闪回表将表恢复到特定时间点。
- 闪回表是原位操作。
- 数据库必须保持在联机状态。
-
在不恢复备份的情况下将一个或多个表还原到特定时间点。
-
使用UNDO表空间中的数据
-
先决条件:
- 您需要对特定表具有FLASHBACK ANY TABLE或FLASHBACK对象权限。
- 对表还需具有SELECT,INSERT,DELETE和ALTER对象特权。
- 必须对要执行闪回操作的表启用行移动
ALTER TABLE employees ENABLE ROW MOVEMENT;
-
操作接口: Cloud Control and SQL*Plus
FLASHBACK TABLE hr.departments TO TIMESTAMP
TO_TIMESTAMP(‘2013-01-25 21:00:00’,
‘YYYY-MM-DD HH24:MI:SS’);
注意事项
- FLASHBACK TABLE 命令作为单个事务处理执行,要求获取 DML 排它锁。
- 不闪回统计信息。
- 保留当前索引和从属对象。
- Flashback Table 操作:
- 无法在系统表上执行
- 无法跨越DDL操作
- 生成UNDO和REDO数据
八、Flashback Transaction Query(闪回事务查询)
- DDL命令被视为字典更新。
- 对DDL命令基础事务的闪回事务查询显示数据字典更改。
- 删除的对象显示为对象编号。
- 删除的用户显示为用户标识符。
九、Flashback Transaction Backout(闪回事务回退)
- 使用闪回事务回退撤消事务和从属事务。
- Oracle数据库确定事务之间的依赖关系,并有效地创建补偿事务,该事务可撤消不需要的更改。
- 必须启用补充日志记录(Supplemental logging 补充日志)。
- 必须授予所有受影响表上的SELECT,FLASHBACK和DML权限。
十、Flashing Back a Transaction (闪回事务)
- 使用EMCC或DBMS_FLASHBACK。 进行TRANSACTION_BACKOUT过程。
- 如果PL / SQL调用成功完成,则表示该事务没有任何依赖关系,并且单个事务已成功撤回。
- 选择退出选项后,将在DBA_FLASHBACK_TXN_STATE和DBA_FLASHBACK_TXN_REPORT视图中生成依赖性报告。
- 查看相关性报告,该报告显示所有已撤消的事务。
- 提交更改以使其永久不变。
- 回滚以放弃更改。
十一、最佳实践:基于UNDO的闪回-Flashback Query, Flashback Table
- 使用EMCC中的UNDO顾问可获取相关的UNDO保留的建议。
- 使用固定大小的UNDO:UNDO保留会根据表空间大小和当前系统负载自动调整为最佳保留。
- 请注意DDL限制:如果修改了表结构,则过去无法查询。
十二、Flashback Dropand the Recycle Bin(回收站)
十三、Recycle Bin 回收站
十四、绕过回收站
DROP TABLE <table_name> [PURGE] ;
DROP TABLESPACE <ts_name> [INCLUDING CONTENTS] ;
DROP USER <user_name> [CASCADE] ;
- 想要开启或关闭回收站:
ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE;
十五、使用闪回数据归档
- 自动跟踪数据库历史更改:
- 在表级别启用您指定的保留期限。
- 所有后续更改均透明存储并防篡改。
- 超过保留期限的记录将自动删除。
- 使用闪回技术检索历史记录。
SELECT … AS OF TIMESTAMP…SELECT … VERSIONS BETWEEN TIMESTAMP and TIMESTAMP…
十六、创建时间历史并启用相关归档
-
创建一个新的表空间来保存历史记录数据。
-
创建闪回数据归档,将其分配给表空间,并指定其保留期限。 (它需要FLASHBACK ARCHIVE ADMINISTER系统特权。)
CREATE FLASHBACK ARCHIVE fda1 TABLESPACE fda_tbs1
OPTIMIZE DATA QUOTA 10M RETENTION 1 YEAR;
//带有压缩和重复数据删除功能的非默认FDA优化 。FDA:闪回归档区 -
更改基本表以启用归档并将其分配给闪回归档文件。 (它需要FLASHBACK ARCHIVE对象权限。)
ALTER TABLE HR.EMPLOYEES FLASHBACK ARCHIVE fda1;
十七、闪回数据归档的工作方式
- 历史数据:
- 后台进程以自调整的间隔异步方式捕获行(默认值:5分钟)
- 根据保留策略自动清除
- 默认情况下未优化存储
- 使用OPTIMIZE DATA子句:压缩和重复数据删除
- 根据时间和数量自动创建的分区
- 查询跳过无关的分区
十八、在时间历史中收集用户上下文
- 收集级别:无(默认),典型,全部:
- 使用DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL进行设置
- 典型收集数据库:用户ID,全局用户ID,客户端标识符,服务名称,模块名称和主机名从GET_SYS_CONTEXT (USERENV) 中获得
SQL> EXEC DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL(‘TYPICAL’)
PL/SQL procedure successfully completed
SQL> SELECT DBMS_FLASHBACK_ARCHIVE.GET_SYS_CONTEXT
2 (VERSIONS_XID, ‘USERENV’,‘SESSION_USER’),
3 VERSIONS_XID,VERSIONS_STARTTIME,VERSIONS_ENDTIME,
4 employee_id, salary
5 FROM hr.employees VERSIONS BETWEEN SCN MINVALUE
6 AND MAXVALUE ;
十九、透明的Schema演变
-
DDL支持:
- Add, drop, rename, and modify column
- Drop and truncate partition(分区)
- Rename and truncate table
-
闪回查询适用于上述DDL更改。
-
不会自动支持所有其他DDL。
二十、Full Schema Evolution(完整Schema演变)
- 取消关联或者使用关联DBMS_FLASHBACK_ARCHIVE包中的过程:
- 在指定的表上禁用闪回归档,并允许使用更复杂的DDL(升级,拆分表等)。
- 在关联期间加强Schema完整性。 (基础表和历史记录表必须是相同的Schema 。)
Note:应谨慎使用此功能,并应了解不能再保证闪回归档是不可变的,因为在取消关联时历史记录可能已更改。
二十一、时间有效性和历史
- 区分活动行和非活动行:
- 时间有效性:同一表中用户管理的生效日期
- 时间历史记录:系统管理的事务处理时间在单独的表空间中
二十二、使用PERIOD FOR子句
-
将活动和非活动数据都保存在同一表中.
-
在创建表时定义一个有效时间维度.
- 明确定义两个日期时间列。
- 或:创建自动有效时间列。
SQL> CREATE TABLE emp
2 ( empno number, salary number, deptid number,
3 name VARCHAR2(100),
4 user_time_start DATE, user_time_end DATE,
5 PERIOD FOR user_time (user_time_start,user_time_end)); -
通过显式命名有效时间列来插入行.
SQL> CREATE TABLE emp2
2 ( empno number, salary number, deptid number,
3 name VARCHAR2(100),
3 PERIOD FOR user_time);
二十三、在有效时间列上进行过滤:示例1
- 过滤有效时间列以仅访问活动数据
SQL> select * from hr.emp as of PERIOD FOR user_time
2 to_date(‘01-DEC-1992’, ‘dd-mon-yyyy’) ;
二十四、在有效时间列上进行过滤:示例2
- 使用版本查询获取有效时间
SQL> SELECT * FROM hr.emp VERSIONS PERIOD FOR user_time
2 BETWEEN to_date(‘31-DEC-2011’,‘DD-MON-YYYY’)
3 AND to_date(‘31-DEC-2012’,‘DD-MON-YYYY’);
二十五、使用DBMS_FLASHBACK_ARCHIVE
- 可见性控制适用于查询和DML。
- 完全可见性适用于DDL。
- 使用DBMS_FLASHBACK_ARCHIVE设置的可见性:
-
将可见性设置为给定时间的有效数据.
DBMS_FLASHBACK_ARCHIVE.ENABLE_AT_VALID_TIME(‘ASOF’,
(to_timestamp(‘29-SEP-10 05.44.01 PM’)) -
将可见性设置为在会话级别的有效时间段内当前有效的数据.
DBMS_FLASHBACK_ARCHIVE.ENABLE_AT_VALID_TIME(‘CURRENT’)
-
将数据的可见性设置为全表级别.
DBMS_FLASHBACK_ARCHIVE.ENABLE_AT_VALID_TIME(‘ALL’)
-