zoukankan      html  css  js  c++  java
  • 手动创建数据库实例全攻略7:UNDO

    一、偷来的常识

    网络上这个哥们写的太精彩了,直接复制阅读之!

    文字来源:http://blog.csdn.net/tianlesoftware/article/details/4901666
    在开始之前,我们先来思考几个问题?
    1. ora-01555错误的是怎么产生的?有什么办法解决? 该问题,参考我的Blog: Oracle ORA-01555快照过旧 http://blog.csdn.net/tianlesoftware/archive/2009/10/31/4745898.aspx 2. 回滚段(回滚表空间)有什么作用? 3. 数据库启动的时候,如何加载回滚段(回滚段表空间)。 4. 回滚段的数量由什么公式来计算 5. 回滚表空间的大小如何确定? 一. 什么是undo Oracle数据库在回退、撤销或者改变数据所需要的维护数据库信息的一种手段。这里的数据库信息是指在数据库提交之前的记录的改变等事务信息。 Undo 信息主要有以下用途: 当系统发出rollback信息 数据库恢复 提供读一致性 当系统发出rollback命令时,undo 信息通过记录的信息将数据库的改变恢复到commit之前的状态。在数据库恢复期间,undo信息被用来从redo log中撤销任何未提交到数据文件的事务。当一个用户在访问数据时,Undo记录通过维护访问数据的前镜像数据来保证当有其他用户改变相同数据时数据库的读一致性。 以前数据库使用回滚段来存储undo信息,这种回滚段管理方式非常的复杂。现在数据库采用undo的方式降低了管理的复杂性,同时减少了dba的工作负荷。但是在数据库只能使用这两种方式的一种。可以在数据库里定义两种方式的文件,但是,同一时刻,必须指定数据使用哪一种方式。当你需要在两种方式中切换时,必须将系统重新启动。 Oracle数据库一直使用系统回滚段来完成系统的事务。系统回滚段是在数据库,创建的时候产生的,系统启动后就一直在线。Dba不需要对它作任何的操作来优化。 二. 指定Undo的方式 oracle 9i以后有个初始化参数:undo_management。当将undo_management设置成AUTO时系统使用重做表空间来管理回滚段,当它被设置成MENUAL时系统使用回滚段。 oracle推荐使用重做表空间代替回滚段。 当系统使用auto方式管理undo信息时,系统必须指定一个undo表空间。这个表空间可以是在数据库创建时产生,也可以数据库创建后再创建。 当实例启动的时候,系统自动选择第一个有效的undo表空间或者是rollback segment,如果没有有效的可用的undo表空间或者是回滚段,系统使用system rollback segment。这种情况是不被推荐的,当系统运行在没有undo的情况下,系统会在alert.log中记录一条警告信息。 2.1 自动管理模式(Automatic Undo Management) 如果系统使用要使用auto方式管理undo信息,那么需要通过指定初始化参数undo_tablespace的值来指定系统使用哪一个undo表空间来存放undo信息。如果指定了undo_tablespace的值,但是系统中不存在这样的表空间,那些系统启动将会失败。此时可以做的操作是,如果系统存在undo表空间,为undo_tablespace指定正确的undo表空间名字,或者将undo_tablespace注释。系统会采用存在的undo表空间。否则使用手动方式。 相关的初始化参数: undo_tablespace 指名系统使用哪一个重做表空间。 undo_suppress_errors 被设置成true时表示系统创建和使用回滚段时忽略错误。 undo_retention 系统提交后,回滚段的数据保留多长时间,单位是秒。 当系统被设置成menual后,这几个参数被忽略。 SQL> show parameter undo NAME TYPE VALUE ------------------------------------ - ---------- --------------- undo_management string AUTO undo_retention integer 1000 undo_tablespace string UNDOTBS1 补充:初始化参数UNDO_RETENTION 该参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改通常默认是900 秒,也就是15 分钟。 一定要注意,undo_retention 只是指定undo 数据的过期时间,并不是说,undo 中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建 一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo 表空间有足够的存储空间。 同时还要注意,也并不是说,undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。 只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖, 例如: SQL> Alter tablespace undotbs1 retention guarantee; 如果想禁止undo 表空间retention guarantee, 例如: SQL> Alter tablespace undotbs1 retention noguarantee; 2.2 manual管理模式 当将系统中初始化参数undo_management设置成manual后,系统启动后使用rollback segment方式存储undo信息。如果系统没有指定undo_management,那么系统默认以manual方式启动,即使设置了auto方式的参数,这些参数将被忽略。 当实例启动时,系统根据如下几个步骤确认online的rollback segment的数量: 初始化参数rollback_segments 初始化参数transactions、transactions_per_rollback_segment 与menual相关的初始化参数 rollback_segments 指定实例启动时所需要的回滚段 transactions 指定系统中最大的并发事务数 transactions_per_rollback_segment 指定每一个回滚段支持的并发数 max_rollback_segments 指明系统支持的最大的online的回滚段数目 三 . 管理undo tablespace 创建undo talespace有两种方式: 1. 数据库创建时创建undo tablespace; 2. 在一个已经存在的数据库创建。 在undo tablespace中不能创建数据库对象,这是因为这个表空间是为数据库recover而准备的。 3.1 创建数据库时创建undo tablespace 在创建数据库的时候可以通过指定undo子句来创建undo tablespace,但是这个子句不是必须的。 如果在创建数据库时,系统指定是auto模式,但是没有指明undo tablespace的名字,那么系统会创建一个默认的回滚表空间,名称叫sys_undotbs。这个表空间根据oracle定义的缺省值创建。初始化大小是10m,可以自动扩展。不过oracle推荐最好还是使用一个指定的大小。 CREATE DATABASE rbdb1 CONTROLFILE REUSE ... UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf'; 注意:如果此时系统创建undo失败,那么整个创建数据库的命令就失败了。此时 Dba需要删除已经创建的数据文件,纠正错误,重建创建数据库。 使用create undo tablespace子句创建 CREATE UNDO TABLESPACE undotbs_02 DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON; 3.2 Undo tablespace的相关操作 1. 增加数据文件 ALTER TABLESPACE undotbs_01 ADD DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED; 2. 重命名数据文件 ALTER TABLESPACE undotbs_01 RENAME DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' TO '/u01/oracle/rbdb1/undo0101.dbf'; 3. 使数据文件online或者offline ALTER TABLESPACE undotbs_01 online|offline; 4. 开始或者结束一个联机备份 ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP; 5. 删除undo tablespace Drop tablespace undotbs_01; Drop undo表空间的时候必须是在未使用的情况下才能进行。如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。在drop表空间的时候可以使用including contents。 6. 切换undo tablespace 切换undo表空间有两种方式: 1. 使用命令动态修改; 2. 修改初始化参数后重新启动数据库。 Alter system set undo_tablespace=undotbs1; 当切换命令完成后,所有的事务就会在新的回滚表空间内进行。 以下几种情况会导致切换命令失败: 1. 表空间不存在; 2.. 表空间不是一个回滚段表空间; 3. 表空间已经被另一个实例使用。 注意:切换的操作不等待旧undo表空间的事务提交。如果旧undo表空间有事务未提交,那么旧的undo表空间进入pending offline状态,在这种模式下所有的事务能够继续进行,但是undo表空间不能被其他实例使用,也不能被删除,直到所有的事务提交后, undo表空间才进入offline模式。 7. 设置undo_retention dba可以设置undo_retention初始化参数指定undo回滚表空间保留undo信息的时间。在设置好这个参数时,系统会保留undo信息在指定的时间断后才收回这个空间。 一般情况下,系统会保留undo信息到指定的时间后才回收空间,但是,如果系统 存在大量的事务,也会将未到期的undo空间回收,以供使用。 8. Undo 表空间大小的设计规范的计算公式 Undospace = UR * UPS *db_block_size+ 冗余量 UR: 表示在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。 UPS:表示在undo中,每秒产生的数据库块数量。 和undo有关的动态性能视图v$undostat 包含undo的统计信息。使用这张视图可以估计系统当前所需的undo大小。 v$rollstat 是undo模式的视图。是undo表空间的undo segments的统计信息 v$transaction 包含undo segments的信息。 dba_undo_extents 包含undo表空间中每一个范围的提交时间。 四. 管理回滚段 4.1 回滚段的使用方针 4.1.1 使用多个回滚段 使用多个回滚段来分担回滚段的争用,以提高系统性能。系统采用循环的方式来分配回滚段。当oracle创建数据库时候,系统自动在system中分配一个system rollback segment,用来完成系统的事务,不为大家共用。所以系统最后能有至少一个回滚段存放用户回滚信息。 系统能够加载的用户回滚段数量和以下几个初始化参数有关: transactions_per_rollback_segment 指定每一个回滚段支持的并发数; max_rollback_segments 指明系统支持的最大的online的回滚段数目; rollback_segments 指定实例启动时所需要的回滚段; 4.1.2 选择好回滚段的类型 private 必须通过实例指定名称后才能使用。 如:必须在初始化参数中rollback_segments指定后,实例启动才能使用,或者在实例启动后online才能使用。 Public 则是实例启动时系统自动发现,系统根据初始化参数决定系统启动时的回滚段。 4.1.3 为事务指定回滚段 在系统启动时指定所需要的回滚段, 4.1.4 估计回滚段的大小 回滚段大小应该基于系统最大的事务。如果回滚段过小,容易产生ora-01555错误。可以使用optimize选项来限制回滚段自动回收。回滚段的大小应该是最大表的大小的10%,这个可以指定maxextents的数量。 4.1.5 创建范围大小和数量相等的回滚段组 一般来说一个回滚段应该包含10到20个范围。 s=T/n s是初始化时定义的范围的大小,T是初始化的回滚段大小,n是范围数。由此可以确定定义回滚段的子句的各个参数。 4.1.6 定义optimal的值 设置这个参数可以避免回滚段无限扩展以及系统自动回收空间。最小是两个范围的大小。 设置回滚段在不同的表空间 1:如果系统只有一个回滚表空间,那么回滚段出现问题,影响系统不能运行。 2:包含回滚段的表空间经常分配和去配容易产生碎片。 3:当回滚表空间被离线时,系统将没有回滚表空间可以用。 MINEXTENTS最小等于2 OPTIMAL最小应该设置成两个extents大小 INITIAL和 NEXT最好一样,除了应用使用指定的回滚段; 4.2 回滚段的相关操作 4.2.1 创建回滚段 当创建回滚段时,系统必须要有CREATE ROLLBACK SEGMENT系统权限。 创建的回滚段会online,并指定了存储参数; CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1STORAGE ( INITIAL integer K|M NEXT integer K|M MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M ); 4.2.2 修改回滚段 修改回滚段当修改回滚段时,系统必须要有ALTER ROLLBACK SEGMENT系统权限。 使回滚段online或者offline; ALTER ROLLBACK SEGMENT RB01 ONLINE; 修改存储参数; ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K ); 收缩回滚段; ALTER ROLLBACK SEGMENT RB01 SHRINK; 注意:有OPTIMAL参数时, 缩小到OPTIMAL值; 没有OPTIMAL参数时, 缩小到MINEXTENTS所对应的尺寸 ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K; ALTER ROLLBACK SEGMENT RB01 STAROGE(MAXEXTENTS 120); 4.2.3 删除回滚段 当删除回滚段时,系统必须要有DROP ROLLBACK SEGMENT系统权限。 原则上,INITIAL总应该等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滚段。由于INITIAL不能直接修改,只能先drop然后创建。 DROP ROLLBACK SEGMENT RB01; CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1 STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K); 在事务中使用特定的回滚段 SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1; 通过这个命令,可以: 根据事务量的大小,决定使用哪一个回滚段; 将大的查询的事务放入单独的回滚段; 当存在大的查询使用事务时,可以将它放入大的回滚段。 4.3 和回滚段相关的性能视图 DBA_ROLLBACK_GEGS 描述回滚段的信息,包含回滚段的名字和表空间; DBA_SEGMENTS 描述回滚段的附加信息; V$ROLLNAME 列出在线回滚段的名称 V$ROLLSTAT 包含回滚段的统计信息 V$TRANSACTION 包含撤销的统计信息

    二、理解和实验

    ORACLE的UNDO实验如下,依旧参照网络文档:http://blog.csdn.net/tianlesoftware/article/details/5689558

    Oracle 的Undo有两种方式: 一是使用undo 表空间,二是使用回滚段. 
     
      我们通过 undo_management 参数来控制使用哪种方式,如果设为auto,就使用UNDO 表空间,这时必须要指定一个UNDO 表空间。 如果设为manual,系统启动后使用rollback segment方式存储undo信息。如果系统没有指定undo_management,那么系统默认以manual方式启动,即使设置了auto方式的参数,这些参数将被忽略。
    当实例启动的时候,系统自动选择第一个有效的undo表空间或者是rollback segment,如果没有有效的可用的undo表空间或者是回滚段,系统使用system rollback segment。这种情况是不被推荐的,当系统运行在没有undo的情况下,系统会在alert.log中记录一条警告信息。
    SQL> show parameter undo
    NAME                   TYPE        VALUE
    ------------------------------------ ----------- ------------------
    undo_management          string      AUTO
    undo_retention             integer     900
    undo_tablespace            string      UNDOTBS1
    参考:Oracle undo 管理
    http://blog.csdn.net/tianlesoftware/archive/2009/11/30/4901666.aspx
     
    一. UNDO 表空间
    下面来看一下undo 的表空间管理。先来查看一下表空间的使用情况:
    /* Formatted on 2010/6/23 9:46:58 (QP5 v5.115.810.9015) */
    SELECT   a.tablespace_name,
             ROUND (a.total_size) "total_size(MB)",
             ROUND (a.total_size) - ROUND (b.free_size, 3) "used_size(MB)",
             ROUND (b.free_size, 3) "free_size(MB)",
             ROUND (b.free_size / total_size * 100, 2) || '%' free_rate
      FROM   (  SELECT   tablespace_name, SUM (bytes) / 1024 / 1024 total_size
                  FROM   dba_data_files
              GROUP BY   tablespace_name) a,
             (  SELECT   tablespace_name, SUM (bytes) / 1024 / 1024 free_size
                  FROM   dba_free_space
              GROUP BY   tablespace_name) b
     WHERE   a.tablespace_name = b.tablespace_name(+);
    TABLESPACE_NAME      total_size(MB) used_size(MB) free_size(MB) FREE_RATE
    -------------------- -------------- ------------- ------------- --------------
    SYSAUX                   580       545.187        34.813  6%
    UNDOTBS1                 90        23.875        66.125  73.47%
    DAVE                      20          6.25         13.75  68.75%
    USERS                     10         8.375         1.625  16.25%
    SYSTEM                   960       951.062         8.938  93%
    从结果我们看到UNDO 表空间已经用了23.875M。 我们看一下这使用的23M空间里空闲和非空闲比例:
    /* Formatted on 2010/6/23 9:49:53 (QP5 v5.115.810.9015) */
      SELECT   tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)"
        FROM   dba_undo_extents
    GROUP BY   tablespace_name, status;
    TABLESPACE_NAME      STATUS      Bytes(M)
    -------------------- --------- ----------
    UNDOTBS1             UNEXPIRED     9.1875
    UNDOTBS1             EXPIRED      13.6875
    我们看一下查询的结果,UNEXPIRED 和EXPIRED 是已使用的undo 表空间,其中expired 说明是已经过期的数据,也就是15分钟(默认情况)以外的数据,以被覆盖,可以认为是空闲的。
    在此补充一点知识:
    采用UNDO 表空间时,会有一个参数UNDO_RETENTION,该参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改,通常默认是900 秒,也就是15 分钟。
    undo_retention 只是指定undo 数据的过期时间,并不是说,undo 中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo 表空间有足够的存储空间。
    undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。
    只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,例如:
    SQL> Alter tablespace undotbs1 retention guarantee;
     
    禁止undo 表空间retention guarantee,例如:
    SQL> Alter tablespace undotbs1 retention noguarantee;
    总结一下:
    UNDO 表空间是会被重用的,只有当事务没结束,或开了retention guarantee,或在undo_retention时间内不能被重用。
    在undo_retention规定的时间内,数据都是有效的,过期后都会设为无效,状态被改为Expired,这些回滚段将会被看作Free Space。但是只要数据没有被覆盖就可以使用。如果空间已满,新事务的数据会自动覆盖掉已经提交的事务数据,即使在undo_retention的时间内。除非指定Retention Guarantee模式,才能保证在undo_retention内不被覆盖。
    二. UNDO 表空间满了的处理方法
    2.1 先模拟UNDO 表空间满的情况
    
    SQL>  alter system set undo_retention=10800; -- 3个小时
    系统已更改。
    SQL> create undo tablespace undo datafile 'F:/backup/undo.dbf' size 1m ;
    表空间已创建。
    SQL> alter tablespace undo retention guarantee;
    表空间已更改。
    SQL> alter system set undo_tablespace=undo;
    系统已更改。
    SQL> create table DBA(id number);
    表已创建。
    SQL> begin
      2  for i in 1 .. 100000 loop
      3  insert into dba values(i);
      4  commit;
      5  end loop;
      6  end;
      7  /
    begin
    *1 行出现错误:
    ORA-30036: 无法按 8 扩展段 (在还原表空间 'UNDO' 中)
    ORA-06512: 在 line 3
    2.2 处理方法
    处理方法有两种,一是添加undo 表空间的数据文件,二是切换UNDO tablespace. 这种情况下多用在undo 表空间已经非常大的情况。 
    2.2.1 增加数据文件
    SQL> ALTER TABLESPACE undo ADD DATAFILE 'F:/backup/undo02.dbf' size 100M reuse;
    表空间已更改。
    SQL> begin
      2  for i in 1..100000 loop
      3  insert into dba values(1);
      4  commit;
      5  end loop;
      6  end;
      7  /
    PL/SQL 过程已成功完成。
    2.2.2 切换UNDO 表空间
    1、建立新的表空间UNDOTBS2
    SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE 'F:/backup/undo03.dbf' size 100M reuse;
    表空间已创建。
    2、切换到新建的UNOD表空间上来,操作如下
    SQL> alter system set undo_tablespace=UNDOTBS2 scope=both;
    系统已更改。
    3、将原来的UNDO表空间,置为脱机:
    SQL> alter tablespace UNDO offline;
    表空间已更改。
    4、删除原来的UNDO表空间:
    SQL> drop tablespace UNDO including contents AND DATAFILES CASCADE CONSTRAINTS ;
    表空间已删除。
    如果只是drop tablespace UNDO ,则只会在删除控制文件里的记录,并不会物理删除文件。 
    Drop undo表空间的时候必须是在未使用的情况下才能进行。如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。在drop表空间的时候可以使用including contents。
     
    三. UNDO 表空间损坏的恢复方法
    一般Undo 表空间损坏的情况下,数据库都已不能正常打开了。启动时都会报类似如下的错误:
    ORA-01157: cannot identify/lock data file 12 - see DBWR trace file
    ORA-01110: data file 12: '/d01/oramtest/proddata/undo01.dbf'
     要想解决问题,必须重建UNDO 表空间,但是如果不open, 就不能重建创建undo 表空间。 所以可以先用系统默认的undo 表空间:system rollback segment 来启动数据库,再创建UNDO 表空间。
    3.1 创建pfile 文件
    SQL> create pfile='F:/initorcl.ora' from spfile;
    文件已创建。
    3.2 修改pfile文件
    #*.undo_tablespace='UNDOTBS1'
    #*.undo_management='AUTO'
    undo_management='MANUAL'
    rollback_segments='SYSTEM'
    3.3 启动数据库至Mount 状态
    SQL> STARTUP MOUNT pfile='F:/initorcl.ora' ;
    3.4 offline drop undo 表空间
     SQL> ALTER DATABASE DATAFILE 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' OFFLINE DROP; 
    3.5 open 数据库
    SQL> ALTER DATABASE OPEN;
    3.6 删除旧的undo 表空间
    SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS;   
    注:该命令不会删除物理文件。 要想一起删除物理文件需要 AND DATAFILES CASCADE CONSTRAINTS ;
    如:  drop tablespace UNDOTBS1 including contents AND DATAFILES CASCADE CONSTRAINTS ;
    3.7 创建新的UNDO 表空间
    SQL> create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M ;
    create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M
    *1 行出现错误:
    ORA-01119: 创建数据库文件 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF'时出错
    ORA-27038: 所创建的文件已存在
    OSD-04010: 指定了 <create> 选项, 但文件已经存在
    因为我们之前删除时并没有删除物理文件,所以在建同名文件时就会报错。 我们可以加上REUSE 参数。 只要文件不在使用,就可以重写已经存在的文件。 
    SQL> create undo tablespace undotbs1 datafile 'D:/app/Administrator/oradata/orcl/UNDOTBS01.DBF' size 100M reuse;
    表空间已创建。
    3.8  shutdown 数据库 并将pfile 改回
    SQL> select name,issys_modifiable from v$parameter where name='undo_management' or name='rollback_segments';
    NAME             ISSYS_MOD
    --------------------     ---------
    rollback_segments    FALSE
    undo_management    FALSE
    从上面查询的结果,可以知道修改这2个参数必须重启数据,所以还是shutdown 吧。 
    SQL> shutdown immediate
    3.9 修改pfile 参数
    *.undo_tablespace='UNDOTBS1'
    *.undo_management='AUTO'
    #undo_management='MANUAL'
    #rollback_segments='SYSTEM'
    3.10 用刚才修改的pfile 启动数据库,并创建spfile
    SQL> startup pfile='F:/initorcl.ora' ;
    SQL> create spfile from pfile='F:/initorcl.ora';
    3.10 再次shutdown,用spfile 启动. 
    SQL> shutdown immediate
    SQL> startup
     
    一般数据文件损坏的情况也可以采用类似的方法, 先启动到mount, 在将损坏的数据文件offline drop。 在open 数据库,drop 掉损坏的数据文件。 当然这种做法有数据丢失。 能恢复的话,尽量恢复。 

    补充查询数据库的undo表空间和文件名不一致,用dba_tablespace表可以看到删除/添加的操作过程。

    三、参考

    参考文档:

    1、http://blog.csdn.net/tianlesoftware/article/details/5689558

    2、http://blog.csdn.net/tianlesoftware/article/details/4901666

    四、小结

     UNDO是ORACLE里的一个关键配置之一,非常值得学习与研究!

  • 相关阅读:
    解决执行sql脚本报错:没有足够的内存继续执行程序。
    正则表达式学习
    art-template模板引擎循环嵌套
    textarea 设置最长字数和显示剩余字数
    display:table-cell
    js 发送 ajax 是数组 后台循环 发送json 到前台的方法
    js 函数内数据调用
    Angular 原文输出
    Angular 路由跳转
    JQ 按钮实现两种功能
  • 原文地址:https://www.cnblogs.com/alexy/p/createdb7.html
Copyright © 2011-2022 走看看