Oracle数据库管理每周一例(12.2,18c,19c) 2020-08-30
第十二期 UNDO
本周,还是忙啊,星期四巡检发现一体机一根内存条异常了,然后晚上给这边网管库打补丁到第二天4点睡觉。星期五本来想上午休息结果有要到移动拿内存备件的快递,晚上又换内存到1点过睡觉。星期六依然早起去城市另一边的机房安装数据库,结果网没通,只能安装单节点RAC后面网通了在扩展。和上周一样,第二周写的本期。
1.undo的概念
说起undo,不得不提redo。当我们对数据进行DML操作时,redo会记录下我们对数据操作的前滚日志,当事务提交时会讲这些记录通过LGWR进程由redo buffer写入online redo log,再通过DBWR进程将对应数据变更写入到数据文件之中。undo则是将对应redo中的前滚操作的反向操作记录在undo表空间中,当事务回滚时,通过undo回滚redo中的操作。除了用于回滚数据,undo还用于数据库恢复、读一致性和闪回查询。这里先简略再说一下数据库恢复:当实例出现异常后启动时,数据库会先使用redo去进行数据恢复(包括提交和未提交的事务),再利用undo回滚未提交的事务。
2.undo表空间语句
创建undo表空间的语句如下:
CREATE [BIGFILE | SMALLFILE] UNDO TABLESPACE tbs_name
DATAFILE 'path/filename' SIZE integer [K | M] [REUSE]
[AUTOEXTEND] [OFF | ON] NEXT integer [K | M] MAXSIZE [UNLIMITED | integer [K | M] ]
[EXTENT MANAGEMENT LOCAL] [AUTOALLOCATE]
[RETENTION GUARANTEE | NOGUARANTEE]
某个实例需要使用该undo表空间则需要做出以下配置:
ALTER SYSTEM SET UNDO_TABLESPACE='tbs_name' sid='sidn';
给undo表空间增加数据文件的语句和给普通表空间增加一致:
ALTER TABLESPACE tbs_name ADD DATAFILE size ...;
删除undo表空间
DROP TABLESPACE tbs_name including contents and datafiles;
3.管理undo
undo_retention参数控制的是undo信息在undo表空间中的最大留存时间,通过以下语句进行查看、变更:
show parameter undo_retention
alter system set undo_retention=5400;
这里设置单位为秒,即设置为5400秒,90分钟,undo信息在超过90分钟后即为过期,其占用的undo段可以复用。但是有以下特殊情况:
当undo表空间容量不足时,undo表空间会舍弃掉最早的undo信息,哪怕是在undo_retention时间内的undo信息,这样会造成对应SQL执行失败。在某些情况下,需要确保undo表空间中的undo信息保留到undo_retention设置的时间,则需要对表空间执行以下操作:
alter tablespace tbs_name retention guarantee;
当undo表空间设置了retention guarantee之后,undo表空间会确保所有的undo信息都会保留至undo_retention设置的时间,这样确实可以确保诸如一些长SQL执行能够成功,但是这样又会出下以下的问题:因为无论大小事务的undo信息都会在undo表空间中保留到undo_retention,比如小事务完成后,其undo信息也会保留很长时间后其undo段才能被复用,这样一来,很多没有必要保留那么长时间的undo信息就会长时间占用undo表空间,造成undo表空间的容量浪费,可能引起undo表空间的极大占用。因此我们一般不会给undo表空间设置retention guarantee。
alter tablespace tbs_name retention noguarantee;
为了确保大事务能够正常执行,我们需要在确定最长事务执行时间的基础上配置合理的undo_retention参数;由于很多大事务需要连续的段,因此常规操作数据量的基础上需要额外配置undo表空间的大小。在一个数据库刚开始运行的时候还是需要对undo表空间进行监控,根据情况调整undo表空间的大小。
4.多租户环境和RAC中的undo
从12.2开始,每个PDB可以使用独立的undo表空间,CDB也有自己的undo表空间。在PDB的undo表空间容量不足时,会借用CDB的undo表空间。因此在不确定PDB的undo表空间大小、避免监控间隔未及时调整undo表空间影响业务,可以预先设置较大的CDB的undo表空间。
在RAC环境中,如果PDB使用了local_undo,那么每个节点实例上CDB和PDB都拥有自己的undo表空间。
5.undo相关检查
通过以下的语句,可以用html的格式输出数据库undo相关信息:
spool /tmp/undo_information.html
set markup HTML on
PROMPT check parameter setting
set linesize 500
col name for a30
col value for a50
PROMPT check tablespace setting
select con_id,tablespace_name,status,retention from cdb_tablespaces where tablespace_name like '%UNDO%';
PROMPT check file size in tablespace
select a.CON_ID,a.TABLESPACE_NAME,b.FILE_NAME,b.bytes/1024/1024 size_M from cdb_tablespaces a,CDB_DATA_FILES b where a.TABLESPACE_NAME=b.TABLESPACE_NAME and a.con_id=b.con_id and a.CONTENTS='UNDO';
PROMPT check status of undo
select status,sum(bytes /(1024*1024)) from dba_undo_extents group by status;
select max(maxquerylen),max(tuned_undoretention) from v$undostat;
select segment_name, nvl(sum(act),0) "ACT BYTES",
nvl(sum(unexp),0) "UNEXP BYTES",
nvl(sum(exp),0) "EXP BYTES"
from (select segment_name, nvl(sum(bytes),0) act,00 unexp, 00 exp
from dba_undo_extents where status='ACTIVE' group by segment_name
union
select segment_name, 00 act, nvl(sum(bytes),0) unexp, 00 exp
from dba_undo_extents where status='UNEXPIRED' group by segment_name
union
select segment_name, 00 act, 00 unexp, nvl(sum(bytes),0) exp
from dba_undo_extents where status='EXPIRED' group by segment_name)
group by segment_name
order by 1;
spool off
exit
下期预告:
DBRU中的新变化。