oracle-dba-UNDO表空间管理 £神魔★判官ぃ 2022-07-16 16:07 218阅读 0赞 UNDO表空间管理 还原数据是为了实现数据更改的同时,其他用户或进程可以并发访问正在更新而没有提交的数据。 引入还原段的作用 解决修改数据时并行读数据的问题,即事务恢复,事务回滚,读一致性 当用户修改数据时,该数据首先复制到还原段上,一个事务将他需要修改的全部数据放在同一个还原段中。 事务恢复:将还原段上数据的变化记录在重做日志文件中。事务执行期间数据库实例崩溃,重启还原没提交的数据。 事务回滚:用户使用rollback,oracle服务器数据库就使用还原段中的数据完成数据的回滚 读一致性:用户修改数据,未提交,其他用户访问读取时,看到没被修改提交的数据,这些数据放在还原段中 还原段如何完成读一致性 表中有1W条数据,9点读取,9点15结束。按理说应该有1W条数据,可是中途有用户删除了一条数据,查询的是9999则为脏读。1W条才是正常。而还原段就是为了保证读取的是1W条。此为读一致性。 用户在9点发出select时,服务器会记录9点那个时候的SCN号(SCN号是以时间戳作为参数的一个函数返回值。Scn可以和时间戳相互转换),该SCN号应该大于T表中等于所有记录在数据块头部的ITL槽中的SCN号(多个ITL,SCN为最大那个)。服务器进程扫描T表,会把头部的ITL中的SCN和当前SCN比较,如果比他小,说明没修改,比他大说明修改,为了保证读一致性,会去根据ITL槽中记录的UNDO块的地址。进行读取。 若ITL槽中的SCN>9,接着找ITL槽中的UNDO地址,接着在找。直到找到比9点小的SCN,读取。没有找到ORA-1555 snapshoot too old 事务提交以后,undo回滚段就可以被覆盖,出现1555不可避免。 还原段的实例恢复与实务回滚 实例恢复时,oracle会读取回滚段的头部记录的事务表,每一个事务是否提交等信息都存在里面,对于未提交的事务完成回滚 回滚时(错误或者rollback都会产生),根据ITL槽中记录的undo数据块的地址找到undo数据块,从而实现恢复数据,即回滚事务。 Undo segment选择算法 将每一个undo segment绑定一个事务, 没空闲的undo segment,系统尝试将脱机的undo segment联机 没有可用的,创建新的,不能创建新的,寻找最早使用的undo segment。这种情况下 一个undo segment可能绑定多个事务同时进行。每隔12小时会收缩一次,删除idle状态的extent。 Dml操作需要undo时,发现空间不够,会唤醒SMON进行一次收缩将undo segment里面暂时没有使用的extent使用 讨论undo\_retention参数 时间值:说明当还原段中的数据在事务提交后继续保留的时间。默认900秒。超过时间该undo块可以被其他事务覆盖. 使用aum,设置undo\_retention后,undo存在4状态 Active:正在使用事务,还没有提交|回滚 Inactive:没有活动事务,可以被其他事务覆盖 Expired:inactive时间超过undo\_retention指定时间 Freed:数据块是空的,从未被使用 Undo表存在多个undo segment,undosegment存在多个extents。 Oracle11g中,undo表空间足够,oracle会将undo信息保留的时间与当前运行时间最长的查询所需要的时间相同。 默认情况下,oracle每隔30秒收集统计信息来自动调整undo retention。收集信息包括运行时间最长的查询和产生undo的速度。设置undo retention为0,使用自动调整功能。并且900秒最低限。不为0则不支持自动调整。 设置undo\_retention的值 Alter system set undo\_retention=1200; 校验值 Show parameter undo; 方式2 Select name,value from v$parameter where name=’undo\_retention’; Undo表空间数据文件可以设置自动扩展。 还原段分类 分为2类,系统还原段和非系统还原段。 系统还原段:系统表空间使用,当系统表空间中的对象发生变化,这些对象的原始值保存在此。可工作自动模式和手动模式。 非系统还原段:非非系统表空间使用。如用户表空间。 当一个数据库具有非系统表空间时,至少要一个非系统还原段|自动管理的还原表空间。 自动管理模式由数据库服务器自动维护,但至少需要一个还原表空间。 手动管理模式需要管理员创建非系统还原段。 手动的非系统还原段包括2类型,公有还原段(RAC多实例)和私有还原段。 Oracle9i以上都实现还原度胺的自动管理 使用自动管理需要首先创建一个还原表空间。并经还原表空间告诉数据库服务器,之后的维护工作由数据库服务器自动完成。 ORACLE自动还原段管理 设置还原段自动管理,设置2参数 1:undo\_management,说明还原段的管理方式。不是动态参数,需要在参数文件中修改,然后重启服务器生效 2:undo\_tablespace:说明还原表空间名字,动态参数 查看和还原段相关参数,也可以在init.ora配置文件看 Show parameter undo; AUTO自动管理,还原表空间UNDOTBS1; 修改还原表空间 Alter database set undo\_tablespace undo\_tablespace\_name; 创建还原表空间 创建还原表空间,自动扩展 Create undo tablespace my1\_undo Datafile ‘G:\\oracleDB\\temp\\my1\_undo.dbf’ size 100m autoextend on; 查看还原表空间信息 select tablespace\_name,extent\_management,contents,logging,status from dba\_tablespaces where contents=’UNDO’; 本地管理。LOGGING说明受到重做日志保护。在线,说明随时可以切换指令到此还原表空间。 查看还原表空间数据信息 Col tablespace\_name for a15 Col file\_name for a20 Select tablespace\_name,file\_name,bytes/1024/1024 MB,autoextensible from dba\_data\_files Where tablespace\_name= ‘MY\_UNDO’; 维护还原表空间 重命名还原表空间 Alter tablespace my\_undo rename to lin\_undo; 向还原表空间增加数据文件,达到增加还原表空间的容量 Alter tablespace lin\_undo add datafile ‘G:\\oracleDB\\temp\\MY\_UNDO1.DBF’ size 100m; 查看添加成员信息 Select tablespace\_name,file\_name,bytes/1024/1024 MB,autoextensible from dba\_data\_files Where tablespace\_name=’LIN\_UNDO’; 设置数据文件为自动扩展 Alter database datafile ‘G:\\ORACLEDB\\TEMP\\MY\_UNDO1.DBF’ autoextend on; 切换还原表空间 Oracle只允许有一个活跃的还原表空间 切换还原表空间 Alter system set undo\_tablespace=’LIN\_UNDO’; 验证是否成功undo\_tablespace为LIN\_UNDO说明成功 Show parameter undo; 删除undo表空间实例 1:创建undo Create undo tablespace my2\_undo Datafile ‘G:\\oracleDB\\temp\\my2\_undo.dbf’ size 100m autoextend on retention guarantee;保证给定时间内还原记录不会飞覆盖。 2:创建表,并插入数据,模拟事务 Create table t(id number,name varchar2(20)); Insert into t values(1,’hello’); 3:切换undo表空间 Alter system set undo\_tablespace= my2\_undo; 确认修改成功 Show parameter undo; 4:删除旧的表空间undotbs,此时报错,因为有活动事务。 Drop tablespace LIN\_UNDO ;= Drop tablespace LIN\_UNDO including contents; 提交后 Commit; 继续删除表,失败,因为该undo 的参数undo\_retention,在该参数范围内。Oracle依然会保留就得undo记录。所以不允许删除 设置retention guarantee属性,保证足够的时间内undo信息不会被覆盖掉 Alter tablespace undotbs1 retention guarantee; Dba\_undo\_extents数据字典 插入数据后,查看回滚段的名字 Select a.username,b.name,c.used\_ublk from vsessiona,vrollname b ,vtransactioncWherea.saddr=c.sesaddrandb.usn=c.xidusn;使用回滚字段名为:SYSSMU283237543520 查看该回滚段所在的表空间以及区段信息 Select segment\_name,tablespace\_name,extent\_id from dba\_undo\_extents where segment\_name=’\_SYSSMU28\_3237543520$’;
还没有评论,来说两句吧...