合 Oracle DBA面试笔试之Undo系列
- 在Oracle中,如何查询数据库系统或当前会话的Redo和Undo的生成量?
- 在Oracle中,在UNDO表空间数据文件丢失的情况下如何恢复?
- 在Oracle中,Undo的作用是什么?
- 在Oracle中,如何监控TEMP和UNDO表空间并将耗费TEMP和UNDO空间非常大的SQL语句记录?
- 在Oracle中,Undo段存储了哪些内容?
- 在Oracle中,什么是块清除(Block Cleanout)?
- 在Oracle中,Undo段中区3种状态分别是什么(Undo表空间系列)?
- 在Oracle中,什么是ORA-01555错误?
- 在Oracle中,RAC环境下所有数据库实例可以使用同一个Undo表空间吗?
- 一:请描述什么是Oracle Undo?
- 二:请描述UNDO的作用?
- 三:请谈谈你对Manual Undo Management和Automatic Undo Management管理的理解?
- 四:请描述对UNDO Retention的理解?
- 五:如何确保在undo_retention期间的数据不会被覆盖。
- 六:请描述ORA-01555错误原因和解决思路。
- 七:请描述LOB字段产生ORA-01555错误原因和解决思路。
- 八:请描述ORA-30036错误原因和解决思路。
- 九:当UNDO表空间不足时,如何将相关信息记录在告警日志中。
- 十:如何评估所需UNDO大小?
- 十一:请描述处理过UNDO相关的ORA-600错误。
- 十二:如何限制指定用户使用UNDO大小。
- 十三:如果设置Temporary Undo。
- 十四:DML(insert/delete/update)哪种操作产生的UNDO最多。
- 十五:请介绍UNDO常用的数据字典和视图有哪些。
- 十六:请介绍UNDO常用查询语句。
- 参考
在Oracle中,如何查询数据库系统或当前会话的Redo和Undo的生成量?
⊙ 在Oracle中,如何查询数据库系统或当前会话的Redo和Undo的生成量?
在Oracle中,在UNDO表空间数据文件丢失的情况下如何恢复?
⊙ 在Oracle中,在UNDO表空间数据文件丢失的情况下如何恢复?
在Oracle中,Undo的作用是什么?
在Oracle中,如何监控TEMP和UNDO表空间并将耗费TEMP和UNDO空间非常大的SQL语句记录?
⊙ 在Oracle中,如何监控TEMP和UNDO表空间并将耗费TEMP和UNDO空间非常大的SQL语句记录?
在Oracle中,Undo段存储了哪些内容?
在Oracle中,什么是块清除(Block Cleanout)?
⊙ 在Oracle中,什么是块清除(Block Cleanout)?
在Oracle中,Undo段中区3种状态分别是什么(Undo表空间系列)?
⊙ 在Oracle中,Undo段中区3种状态分别是什么(Undo表空间系列)?
在Oracle中,什么是ORA-01555错误?
在Oracle中,RAC环境下所有数据库实例可以使用同一个Undo表空间吗?
⊙ 在Oracle中,RAC环境下所有数据库实例可以使用同一个Undo表空间吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 一:请描述什么是Oracle Undo。 二:请描述UNDO的作用。 三:请谈谈你对Manual Undo Management和Automatic Undo Management管理的理解。 四:请描述UNDO Retention。 五:如何确保在undo_retention期间的数据不会被覆盖。 六:请描述ORA-01555错误原因和解决思路。 七:请描述LOB字段产生ORA-01555错误原因和解决思路。 八:请描述ORA-30036错误原因和解决思路。 九:当UNDO表空间不足时,如何将相关信息记录在告警日志中。 十:如何评估所需UNDO大小。 十一:请描述处理过UNDO相关的ORA-600错误。 十二:如何限制指定用户使用UNDO大小。 十三:如果设置Temporary Undo。 十四:DML(insert/delete/update)哪种操作产生的UNDO最多。 十五:请介绍UNDO常用的数据字典和视图有哪些。 十六:请介绍UNDO常用查询语句。 |
一:请描述什么是Oracle Undo?
1 2 3 4 5 6 7 8 9 | 官方解释如下: 什么是UNDO? What Is Undo? Oracle数据库创建和管理用于回滚或撤消对数据库的更改的数据。 Oracle Database creates and manages information that is used to roll back, or undo, changes to the database. 这些信息主要包括交易行为的记录,主要是在交易被提交之前。 Such information consists of records of the actions of transactions, primarily before they are committed. 这些记录统称为undo。 These records are collectively referred to as undo. |
二:请描述UNDO的作用?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 1.回滚事务。 2.实例恢复。 实例恢复过程中,想通过redo记录对checkpoint之后的脏块队列进行前滚操作。 对于所有未提交的脏块,oracle根据undo的前镜像进行回滚(行级别的逻辑反操作),重新将内存中缓存的相关数据脏块换为非脏块。 3.提供一致性读。 执行查询时,服务器进程扫描这个表中的数据块时,会把每个数据块ITL槽中最大的SCN与查询SCN进行比较,如果比查询SCN小则说明这个数据块没有被修改服务器进程直接进行数据读取即可。 如果数据块ITL槽中的SCN大于查询SCN那么说明这个数据块在发起查询后被修改了,需要借助undo去获取发起查询那个时刻数据块的数据。 4.闪回部分相关操作 闪回查询 例如: select * from t1 as of timestamp (systimestamp - interval '120' second); ---查询t1表120秒之前的数据 select * from t1 as of timestamp (systimestamp - interval '2' minute); ---查询t1表2分钟之前的数据 select * from t1 as of timestamp (systimestamp - interval '12' hour); ---查询t1表12小时之前的数据 select * from t1 as of timestamp (systimestamp - interval '12' day); ---查询t1表12天之前的数据 select * from t1 as of timestamp to_timestamp('2021-05-23 19:30:30','yyyy-mm-dd hh24:mi:ss'); ---查询之前指定时间点数据 select * from t1 as of timestamp sysdate-2; ---查询t1表2天之前的数据 SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL; SELECT * FROM FLASH_TBL AS OF SCN 1257245; ---查询指定scn时刻数据 select timestamp_to_scn(to_timestamp('2014-08-24 05:15:22','yyyy-mm-dd hh24:mi:ss')) scn from dual; --时间和scn之间的转换 闪回版本查询 select versions_starttime, versions_endtime, versions_xid, versions_operation, rate from rates versions between timestamp minvalue and maxvalue order by VERSIONS_STARTTIME; 注:versions_starttime : 这个数据开始生效的时间 VERSIONS_ENDTIME :这个数据失效的时间--一般就是下面一条记录开始的时间 versions_xid : 显示了更改该行的事务标识符。 VERSION_OPERATION :这条记录执行的操作(Insert/Update/Delete) SELECT UNDO_SQL FROM FLASHBACK_TRANSACTION_QUERY WHERE XID = '000A000D00000029'; 闪回事务查询。 闪回事务查询有别于闪回查询的特点有以下3个: (1)其正常工作不但需要利用撤销数据,还需要事先启用最小补充日志。 (2)返回的结果不是以前的“旧”数据,而是能够将当前数据修改为以前的样子的撤销SQL(Undo SQL)语句。 (3)集中地在名为flashback_transaction_query表上查询,而不是在各个表上通过“as of”或“versions between”子句查询。 SQL> alter database add supplemental log data; 例如: select versions_xid, versions_startscn, department_id, department_name from hr.departments versions between timestamp minvalue and maxvalue where department_id = 999 order by 2 nulls first; |
官方解释如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Undo记录用于: Undo records are used to: 1 当执行rollback命令时,回滚事务。 Roll back transactions when a ROLLBACK statement is issued 2 恢复数据库。 Recover the database 3 提供一致性读。 Provide read consistency 4 使用Oracle Flashback查询分析截至较早时间点的数据 Analyze data as of an earlier point in time by using Oracle Flashback Query 5 使用Oracle Flashback功能从逻辑损坏中恢复 Recover from logical corruptions using Oracle Flashback features When a ROLLBACK statement is issued, undo records are used to undo changes that were made to the database by the uncommitted transaction. During database recovery, undo records are used to undo any uncommitted changes applied from the redo log to the data files. Undo records provide read consistency by maintaining the before image of the data for users who are accessing the data at the same time that another user is changing it. |
三:请谈谈你对Manual Undo Management和Automatic Undo Management管理的理解?
Manual Undo Management
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 手工管理重做段的创建、分配、调整。Oracle9i之前的唯一方法。 回滚段的分配和使用 当有事务产生时,数据库会给事务分配一个回滚段。当然我们可以指定事务使用某个回滚段。 select SEGMENT_ID ,SEGMENT_NAME from dba_rollback_segs; set transaction use rollback segment rbsxxx; 如果我们不人为的指定使用哪个回滚段,则数据库会根据回滚段中事务来权衡,以使得所有回滚段中事务压力尽可能平均。 在这种模式下,通过回滚段管理撤消空间,不使用UNDO表空间。 The database can also run in manual undo management mode. In this mode, undo space is managed through rollback segments, and no undo tablespace is used. 注: 回滚段的空间管理很复杂。Oracle强烈建议将数据库置于自动撤消管理模式。 Note: Space management for rollback segments is complex. Oracle strongly recommends leaving the database in automatic undo management mode. |
Automatic Undo Management
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 请描述自动撤销管理Automatic Undo Management Introduction to Automatic Undo Management Oracle提供了一种完全自动化的机制,称为自动撤消管理,用于管理撤消信息和空间。 Oracle provides a fully automated mechanism, referred to as automatic undo management, for managing undo information and space. 通过自动撤消管理,数据库管理撤消表空间中的撤消段。 With automatic undo management, the database manages undo segments in an undo tablespace. 当数据库实例启动时,数据库会自动选择第一个可用的undo表空间。 When the database instance starts, the database automatically selects the first available undo tablespace. 如果没有可用的undo表空间,则实例将在没有undo表空间的情况下启动,并在SYSTEM系统表空间中存储undo记录。 If no undo tablespace is available, then the instance starts without an undo tablespace and stores undo records in the SYSTEM tablespace. 不建议这样做,并且会向警报日志文件中写入一条警报消息,以警告系统在没有撤消表空间的情况下运行。 This is not recommended, and an alert message is written to the alert log file to warn that the system is running without an undo tablespace. 如果数据库包含多个undo表空间,则可以选择在启动时指定要使用特定undo表空间。这是通过设置UNDO_TABLESPACE初始化参数来完成的,如本例所示: If the database contains multiple undo tablespaces, then you can optionally specify at startup that you want to use a specific undo tablespace. This is done by setting the UNDO_TABLESPACE initialization parameter, as shown in this example: UNDO_TABLESPACE = undotbs_01 如果初始化参数中指定的表空间不存在,则STARTUP命令失败。 UNDO_TABLESPACEE参数可用于将特定的UNDO表空间分配给Oracle Real Application Clusters环境中的实例。 If the tablespace specified in the initialization parameter does not exist, the STARTUP command fails. The UNDO_TABLESPACE parameter can be used to assign a specific undo tablespace to an instance in an Oracle Real Application Clusters environment. |
以下是撤消管理的初始化参数摘要:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | The following is a summary of the initialization parameters for undo management: UNDO_MANAGEMENT 如果为AUTO或null,则启用自动撤消管理。如果为MANUAL,则设置手动撤消管理模式。默认值为“AUTO”。 If AUTO or null, enables automatic undo management. If MANUAL, sets manual undo management mode. The default is AUTO. UNDO_TABLESPACE 可选,仅在自动撤消管理模式下有效。指定撤消表空间的名称。 Optional, and valid only in automatic undo management mode. Specifies the name of an undo tablespace. 仅当数据库有多个undo表空间并且希望指示数据库实例使用特定的undo表空间时才使用。 Use only when the database has multiple undo tablespaces and you want to direct the database instance to use a particular undo tablespace. 注意:Oracle数据库的早期版本默认为手动撤消管理模式。 要更改为自动撤消管理,必须首先创建一个撤消表空间,然后将UNDO_MANAGEMENT初始化参数更改为AUTO。 如果您的Oracle数据库是Oracle9i或更高版本,并且要更改为自动撤消管理,请参阅《Oracle数据库升级指南》以获取说明。 Note: Earlier releases of Oracle Database default to manual undo management mode. To change to automatic undo management, you must first create an undo tablespace and then change the UNDO_MANAGEMENT initialization parameter to AUTO. If your Oracle Database is Oracle9i or later and you want to change to automatic undo management, see Oracle Database Upgrade Guide for instructions. 在Oracle Database 11g及更高版本中,UNDO_MANAGEMENT初始化参数默认为null,即为自动撤消管理模式,但在早期版本中默认为手动撤消管理模式。 因此,将以前的版本升级到当前版本时必须小心。 《Oracle数据库升级指南》介绍了迁移到自动撤消管理模式的正确方法,包括有关如何调整撤消表空间大小的信息。 A null UNDO_MANAGEMENT initialization parameter defaults to automatic undo management mode in Oracle Database 11g and later,but defaults to manual undo management mode in earlier releases. You must therefore use caution when upgrading a previous release to the current release. Oracle Database Upgrade Guide describes the correct method of migrating to automatic undo management mode, including information on how to size the undo tablespace. Managing Rollback/Undo Segments in AUM (Automatic Undo Management) (Doc ID 135090.1) AUM下,不能在UNDO表空间下创建表或回滚段。 You cannot use undo tablespaces for other purposes than undo segments and you cannot perform any operation on system generated undo segments: SQL> create table T (c number) tablespace undo_rbs1; create table T (c number) tablespace undo_rbs1 * ERROR at line 1: ORA-30022: Cannot create segments in undo tablespace SQL> create rollback segment undo_rs1 tablespace undo_rbs1; create rollback segment undo_rs1 tablespace undo_rbs1 * ERROR at line 1: ORA-30019: RBU Rollback Segment operation not supported in SMU mode Automatic Undo Management and Real Application Clusters The Automatic Undo Management feature is also useful in Real Application Clusters environments. All instances within Real Application Clusters environments must run in the same undo mode. Set the global parameter UNDO_MANAGEMENT to AUTO in your server parameter file. |
四:请描述对UNDO Retention的理解?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | undo_retention表示已经提交或回滚的事物在UNDO EXTENT中保留的时间; 当事物结束时间 <= undo_retention时,UNDO EXTENT在dba_undo_extents.status中状态为UNEXPIRED; 当事物结束时间 > undo_retention时,UNDO EXTENT在dba_undo_extents.status中状态为EXPIRED; 当事物没有结束时 , UNDO EXTENT在dba_undo_extents.status中 状态为 ACTIVE; select t.status,sum(t.blocks)*8/1024||'M' from dba_undo_extents t group by t.status; STATUS SUM(T.BLOCKS)*8/1024||'M' --------- ----------------------------------------- UNEXPIRED 11.125M EXPIRED 41.125M ACTIVE 19.125M The Undo Retention Period undo retention period是Oracle数据库在覆盖以前尝试保留旧撤消信息的最短时间。 The undo retention period is the minimum amount of time that Oracle Database attempts to retain old undo information before overwriting it. About the Undo Retention Period 启用自动撤消管理时,总是有一个当前撤消保留期,这是Oracle数据库在覆盖以前尝试保留旧撤消信息的最短时间。 When automatic undo management is enabled, there is always a current undo retention period, which is the minimum amount of time that Oracle Database attempts to retain old undo information before overwriting it. 事务提交后,回滚或事务恢复不再需要撤消数据。 After a transaction is committed, undo data is no longer needed for rollback or transaction recovery purposes. 但是,出于一致的读取目的,长时间运行的查询可能需要这些旧的撤消信息来生成数据块的旧镜像。 However, for consistent read purposes, long-running queries may require this old undo information for producing older images of data blocks. 此外,几个Oracle Flashback功能的成功还取决于旧的撤消信息的可用性。 Furthermore, the success of several Oracle Flashback features can also depend upon the availability of older undo information. 出于这些原因,希望尽可能长时间地保留旧的撤消信息。 For these reasons, it is desirable to retain the old undo information for as long as possible. 旧的(已提交的)撤消信息早于当前撤消保留期,则表示该信息已过期,其空间可被新事务覆盖。 Old (committed) undo information that is older than the current undo retention period is said to be expired and its space is available to be overwritten by new transactions. 旧的撤销信息的期限小于当前撤销保留期,则称为未过期,并保留用于一致的读取和Oracle闪回操作。 Old undo information with an age that is less than the current undo retention period is said to be unexpired and is retained for consistent read and Oracle Flashback operations. Oracle数据库根据撤消表空间大小和系统活动自动调整撤消保留期。 Oracle Database automatically tunes the undo retention period based on undo tablespace size and system activity. 您可以选择通过设置UNDO_RETENTION初始化参数来指定最短的撤消保留期(以秒为单位)。 You can optionally specify a minimum undo retention period (in seconds) by setting the UNDO_RETENTION initialization parameter. |