oracle-dba-UNDO表空间管理

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 v sessiona,v rollname b ,v transactioncWherea.saddr=c.sesaddrandb.usn=c.xidusn;使:SYSSMU283237543520
查看该回滚段所在的表空间以及区段信息
Select segment_name,tablespace_name,extent_id from dba_undo_extents where segment_name=’_SYSSMU28_3237543520$’;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要释放Oracle 11g中的undo表空间,可以按照以下步骤操作: 1. 首先,确认当前undo表空间的使用情况,可以使用以下命令查询: SELECT tablespace_name, sum(bytes)/1024/1024 "Size (MB)", sum(maxbytes)/1024/1024 "Max Size (MB)" FROM dba_data_files WHERE tablespace_name = 'UNDOTBS1' GROUP BY tablespace_name; 其中,'UNDOTBS1'为当前使用的undo表空间名称。 2. 确认当前没有任何事务在进行中,可以使用以下命令查询: SELECT COUNT(*) FROM v$transaction; 如果返回结果为0,则表示当前没有事务在进行中。 3. 执行以下命令释放undo表空间: ALTER SYSTEM CHECKPOINT; ALTER SYSTEM SET UNDO_RETENTION=0; ALTER TABLESPACE UNDOTBS1 OFFLINE IMMEDIATE; DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES; 其中,'UNDOTBS1'为当前使用的undo表空间名称。 4. 最后,确认undo表空间已经释放,可以使用以下命令查询: SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name = 'UNDOTBS1'; 如果返回结果为'PENDING OFFLINE',则表示undo表空间已经成功释放。 注意:释放undo表空间可能会导致数据丢失,请谨慎操作。建议在备份数据后再进行操作。 ### 回答2: 当Oracle数据库中的Undo表空间(也称为回滚段)不再使用时,它可以被释放以节省磁盘空间。在Oracle 11g中,可以按照以下步骤来释放Undo表空间: 1. 确定未使用的Undo表空间:首先需要确定哪些Undo表空间未使用。可以通过查询v$undostat视图来获取当前的Undo表空间使用情况。该视图提供有关Undo表空间大小、使用量、可用量等等信息。 2. 切换所有事务到新Undo表空间:在释放旧的Undo表空间之前,需要将所有正在运行的事务切换到新的Undo表空间中。可以通过以下方法创建一个新的Undo表空间: CREATE UNDO TABLESPACE new_undo_ts DATAFILE '/path/to/new_undo_ts.dbf' SIZE 10G; ALTER SYSTEM SET UNDO_TABLESPACE=new_undo_ts SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP; 在创建新的Undo表空间之后,需要将所有正在使用旧Undo表空间的事务切换到新的Undo表空间中。可以使用以下命令来完成: ALTER SYSTEM SET UNDO_TABLESPACE=new_undo_ts; 3. 等待Undo表空间变为闲置状态:在切换所有事务到新Undo表空间之后,需要等待旧的Undo表空间变为闲置状态。可以通过查询v$rollstat视图来检查它的状态。当状态更改为“NEEDS_COMPACT”时,就开始可以释放旧的Undo表空间了。 4. 释放Undo表空间:使用以下命令释放Undo表空间: ALTER TABLESPACE old_undo_ts OFFLINE; DROP TABLESPACE old_undo_ts INCLUDING CONTENTS AND DATAFILES; 此时,“old_undo_ts”是要释放的Undo表空间的名称。 总之,在释放Undo表空间之前,需要确保所有活动的事务切换到新的Undo表空间中,并且该Undo表空间处于“闲置”状态。释放Undo表空间应该是仔细计划和谨慎实施的过程。 ### 回答3: 当Oracle 11g释放undo表空间时,需要遵循以下步骤: 1. 确认undo表空间已经没有任何无需保留的信息。可以通过检查v$rollstat动态视图、使用SQL查询语句或运行Oracle标准性能分析工具来查看当前undo空间的使用情况。 2. 执行回滚段清理,并确保没有任何未提交的事务或会话进行操作。可以使用以下语句进行回滚段清理: ALTER SYSTEM CHECKPOINT; 3. 确定当前正在使用的回滚段及其数据文件。可以使用以下语句来查询当前正在使用的回滚段: SELECT segment_name, tablespace_name FROM dba_rollback_segs WHERE status = 'USABLE' AND tablespace_name = '&tablespace_name'; 4. 更改所有正在使用的回滚段的表空间为新的undo表空间。可以使用以下语句来更改表空间: ALTER ROLLBACK SEGMENT &segment_name ONLINE; ALTER ROLLBACK SEGMENT &segment_name STORAGE (TABLESPACE &new_tablespace); 5. 删除所有旧的undo表空间。可以使用以下语句来删除表空间: DROP TABLESPACE &old_tablespace INCLUDING CONTENTS AND DATAFILES; 需要注意的是,释放undo表空间不会发生立即效果,因为Oracle在使用undo信息时会将其添加到其内部事务表中,所以要等待所有当前执行的事务完成并更新内部事务表后,才能彻底释放undo表空间。同时,释放undo表空间也要谨慎操作,以免影响数据库的稳定性和数据完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值