UNDO是什么?
Oracle数据库创建并管理被用来回滚、撤销,和对数据库更改的信息,这些信息主要由被提交前的事务行为记录组成,这些记录统称为UNDO。
UNDO有什么作用?
当ROLLBACK语句执行时进行回滚事务;
恢复数据库;
提供读一致性;
使用闪回查询分析更早时间点的数据;
使用闪回特性恢复逻辑故障。
当ROLLBACK语句执行时,通过未提交的事务,UNDO记录被用来撤销对数据库所做的更改;当数据库恢复时,利用UNDO记录撤销任何未提交的更改,并将重做日志应用到数据文件,从而实现事务的恢复;UNDO记录通过维护数据的前映像来提供读一致性。
ORA-01555 快照过旧:由于事务提交而导致回滚段被覆盖,从而引起快照过旧的问题,可以通过undo_retention参数来解决。该参数是一个时间值,默认是900秒,说明当还原段中的数据在事务提交后继续保留的时间。
UNDO块状态
Active:表示正在使用该数据块的事务还没有提交或者回滚;
Inactive:该数据块上没有活动的事务,该状态的UNDO可以被其他事务覆盖;
Expired:该数据块持续Inactive的时间超过undo_retention所指定的时间;
Freed:该数据块是空的,从来没有被使用过。
自动UNDO管理
从11g开始,Oracle数据库的还原段的管理是自动维护的,即自动UNDO管理。在Oracle 11g中,需要设置两个参数来实现UNDO的自动管理,这两个参数分别是undo_management 和undo_tablespace,undo_management说明UNDO的管理方式,它是一个静态参数,需要重启数据库方可生效;undo_tablespace说明还原表空间的名字,是一个动态参数,可才数据库运行期间动态修改。
查看UNDO信息
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL>
管理UNDO
1、创建还原表空间
SQL> create undo tablespace my_undo_tbs
2 datafile '/u01/app/oracle/oradata/orcl/myundotbs01'
3 size 100m
4 autoextend on;
Tablespace created.
SQL> select tablespace_name,status,logging,extent_management
2 from dba_tablespaces
3 where contents='UNDO';
TABLESPACE_NAME STATUS LOGGING EXTENT_MAN
------------------------------ --------- --------- ----------
UNDOTBS1 ONLINE LOGGING LOCAL
MY_UNDO_TBS ONLINE LOGGING LOCAL
SQL> select file_name,file_id,tablespace_name,online_status
2 from dba_data_files
3 where tablespace_name='MY_UNDO_TBS';
FILE_NAME FILE_ID TABLESPACE_NAME ONLINE_
-------------------------------------------------- ---------- ------------------------------ -------
/u01/app/oracle/oradata/orcl/myundotbs01 6 MY_UNDO_TBS ONLINE
2、增加数据文件
SQL> alter tablespace my_undo_tbs
2 add datafile '/u01/app/oracle/oradata/orcl/myundotbs02.dbf'
3 size 100m;
Tablespace altered.
SQL> select file_name, file_id,autoextensible,online_status
2 from dba_data_files
3 where tablespace_name='MY_UNDO_TBS';
FILE_NAME FILE_ID AUT ONLINE_
-------------------------------------------------- ---------- --- -------
/u01/app/oracle/oradata/orcl/myundotbs01 6 YES ONLINE
/u01/app/oracle/oradata/orcl/myundotbs02.dbf 7 NO ONLINE
3、修改数据文件为自动扩展
SQL> alter database
2 datafile '/u01/app/oracle/oradata/orcl/myundotbs02.dbf'
3 autoextend on
4 maxsize unlimited;
Database altered.
SQL> select file_name, file_id,autoextensible,online_status
2 from dba_data_files
3 where tablespace_name='MY_UNDO_TBS';
FILE_NAME FILE_ID AUT ONLINE_
-------------------------------------------------- ---------- --- -------
/u01/app/oracle/oradata/orcl/myundotbs01 6 YES ONLINE
/u01/app/oracle/oradata/orcl/myundotbs02.dbf 7 YES ONLINE
4、删除还原表空间
SQL> drop tablespace my_undo_tbs;
Tablespace dropped.
5、重命名还原表空间
SQL> alter tablespace my_undo_tbs
2 rename to orcl_undo_tbs;
Tablespace altered.
6、切换还原表空间
切换前:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
切换:
SQL> alter system set undo_tablespace='ORCL_UNDO_TBS';
System altered.
切换后:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string ORCL_UNDO_TBS
UNDO数据字典视图
1、查询回滚段的名字
SQL> SELECT t1.username,t1.osuser,t2.used_ublk,t3.name FROM v$session t1
join v$transaction t2
on t1.saddr=t2.ses_addr
join v$rollname t3
on t3.usn=t2.xidusn;
USERNAME OSUSER USED_UBLK NAME
------------------------------ ------------------------------ ---------- ------------------------------
SYS oracle 1 _SYSSMU17_4127386468$
SQL>
SQL> SELECT owner, segment_name, tablespace_name, extent_id, file_id, status
FROM dba_undo_extents
where segment_name = '_SYSSMU17_4127386468$';
OWN SEGMENT_NAME TABLESPACE_NAME EXTENT_ID FILE_ID STATUS
--- ------------------------------ ------------------------------ ---------- ---------- ---------
SYS _SYSSMU17_4127386468$ ORCL_UNDO_TBS 0 6 ACTIVE
SYS _SYSSMU17_4127386468$ ORCL_UNDO_TBS 1 6 EXPIRED
2、其他数据字典视图
SELECT * FROM V$UNDOSTAT;
SELECT * FROM V$ROLLSTAT;
SELECT * FROM DBA_HIST_UNDOSTAT;