一、闪回恢复区(Flash Recovery Area)
1、什么是闪回恢复区
闪回恢复区是Oracle数据库中的一个特殊存储区域,用于集中存放备份和恢复数据库所需的所有文件,包括归档日志和闪回日志。这个区域可以帮助数据库在遇到介质故障时进行完全恢复。通过将备份数据存储在闪回恢复区域,可以在介质恢复时快速、有效地恢复文件。此外,闪回恢复区还可以作为磁带的磁盘缓存,提高了恢复效率。系统会自动管理闪回恢复区中的文件,删除不再需要的文件。建议定期将备份复制到磁带,以便释放闪回恢复区域的空间。启用闪回恢复区可以简化备份管理,使数据库恢复更加方便快捷。
闪回恢复区存储以下与恢复相关的文件:
- 当前控制文件
- 在线重做日志
- 归档重做日志
- 闪回日志
- 控制文件自动备份
- 数据文件和控制文件副本
- 备份数据片段
- 外部归档重做日志(逻辑备库通过 LogMiner 会话接收的已归档重做日志)
2、为什么要使用闪回恢复区
随着磁盘存储介质在采购成本方面与磁带竞争力增强,基于磁盘的备份成为一种优越和首选的存储机制。通过使用磁盘作为存储介质,可以在大规模存储方面获得显著的好处,而且可以在毫秒内而非几小时内随机访问数据。传统恢复中原本昂贵的停机时间被快速数据访问和恢复时间所取代,而这可以利用廉价的磁盘空间。
相比磁带,我们使用磁盘的优势在于磁带是一种顺序访问设备,而磁盘是一种随机访问设备。因此,从磁带恢复所需的时间量被消除或减少。
3、闪回恢复区位置
闪回恢复区应该放在与数据库工作文件集不同的磁盘上。否则,该磁盘会成为您数据库的单点故障。
4、闪回恢复区大小
闪回恢复区越大,就越有用。理想情况下,闪回恢复区应该足够大,能够容纳所需的文件。恢复区应该能够包含数据库中所有数据文件的副本以及您选择的备份策略使用的增量备份。
如果提供这么多空间不切实际,那么最好创建一个足够大的区域,以保留最重要的表空间的备份和尚未存入磁带的所有归档日志。最低限度,闪回恢复区必须足够大,能够容纳尚未存入磁带的归档重做日志。如果恢复区的空间不足以存储闪回日志并满足其他备份保留要求,那么恢复区可能会删除闪回日志以释放空间。
用于估计有用闪回恢复区大小的公式取决于以下因素:
- 数据库数据块数量是频繁更改的还是较少更改的。
- 在磁盘上存储备份,还是在磁盘和磁带上存储备份。
- 使用基于冗余的备份保留策略,还是基于恢复窗口的保留策略。
- 计划使用数据库闪回或保证的还原点作为时点恢复的替代方法。
如果计划启用闪回日志记录,请注意,闪回日志生成的量大致与重做日志生成的量相当。例如,如果打算将 DB_FLASHBACK_RETENTION_TARGET 设置为 24 小时,且数据库每天生成 20 GB 的重做日志,那么一个经验法则是为闪回日志留出 20 GB 到 30 GB 的磁盘空间。当启用闪回日志记录时,同样的规则也适用于保证还原点。例如,如果数据库每天生成 20 GB 的重做日志,且保证还原点将保留一天,那么计划分配 20 到 30 GB 的空间。
举例来说,假设想确定在备份保留策略设置为 REDUNDANCY 1 且打算遵循 Oracle 建议策略使用增量更新备份时的闪回恢复区大小,可以使用以下公式估算磁盘配额。
磁盘配额 = 数据库副本大小 + 增量备份大小 + (n+1) 天的归档重做日志大小 + (y+1) 天的外部归档重做日志大小(用于逻辑备库) + 控制文件大小 + 在线重做日志成员大小 * 日志组数量 + 闪回日志大小(基于 DB_FLASHBACK_RETENTION_TARGET 值)
其中,n 是增量更新之间的天数间隔,y 是在逻辑备库上应用外部归档重做日志的延迟天数。
5、多个数据库可以使用相同的闪回恢复区吗
多个数据库可以使用相同的 DB_RECOVERY_FILE_DEST 值,但以下条件之一必须为真:
- 两个数据库没有指定相同的DB_UNIQUE_NAME值。
- 对于那些未提供DB_UNIQUE_NAME 的数据库,两个数据库不具有相同的DB_NAME值。
当数据库以这种方式共享单个恢复区时,该位置应足够大,能够容纳所有数据库的文件。将各数据库的 DB_RECOVERY_FILE_DEST_SIZE 值相加,然后考虑镜像或压缩等额外空间。
6、ASM对闪回恢复区的支持
闪回恢复区可以是一个 ASM 磁盘组。RMAN 可以备份和恢复存储在 ASM 磁盘组中的文件。实际上,RMAN 是备份和恢复 ASM 文件的唯一方法。备份集和映像副本可以在 ASM 中创建,可以通过在闪回恢复区自动创建,也可以显式指定一个 ASM 磁盘组作为它们的位置。
7、OMF对闪回恢复区的支持
使用 RMAN 进行 OMF 文件的备份和恢复更加简单,因为 RMAN 在任何命令中不使用长的 OMF 文件名。 备份集和映像副本可以作为 OMF 文件创建,方法是在闪回恢复区中创建它们。 RMAN 可以用于将现有文件迁移到 OMF 格式。
8、RAC 的闪回恢复区
对于 RAC 数据库,所有实例上的位置和磁盘配额必须保持一致。为了实现这一点,Oracle 建议将闪回恢复区放在共享的 ASM 磁盘上。此外,您必须在所有实例上将 DB_RECOVERY_FILE_DEST 和 DB_RECOVERY_FILE_DEST_SIZE 参数设置为相同的值。 要使用闪回恢复功能,必须首先为Oracle RAC集群中的每个实例配置闪回恢复区。
9、闪回恢复区可以存储什么类型的文件
闪回恢复区中的文件分为永久文件和临时文件。
永久文件
永久文件是当前控制文件和在线重做日志的多重复制副本(假设这些文件被配置为存储在恢复区域中)。如果删除这些文件,会导致实例失败,因此它们无法被删除。
临时文件
临时文件包括归档重做日志、数据文件副本、控制文件副本、控制文件自动备份、备份数据片段和闪回日志。Oracle会自动管理这些文件,当闪回恢复区需要空间时,会自动删除它们。这些文件在根据保留策略变为过时或已备份到磁带后将会被删除。任何在闪回恢复区中的临时文件一旦备份到磁带,即使没有删除也会在内部被放入可以删除的文件列表中。在将文件备份到磁带之前,无法使其过时。
10、Flash Recovery Area需要的初始化参数
要启用闪回恢复区,必须设置两个初始化参数:
- DB_RECOVERY_FILE_DEST_SIZE:
这是磁盘限制,即闪回恢复区被允许使用的空间量。闪回恢复区的最小大小应至少足够大,能够容纳尚未复制到磁带的归档日志。
注意:此值不包括某些类型的磁盘开销:
每个 Oracle 文件的块 0 或 OS 块头不包括在这个大小中,因此在计算实际所需的闪回恢复区磁盘使用空间时,请确保额外预留 10% 的空间。
当底层文件系统被镜像、压缩或以某种方式受到 Oracle 不知道的其他开销影响时,DB_RECOVERY_FILE_DEST_SIZE 不表示实际占用磁盘上的大小。
- DB_RECOVERY_FILE_DEST:
这个初始化参数是一个有效的目标,用于创建闪回恢复区。目标可以定义为目录、文件系统或 ASM 磁盘组。
注意1:闪回恢复区不能存储在原始文件系统上。
注意2:必须先设置 DB_RECOVERY_FILE_DEST_SIZE,然后再设置 DB_RECOVERY_FILE_DEST。
11、闪回恢复区初始化参数限制
-
不能使用 LOG_ARCHIVE_DEST 和 LOG_ARCHIVE_DUPLEX_DEST 参数来指定重做日志归档目的地。如果已配置了闪回恢复区,则必须始终使用 LOG_ARCHIVE_DEST_n 参数。
-
如果创建了恢复区且未设置任何其他本地归档目的地,则 LOG_ARCHIVE_DEST_10 默认设置为 USE_DB_RECOVERY_FILE_DEST。
-
多个数据库可以有相同的 DB_RECOVERY_FILE_DEST,但前提是 DB_NAME 不同,或者如果 DB_NAME 相同(例如主备数据库),则数据库的 DB_UNIQUE_NAME 参数必须不同。
-
对于 RAC,闪回恢复区的位置必须位于集群文件系统、ASM 或通过 NFS 配置的共享目录上。所有实例上的位置和磁盘配额必须保持一致。
12、快速恢复区的空间问题
1、规划快速恢复区的空间使用和位置
为快速恢复区分配的磁盘空间量取决于数据库的大小和活动水平,这些因素决定了数据文件和重做日志文件的大小以及恢复目标。快速恢复区应足够大,能够存储恢复数据库所需的数据文件、控制文件、在线重做日志和归档日志的副本,以及基于保留策略保留的这些备份文件的副本。
快速恢复区应位于单独的磁盘上。
2、Oracle如何管理快速恢复区中的磁盘空间
快速恢复区中的空间在必须根据保留策略、保留的备份和归档日志以及可能被删除的其他文件之间进行平衡。Oracle数据库在必须为其他目的回收空间之前,不会从快速恢复区中删除符合条件的文件。因此,最近移动到磁带的文件通常仍然可用于恢复。因此,恢复区可以作为磁带的缓存。当快速恢复区已满时,Oracle数据库会自动删除符合条件的文件,以根据需要回收恢复区中的空间。
如果RMAN保留策略要求保留一组大于快速恢复区磁盘配额的备份,或者如果保留策略设置为NONE,则快速恢复区可能完全填满而没有可回收空间。
3、Oracle在FRA空间紧张时如何通知
数据库在可回收空间少于15%时发出警告,少于3%时发出严重警告。为了提醒DBA这种情况,会在警告日志和DBA_OUTSTANDING_ALERTS表中添加条目。尽管如此,数据库将继续消耗快速恢复区中的空间,直到没有剩余的可回收空间。
当恢复区完全满时,将收到以下错误,其中nnnnn是所需的字节数,mmmm是磁盘配额:
ORA-19809: 超过恢复文件的限制 ORA-19804: 无法从mmmm限制中回收nnnnn字节的磁盘空间
4、快速恢复区的删除规则
以下规则决定了恢复区中的文件何时符合删除条件:
- 永久文件永远不符合删除条件。
- 根据保留策略过时的文件符合删除条件。
- 已复制到磁带的临时文件符合删除条件。
- 在所有使用日志的消费者满足其要求之前,归档重做日志不符合删除条件(如果设置了归档重做日志删除策略)。
- 已由逻辑备用数据库上的LogMiner会话挖掘的外部归档日志符合删除条件。与普通的归档重做日志不同,外部归档重做日志具有不同的DBID。
控制从快速恢复区删除文件的安全可靠方法是配置保留备份策略和归档日志删除策略。为了增加将文件移动到磁带的文件保留在磁盘上的可能性,请增加快速恢复区配额。
要求:
- 配置RMAN保留策略
- 配置归档日志删除策略
如果保留策略设置为none,则没有文件符合删除条件。如果文件永远不被视为过时,那么只有在文件被备份到其他磁盘位置或三级存储设备(如磁带)后,才能从快速恢复区中删除。
5、如何监控快速恢复区的空间使用情况
-
V$RECOVERY_FILE_DEST:
找出当前位置、磁盘配额、使用中的空间、通过删除文件可回收的空间以及快速恢复区中的文件总数。 -
V$FLASH_RECOVERY_AREA_USAGE:
找出不同类型的文件使用的总磁盘配额的百分比。此外,还可以确定通过删除已经过时、多余或已经备份到磁带的文件,可以为每种类型的文件回收多少空间。
例如
Select file_type, percent_space_used as used,percent_space_reclaimable as reclaimable, number_of_files as "number" from v$recovery_area_usage;
select name, space_limit as Total_size ,space_used as Used, SPACE_RECLAIMABLE as reclaimable ,NUMBER_OF_FILES as "number" from V$RECOVERY_FILE_DEST;
select * from v$flash_recovery_area_usage;
SELECT (100 - sum(percent_space_used)) + sum(percent_space_reclaimable)FROM v$flash_recovery_area_usage;
select * from V$RECOVERY_FILE_DEST;
6、当没有文件符合删除条件时,如何解决快速恢复区已满的问题
快速恢复区中的文件是自动管理的。每当存在空间压力时,oracle会自动删除不在保留策略范围内的文件。但如果没有文件符合删除条件,则需要手动干预。
当没有文件符合删除条件时,您有几种选择可以解决快速恢复区已满的问题:
- 增加更多的磁盘空间并增加DB_RECOVERY_FILE_DEST_SIZE
SQL> alter system set db_recovery_file_dest_size=xG SCOPE=BOTH; -- (更大的量)
- 将快速恢复区中的备份移动到三级存储,如磁带。
RMAN>BACKUP RECOVERY AREA; 注意:闪回日志不能备份到恢复区外,因此不会由BACKUP RECOVERY AREA备份。
- 对已使用操作系统实用程序删除的任何文件运行DELETE。如果您使用宿主操作系统命令删除文件,那么数据库将不会意识到由此产生的可用空间。
RMAN>CROSSCHECK BACKUP;
RMAN>CROSSCHECK ARCHIVELOG ALL;
RMAN>Delete expired backup;
RMAN>Delete expired archivelog all;
RMAN>Delete force obsolete;
- 确保您的保证还原点是必需的。如果不是,请删除它们
SQL>Drop restore point <restore_point_name>;
- 如果启用了闪回日志,请确保为所有闪回日志留有足够的空间。如果不需要,则可以关闭闪回。
SQL>Alter database FLASHBACK OFF;
- 审查您的备份保留策略,如果需要,更改RMAN保留策略
RMAN>CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO SBT;
7、ORA-19815
- 警告日志
ORA-19815: 警告:db_recovery_file_dest_size为3221225472字节,使用率为100.00%,剩余可用字节为0。
- 原因:
正在向快速恢复区进行备份。可能正在使用Oracle磁盘策略,或者只是将数据库备份到FRA。写入FRA的所有对象都将占用那里的空间,要回收这些空间,必须备份FRA文件。一旦备份了恢复文件,它们就会被放在一个内部的“文件可以删除”列表上。完成这项操作后,可回收空间增加,Oracle将自动管理FRA。
可以使用提供的查询来监控快速恢复区的空间。主要关注的列是可回收列。如果它为0,则Oracle不会在db_recovery_file_dest中清理任何文件。而如果像上面所示将恢复区备份到磁带,可回收空间> 0,且已备份的文件被放在文件可以删除列表上,因为这些文件有磁带备份。如果此后Oracle需要空间,它将删除FRA中可删除的最旧文件。它将删除已备份的旧归档日志,然后是备份集。
增加可回收列的唯一方法是让RMAN备份快速恢复区。一旦备份了恢复区中的文件,这些文件就会被放在可以删除的文件列表上,Oracle将管理快速恢复区空间。
- 解决方案:
– 检查可回收空间
SQL> SELECT substr(name, 1, 30) name, space_limit AS quota, space_used AS used, space_reclaimable AS reclaimable, number_of_files AS files FROM V$RECOVERY_FILE_DEST ;
- 例外情况:
如果RMAN不是备份策略的一部分,并且归档日志进入FRA,则需要手动干预以删除归档日志。定期清理旧的归档日志
例如
RMAN>Delete archivelog all completed before 'SYSDATE-7';
默认情况下,RMAN备份进入FRA。在进行RMAN备份时,如果显式指定备份位置为快速恢复区位置,则这些备份片段不会被视为FRA的自动管理部分。
对于归档日志备份到FRA,请使用USE_DB_RECOVERY_FILE_DEST而不是给出FRA的显式路径
SQL> alter system set log_archive_dest_10='LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=both;
二、闪回数据库
1、闪回数据库特性及其优点
- 时点恢复(Point-in-time recovery)
通过使用恢复点或正常的闪回数据库功能,快速将主数据库或备用数据库倒带到特定时点。可用于修复因批量更新失败导致数据库大部分数据被修改、因当前在线重做日志损坏或无法修复而崩溃的数据库或因计划维护事件(例如应用程序变更导致数据库问题)而出现故障的情况。 - Data Guard 快速启动故障切换(Fast-start failover):
快速将主数据库恢复为备用数据库的功能。 - 手动主数据库恢复(Manual primary database reinstate):
若使用 Data Guard 但未启用快速启动故障切换功能且需要进行 Data Guard 故障切换,可使用闪回数据库手动恢复失败的主数据库。通过闪回数据库手动恢复失败的主数据库,不论数据库大小,恢复可能仅需几分钟,相比通过网络进行数据库重建所需的更多工作和时间。 - Data Guard 快照备用(Snapshot Standby):
快照备用数据库是一个完全可更新的备用数据库,接收并存档来自主数据库的重做数据但不应用它。将物理备用数据库转换为快照备用数据库时会创建一个隐式的保证恢复点,用于在将其转换回物理备用数据库时将快照备用数据库回滚到其原始状态。 - 用于恢复失败的数据库升级的闪回(Flashback for failed database upgrade):
除了备份数据库外,建议创建 Flashback 保证恢复点 (GRP)。只要在创建 GRP 后不更改数据库 COMPATIBLE 参数,数据库就可以在(失败的)升级后轻松进行闪回。AutoUpgrade 工具在继续升级之前也会提供创建 GRP 的选项。通过对 GRP 进行闪回,将撤销创建 GRP 后对数据库所做的所有更改。 - 使用临时逻辑备用或 DBMS_ROLLING 进行滚动数据库升级(Rolling Database Upgrades):
在数据库滚动升级的过程中,将物理备用数据库临时转换为逻辑备用数据库时,在升级过程之前在主数据库上创建一个保证恢复点。这样,可以在升级之后将数据库恢复并重新转换为物理备用数据库。详情请参阅 MAA 文档《Database Rolling Upgrade using Data Guard and Automated Database Upgrades using Oracle Active Data Guard and DBMS_ROLLING》。 - RMAN 与闪回数据库的集成:
闪回数据库与 Oracle Recovery Manager 集成,在恢复中隐式使用,并在需要时进行显式使用。一个 RMAN 隐式使用闪回数据库的例子是执行块媒体恢复时。 - 恢复测试和培训数据库:
另一个常见的闪回数据库用途是在每次测试运行或培训会话后将测试或培训数据库回滚到相同的起点。 - 闪回PDB(Pluggable Database):
从 Oracle 12.2 版本开始,闪回可插入数据库(PDB)可以回滚一个 PDB 而不影响其他 PDB。还可以创建 PDB 恢复点。
2、关键版本特性
-
Oracle 11g 第 2 版
- 特性:数据库打开时可以启用闪回数据库
- 性能特征:块新的优化功能可用于 RAC 的直接加载和插入操作。目前闪回块新优化不适用于以下情况:1)截断操作后插入/加载操作;2)删除表后的插入/加载操作,该表存在于Oracle回收站中;3) 重做插入/加载操作的应用或恢复以及 4) 加载到具有 SecureFile LOB 或传统 LOB 数据类型的表时。
- 性能特性:在到达 DB_FLASHBACK_RETENTION_TARGET 之前分配闪回日志时的初始开销已减少,并且在某些情况下通过在阻止任何应用程序前台进程之前尝试预分配来消除。对于 11.2.0.2 之前的版本,首次启用闪回时启用闪回的开销通常较高。
- 性能特点:闪回数据库操作期间读取闪回日志的显着改进。闪回数据库执行两个基本步骤:1)读取闪回日志以确定需要从闪回日志恢复哪些缓冲区,2)DBWR 将缓冲区从缓冲区高速缓存写入磁盘。
-
Oracle 12c 第 2 版 (12.2)
- 功能:闪回可插入数据库可以闪回单个 PDB,而不影响其他 PDB。
- 功能:PD吧恢复点支持使用设置别名和SCN。然后,该别名可用于闪回PDB或时间点恢复。
-
Oracle 19c
- 功能:在主数据库上创建还原点将自动传播到备用数据库并在备用数据库上创建相应的还原点。
- 功能:当在 Data Guard 配置中的主数据库和备用数据库上启用闪回数据库时,闪回主数据库将导致备用数据库也自动闪回。
3、配置最佳实践
-
设置 DB_FLASHBACK_RETENTION_TARGET 参数:
为了充分利用闪回数据库来在 Data Guard 故障切换后恢复失败的主数据库,按照以下条件中规定的最大值,设置 DB_FLASHBACK_RETENTION_TARGET 初始化参数:-
大多数情况下,将 DB_FLASHBACK_RETENTION_TARGET 设置为至少 60(分钟),以便在发生主数据库故障后进行恢复。启用闪回数据库时,需要几个小时的时间生成足够的闪回数据到闪回日志中,以便进行恢复。查询 V$FLASHBACK_DATABASE_LOG 以获取最早的闪回时间。
-
考虑存在多次故障(例如首先是网络故障,随后是主数据库故障)可能导致故障切换时主备数据库之间存在传输滞后的情况。对于这种情况,将 DB_FLASHBACK_RETENTION_TARGET 设置为 60(分钟)加上希望容纳的最大传输滞后时间的值。这将确保失败的主数据库可以闪回到在备库成为主库的SCN之前的SCN,这是进行主数据库恢复的要求。
-
如果使用闪回数据库进行从用户错误或逻辑损坏的快速时点恢复,将 DB_FLASHBACK_RETENTION_TARGET 设置为您希望能够恢复到的过去最远时间的值。
-
通常情况下,将主备数据库的 DB_FLASHBACK_RETENTION_TARGET 设置为相同的值。
- 调整 Fast Recovery Area (FRA) 大小:
闪回数据库使用自己的日志机制,创建闪回日志并将其存储在 Fast Recovery Area (FRA) 中。确保 FRA 分配了足够的空间来容纳闪回数据库的闪回日志,以适应目标保留大小和峰值批处理速率。FRA 的大小在 Oracle 备份和恢复文档中有详细描述,但一般的经验法则是闪回日志的产生量大致与重做日志的产生量相同。使用以下保守的公式和方法:
Target FRA = Current FRA + DB_FLASHBACK_RETENTION_TARGET x 60 x Peak Redo Rate (MB/sec)
当前 FRA 或 DB_RECOVERY_FILE_DEST_SIZE=1000G
目标 DB_FLASHBACK_RETENTION_TARGET=360(360 分钟)
从 AWR 获取:1)OLTP 工作负载的最大重做速率为 3 MB/sec。2)批处理工作负载的最大重做速率为 30 MB/sec,持续时间最长为 4 小时。3)6 小时窗口的最坏情况下重做生成量为(240 分钟 x 30 MB/sec x 60 秒/min)+(120 分钟 x 3 MB/sec x 60 秒/min)= 453,600 MB 或约 443 GB
建议的 FRA 或 DB_RECOVERY_FILE_DEST_SIZE= 443 GB + 1000 GB = 1443 GB。
另一种确定快速恢复区域大小的方法是启用闪回数据库,并允许数据库应用程序运行一段时间(2-3 小时),然后查询 V$FLASHBACK_DATABASE_STAT.ESTIMATED_FLASHBACK_SIZE。
DB_FLASHBACK_RETENTION_TARGET 是一个目标值,不能保证您可以闪回到那么远的时间点。在某些情况下,如果闪回日志存储在快速恢复区域中的空间受到压力,那么最旧的闪回日志可能会被删除。有关快速恢复区域删除规则的详细说明,请参阅数据库备份和恢复用户指南中的“维护快速恢复区域”部分。要保证时点闪回,必须使用保证恢复点(GRP)。使用 GRP,所需的闪回日志永远不会被回收或清除,直到 GRP 被删除。如果存在 GRP 并且空间不足,则可能会挂起数据库;因此,根据 GRP 的预期持续时间,在 FRA 中分配更多空间可确保恢复点的闪回。
-
配置足够的 I/O 带宽用于 Fast Recovery Area:
当开启闪回数据库时,不足的 I/O 带宽通常会在 OLTP 工作负载的自动工作负载存储库(AWR)报告中显示“FLASHBACK BUFFREE BY RVWR”等待事件的频繁发生,对于大型插入操作,“FLASHBACK LOG FILE WRITE”的延迟超过 30 毫秒。通常情况下,闪回操作的大小为 1 MB,总的写入吞吐量将类似于重做生成速率(如果启用了数据库强制记录)或者类似于直接加载操作的负载速率。为了简化操作,配置一个大型共享存储 GRID,并将 DATA 配置在磁盘或 LUNS 的外部部分,将 RECO(快速恢复区域)配置在磁盘或 LUNS 的内部部分。在 Exadata 系统中,这是自动完成的。 -
设置 LOG_BUFFER=256MB,以在内存中为闪回数据库提供更多的缓冲空间。
4、操作最佳实践
-
在启用闪回数据库之前和之后,使用自动工作负载存储库 (AWR) 和 Enterprise Manager 收集数据库统计信息,以测量启用闪回数据库的影响。
-
设置企业管理器监控指标“Recovery Area Free Space (%)”,以便及时发出关于快速恢复区域空间问题的预警。
-
从 Oracle 数据库 11.2 版本开始,可以在数据库处于打开状态时启用闪回数据库。但是,如果无法获得足够的连续内存,此操作可能会失败并报错。为保证成功,可以在挂载模式下启用闪回。
-
若要监视闪回数据库操作的进展,可以查询 V$SESSION_LONGOPS 视图。一个监视进度的示例查询是:
select * from v$session_longops where opname like 'Flashback%';
-
如果需要更多关于闪回数据库操作的详细信息,请设置数据库参数 _FLASHBACK_VERBOSE_INFO=TRUE,这将在数据库的 DIAGNOSTIC_DEST 跟踪目录中生成闪回数据库操作的详细跟踪。
-
当在测试数据库上使用闪回数据库执行重复测试时,建议仅使用保证恢复点 (GRP),而无需明确启用闪回数据库。
5、性能优化
-
OLTP
“FLASHBACK BUF FREE BY RVWR” 等待事件仅在打开闪回数据库时发生。会话等待恢复写入程序(RVWR)将闪回数据写入磁盘上的闪回日志,因为缓冲区已满。在 RVWR 释放缓冲区之前,会话可能需要等待。如果这个事件成为数据库中的顶级等待事件之一,通常是因为用于快速恢复区域的文件系统或存储系统的IO带宽不足以容纳来自闪回写入的额外I/O。请参考数据库备份和恢复用户指南中的闪回数据库部分,了解调整考虑事项,并评估相应的IO和存储统计信息。 -
直接路径操作
- 检查系统统计信息中的闪回日志写入字节数和物理写入字节数,可以在 v$sysstat、AWR 报告或 EM 中找到。
- 如果 (闪回日志写入字节数) / (物理写入字节数) < 5%,则表示闪回不会对性能产生影响。否则,请评估任何操作更改或错误修复,以便您可以使用闪回块新优化功能(参考上面的性能观察部分)。
- 此外,即使 “flashback log file sync” 等待事件是顶级等待事件之一,也请忽略它。
- 闪回日志写入字节数= 由 RVWR 写入闪回数据库日志的闪回数据库数据的总字节数
- 物理写入字节数= 数据库应用程序活动中所有磁盘写入的总字节数(不包括其他类型的实例活动)。
6、案例模拟
- 确保数据库处于闪回模式
SQL> show parameter db_recover
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/fast_recovery_
area
db_recovery_file_dest_size big integer 12732M
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------------------------
NO
SQL> alter database flashback on;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------------------------
YES
SQL> show parameter flash
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_flash_cache_file string
db_flash_cache_size big integer 0
db_flashback_retention_target integer 1440
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log ;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI
-------------------- -------------------
3340319 2024-03-14 15:01:50
- 创建模拟用户及数据
SQL> create user c##cy identified by oracle account unlock;
User created.
SQL> grant dba to c##cy;
Grant succeeded.
SQL> create table c##cy.t1 as select * from dba_objects;
Table created.
SQL> select sysdate from dual;
SYSDATE
-------------------
2024-03-14 15:18:09
SQL> drop user c##cy cascade;
User dropped.
- 闪回数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 2415918608 bytes
Fixed Size 9137680 bytes
Variable Size 671088640 bytes
Database Buffers 1728053248 bytes
Redo Buffers 7639040 bytes
Database mounted.
SQL> flashback database to timestamp timestamp'2024-03-14 15:18:09';
Flashback complete.
SQL> alter database open read only;
Database altered.
- 导出数据
[oracle@19c01 ~]$ exp owner=c##cy file=/tmp/cy.dmp
Export: Release 19.0.0.0.0 - Production on Thu Mar 14 15:29:59 2024
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Username: / as sysdba
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)
About to export specified users ...
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user C##CY
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user C##CY
About to export C##CY's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export C##CY's tables via Conventional Path ...
. . exporting table T1 72422 rows exported
EXP-00091: Exporting questionable statistics.
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully with warnings.
为什么用很古老的exp,因为库只读,只能用这个方法
- 恢复数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 2415918608 bytes
Fixed Size 9137680 bytes
Variable Size 671088640 bytes
Database Buffers 1728053248 bytes
Redo Buffers 7639040 bytes
Database mounted.
SQL> recover database;
Media recovery complete.
SQL> alter database open;
Database altered.
- 恢复用户和数据
SQL> create user c##cy identified by oracle account unlock;
User created.
SQL> grant dba to c##cy;
Grant succeeded.
[oracle@19c01 ~]$ imp file=/tmp/cy.dmp full=y
Import: Release 19.0.0.0.0 - Production on Thu Mar 14 15:34:33 2024
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Username: / as sysdba
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Export file created by EXPORT:V19.00.00 via conventional path
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
IMP-00403:
Warning: This import generated a separate SQL file "import_sys" which contains DDL that failed due to a privilege issue.
. importing SYS's objects into SYS
. importing C##CY's objects into C##CY
. . importing table "T1" 72422 rows imported
Import terminated successfully with warnings.
三、闪回drop
闪回删除为 Oracle 数据库 10g 中删除对象提供了一个安全保障。当用户删除表时,Oracle 将其放入回收站。回收站中的对象将保留在那里,直到用户决定永久删除它们或者表所在的表空间受到空间压力。回收站是一个虚拟容器,其中包含所有已删除的对象。用户可以查看回收站并还原已删除的表及其相关对象。
SQL> select default_tablespace from dba_users where username='SCOTT';
DEFAULT_TABLESPACE
------------------------------------------------------------
T1
SQL> conn scott/oracle
Connected.
SQL>
system表空间的表不能闪回
SQL> create table t1 as select * from dba_objects;
Table created.
SQL> drop table t1;
Table dropped.
SQL> create table t1 as select * from dba_users;
Table created.
SQL> drop table t1;
Table dropped.
SQL> create table t1 as select * from dba_tables;
Table created.
SQL> drop table t1;
Table dropped.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T1 BIN$E5sma06pkubgY8ncEKyHHw==$0 TABLE 2024-03-14:15:52:04
T1 BIN$E5sma06mkubgY8ncEKyHHw==$0 TABLE 2024-03-14:15:51:42
T1 BIN$E5sma06ekubgY8ncEKyHHw==$0 TABLE 2024-03-14:15:51:28
T1 BIN$E5sma06YkubgY8ncEKyHHw==$0 TABLE 2024-03-14:15:50:50
SQL> select table_name from dba_tables where owner='SCOTT';
no rows selected
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
---------------------------------------- -------------------------- ----------
BIN$E5sma06YkubgY8ncEKyHHw==$0 TABLE
BIN$E5sma06bkubgY8ncEKyHHw==$0 TABLE
BIN$E5sma06ckubgY8ncEKyHHw==$0 TABLE
BIN$E5sma06dkubgY8ncEKyHHw==$0 TABLE
SQL> SELECT object_name,original_name,droptime,dropscn from recyclebin;
OBJECT_NAME ORIGINAL_NAME DROPTIME DROPSCN
------------------------------ -------------------- -------------------------------------- ----------
BIN$E5sma06YkubgY8ncEKyHHw==$0 T1 2024-03-14:15:50:50 2309917
BIN$E5sma06ekubgY8ncEKyHHw==$0 T1 2024-03-14:15:51:28 2311127
BIN$E5sma06mkubgY8ncEKyHHw==$0 T1 2024-03-14:15:51:42 2311198
BIN$E5sma06pkubgY8ncEKyHHw==$0 T1 2024-03-14:15:52:04 2311286
7 rows selected.
SQL> flashback table "BIN$E5sma06pkubgY8ncEKyHHw==$0" to before drop rename to t1_1;
Flashback complete.
flashback table "BIN$E5sma06mkubgY8ncEKyHHw==$0" to before drop rename to t1_2;
flashback table "BIN$E5sma06ekubgY8ncEKyHHw==$0" to before drop rename to t1_3;
Flashback complete.
SQL>
Flashback complete.
SQL> flashback table "BIN$E5sma06YkubgY8ncEKyHHw==$0" to before drop rename to t1_4;
Flashback complete.
记得加双引号
SQL> select count(*) from t1_1;
COUNT(*)
----------
2191
SQL> select count(*) from t1_2;
COUNT(*)
----------
37
SQL> select count(*) from t1_3;
COUNT(*)
----------
72480
SQL> select count(*) from t1_4;
COUNT(*)
----------
72377
四、闪回表
闪回表是 Oracle 数据库 10g 的一项新功能,允许用户将表恢复到先前的时间点。它为恢复因用户或应用程序意外修改或删除而受影响的表提供了快速、在线的解决方案。在许多情况下,闪回表减轻了管理员执行更复杂的时间点恢复操作的需求。即使在闪回之后,原始表中的数据也不会丢失。您随后可以将其恢复回原始状态。
主要特点如下:
- 提供了在不恢复备份的情况下,将表恢复到过去某个时间点的快速恢复功能。
- 将指定表中的所有数据还原到由时间戳或 SCN 描述的先前时间点。在还原表时,会保持对表的排他 DML 锁定。
- 在线执行还原操作。
- 自动还原表的所有属性,如索引、触发器等,这些属性对于应用程序与恢复后的表正常运行是必要的。
- 在分布式环境中保持任何远程状态。
- 根据约束条件指定的数据完整性。
注意:必须使用自动undo管理才能使用闪回表功能。它基于存储在undo表空间中的撤消信息。
自动恢复应用程序使用闪回表运行所需的所有表属性,例如索引、触发器等
即使闪回后,原表中的数据也不会丢失。可以稍后恢复到原始状态。
要使用 FLASHBACK TABLE 语句,必须已被授予FLASHBACK ANY TABLE 系统权限,或者必须具有表的 FLASHBACK 对象权限。
此外,必须对该表具有 SELECT、INSERT、DELETE 和UPDATE 权限。您正在执行闪回操作的表必须启用行移动。
案例模拟
- 创建数据
SQL> select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
2313018
SQL> insert into dept values(50,'TEATCHER','YC');
1 row created.
SQL> commit;
Commit complete.
SQL> insert into dept values(60,'DBA','BJ');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TEATCHER YC
60 DBA BJ
6 rows selected.
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
2313065
- 启动行移动
SQL> alter table dept enable row movement;
Table altered.
- 闪回表
SQL> flashback table dept to scn 2313018;
Flashback complete.
SQL> select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> flashback table dept to scn 2313065;
Flashback complete.
SQL> select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TEATCHER YC
60 DBA BJ
6 rows selected.
五、闪回查询
默认情况下,数据库查询始终显示一组一致的数据,其中包含最近提交的更改。利用 Oracle9i 中引入的闪回查询,用户可以通过指定时间或系统更改号 (SCN) 来查询数据库在过去某个时刻的一致版本。
模拟闪回查询
- 创建数据
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL>
SQL>
SQL> select sysdate from dual;
SYSDATE
-------------------
2024-03-14 16:55:43
SQL> create table dept1 as select * from dept;
Table created.
SQL>
SQL>
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
2315292
- 删除数据
SQL> delete from dept1;
6 rows deleted.
SQL> commit;
Commit complete.
- 闪回查询
SQL> select count(*) from dept1;
COUNT(*)
----------
0
SQL> execute DBMS_FLASHBACK.ENABLE_AT_TIME(sysdate - 2/1440);
PL/SQL procedure successfully completed.
SQL> select count(*) from dept1;
COUNT(*)
----------
6
SQL> execute DBMS_FLASHBACK.DISABLE;
PL/SQL procedure successfully completed.
SQL> select count(*) from dept1;
COUNT(*)
----------
0
SQL> select * from dept1 as of timestamp sysdate-8/1440;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TEATCHER YC
60 DBA BJ
6 rows selected.
六、闪回版本
闪回版本查询是 SQL 的扩展,允许您检索给定表中特定时间间隔内存在的行的不同版本。它为您指定的时间间隔内存在的行的每个版本返回一行。对于任何给定的表,每次执行 COMMIT 语句时都会创建一个新的行版本。可以使用 SELECT 语句的 VERSIONS BETWEEN 子句指定闪回版本查询。
- 创建数据
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
2316770
SQL> update dept set loc='zw' where deptno=60;
1 row updated.
SQL> commit;
Commit complete.
SQL> update dept set loc='lc' where deptno=60;
1 row updated.
SQL> commit;
Commit complete.
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
2316782
- 闪回版本查询
COLUMN versions_startscn FORMAT 99999999999999999
SQL> COLUMN versions_starttime FORMAT A24
SQL> COLUMN versions_endscn FORMAT 99999999999999999
SQL> COLUMN versions_endtime FORMAT A24
SQL> COLUMN versions_xid FORMAT A16
SQL> COLUMN versions_operation FORMAT A1
SQL> COLUMN description FORMAT A11
SQL> SET LINESIZE 200
SQL>
SQL> SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_xid, versions_operation,dept.* FROM DEPT VERSIONS BETWEEN scn 2316769 AND 2316782 WHERE deptno=60;
VERSIONS_STARTSCN VERSIONS_STARTTIME VERSIONS_ENDSCN VERSIONS_ENDTIME VERSIONS_XID V DEPTNO DNAME LOC
------------------ ------------------------ ------------------ ------------------------ ---------------- - ---------- ---------------------------- --------------------------
2316779 14-MAR-24 05.21.09 PM 03000A0037030000 U 60 ENG lc
2316773 14-MAR-24 05.20.57 PM 2316779 14-MAR-24 05.21.09 PM 0A00110024030000 U 60 ENG zw
2316773 14-MAR-24 05.20.57 PM 60 ENG sy
SQL> select versions_starttime ,versions_endtime,versions_xid,versions_operation,dept.* from dept versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V DEPTNO DNAME LOC
------------------------ ------------------------ ---------------- - ---------- ---------------------------- --------------------------
14-MAR-24 05.21.09 PM 03000A0037030000 U 60 ENG lc
14-MAR-24 05.20.57 PM 14-MAR-24 05.21.09 PM 0A00110024030000 U 60 ENG zw
14-MAR-24 05.09.44 PM 14-MAR-24 05.20.57 PM 0200040027030000 I 60 ENG sy
14-MAR-24 05.08.59 PM 0A000D0024030000 D 60 DBA lc
14-MAR-24 05.08.41 PM 14-MAR-24 05.08.59 PM 0800190032030000 U 60 DBA lc
14-MAR-24 05.08.29 PM 14-MAR-24 05.08.41 PM 0700090017030000 U 60 DBA zw
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TEATCHER YC
14-MAR-24 05.08.29 PM 60 DBA BJ
12 rows selected.
SQL> select versions_starttime ,versions_endtime,versions_xid,versions_operation,dept.* from dept versions between scn minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V DEPTNO DNAME LOC
------------------------ ------------------------ ---------------- - ---------- ---------------------------- --------------------------
14-MAR-24 05.21.09 PM 03000A0037030000 U 60 ENG lc
14-MAR-24 05.20.57 PM 14-MAR-24 05.21.09 PM 0A00110024030000 U 60 ENG zw
14-MAR-24 05.09.44 PM 14-MAR-24 05.20.57 PM 0200040027030000 I 60 ENG sy
14-MAR-24 05.08.59 PM 0A000D0024030000 D 60 DBA lc
14-MAR-24 05.08.41 PM 14-MAR-24 05.08.59 PM 0800190032030000 U 60 DBA lc
14-MAR-24 05.08.29 PM 14-MAR-24 05.08.41 PM 0700090017030000 U 60 DBA zw
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TEATCHER YC
14-MAR-24 05.08.29 PM 60 DBA BJ
12 rows selected.
可用的伪列(Pseudo Columns)如下:
- VERSIONS_STARTSCN 或 VERSIONS_STARTTIME:行采用此值时的起始 SCN 和时间戳。如果行是在下限 SCN 或时间戳之前创建的,则返回 NULL 值。
- VERSIONS_ENDSCN 或 VERSIONS_ENDTIME:行最后包含此值时的结束 SCN 和时间戳。如果行的值仍然是当前的,则返回 NULL 值,即上限 SCN 或时间戳。
- VERSIONS_XID:创建当前状态中行的事务的 ID。
- VERSIONS_OPERATION:事务执行的操作,例如 (I)nsert、(U)pdate 或 (D)elete)。
七、闪回事务查询
闪回事务查询提供了一种查看数据库在事务级别上的所有更改的方法。当与闪回版本查询一起使用时,它允许轻松从用户或应用程序错误中恢复。它增加了数据库中问题的在线诊断能力,并执行事务的分析和审计。
闪回事务查询展示了此事务所做的所有更改。此外,会返回补偿 SQL语句,可用于撤消此事务对所有行所做的更改。通过使用这样的精密工具,数据库管理员和应用程序开发人员可以精确诊断和纠正数据库或应用程序中的逻辑问题。
SQL> select xid,operation,undo_sql from flashback_transaction_query where table_name='DEPT' order by start_timestamp desc;
XID OPERATION UNDO_SQL
---------------- -------------------- --------------------
03000A0037030000 UNKNOWN
0A00110024030000 UNKNOWN
0A000D0024030000 UNKNOWN
0200040027030000 UNKNOWN
0800190032030000 UNKNOWN
0700090017030000 UNKNOWN
0200000026030000 UNKNOWN
0200000026030000 UNKNOWN
0200000026030000 UNKNOWN
0200000026030000 UNKNOWN
0200000026030000 UNKNOWN
undo_sql为空,因为数据库没有开启附加日志
SQL> alter database add supplemental log data;
Database altered.
SQL> select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 TEATCHER YC
60 ENG lc
6 rows selected.
SQL> delete from dept where deptno=60;
1 row deleted.
SQL> commit;
Commit complete.
SQL> update dept set loc='BJ' where deptno=50;
1 row updated.
SQL> commit;
Commit complete.
SQL> select xid,operation,undo_sql from flashback_transaction_query where table_name='DEPT' order by start_timestamp desc;
XID OPERATION UNDO_SQL
---------------- -------------------- --------------------------------------------------------------------------------
01000F0040030000 UPDATE update "SCOTT"."DEPT" set "LOC" = 'YC' where ROWID = 'AAAR5yAAFAAABN7AAE';
0A00040025030000 DELETE insert into "SCOTT"."DEPT"("DEPTNO","DNAME","LOC") values ('60','ENG','lc');
八、闪回数据归档
闪回数据归档是一种新的数据库对象,是一个用于存储历史信息的逻辑容器。它存储在一个或多个表空间中,并跟踪一个或多个表的历史记录。
SQL> create flashback archive fla1 tablespace t1 retention 2 year;
Flashback archive created.
SQL> Grant flashback archive on fla1 to Scott;
Grant succeeded.
SQL> conn scott/oracle
Connected.
SQL> alter table EMP flashback archive fla1;
Table altered.
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3100 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ----------
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
14 rows selected.
SQL> select sysdate from dual;
SYSDATE
-------------------
2024-03-14 17:58:59
SQL> update emp set sal=sal+1000 where empno=7788;
1 row updated.
SQL> commit;
Commit complete.
SQL> select * from emp where empno=7788;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 4100 20
SQL> select * from emp as of timestamp timestamp '2024-03-14 17:58:59' where empno=7788;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- ------------------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3100 20




