一.日志进程与联机redo日志
redo日志记录了数据库的所有操作,以及操作的顺序。Redo日志包括联机redo日志,归档redo日志和Standby Redo日志三种日志类型,这三种类型的日志在结构上完全相同的,只是用途不同而已。
redo数据只有再数据库恢复时才能体现出它的价值。在RAC环境中,每个实例的归档Redo日志可以放到本地文件系统,但是在实例恢复时需要将所有节点的的归档Redo放在一起,确保恢复的实例能够访问到所有实例的归档Redo日志。
每个实例都对应一个维护日志的日志线程(Redo Thread),单实例只有一个线程号为1的日志线程。对于RAC来说,日志线程和实例的关系可以通过以下查询得到
SQL> select thread#,checkpoint_change#,last_redo_change# from gv$thread;
THREAD# CHECKPOINT_CHANGE# LAST_REDO_CHANGE#
---------- ------------------ ------------------
1 32644532366 32645068421
2 32640774172 32645069778
1 32644532366 32645068421
2 32640774172 32645069778
查询线程和实例之间的关系:
SQL> select thread#,instance_name from gv$instance;
THREAD# INSTANCE_NAME
---------- ----------------
2 CWEOL2
1 CWEOL1
查询线程和日志之间的关系:
SQL> select group#,thread# from v$log;
GROUP# THREAD#
---------- ----------
1 1
2 1
3 2
4 2
5 1
6 1
7 2
8 2
8 rows selected.
二.UNDO表空间
UNDO 表空间存放的是数据块的前镜像数据,是块的多版本数据,用于数据库的恢复,一致性读和事务回滚,对数据库并发下读一致性起着重要的作用。
RAC环境中中,与联机Redo日志一样,每个实例都有自己的UNDO表空间,UNDO表空间必须放在共享存储上,每个实例都能够访问到所有实例的UNDO表空间,以便任一活动实例都能够执行所有的实例恢复操作。每个实例有自己独立的UNDO表空间还能减少实例对UNDO表空间的争用。
UNDO参数:
(1)undo_managment初始化参数
undo_management指定系统使用的UNDO表空间管理模式。一般设置为AUTO
(2) UNDO_RETENTION初始化参数
undo_retention指定的是事务提交之后UNDO数据保留的时间
SQL> show parameter undo_retention;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 900
undo_retention指定的事务提交之后UNDO数据保留的时间。事务提交之后,UNDO数据不再需要用于回滚或者事务恢复,但一致性读可能还需要用到这些UNDO数据。例如,长时间允许的查询需要旧的UNDO数据产生一致性读。此外FLASHBACK的部分特性也依赖UNDO数据。基于以上两点,应该设置足够大的undo表空间,尽量长时间保留已提交的数据。
undo_retention参数并不保证已提交的数据在undo_retention指定时间内依然保留。如果UNDO表空间不足,为了满足新的事务UNDO段的请求,也可能清除还未到达undo_retention指定时间的undo数据。Oracle数据库会尽量长时间地保留UNDO表空间的数据。
(3)UNDO_TABLESPACE初始化参数:
每个数据库可以有多个UNDO表空间,但是对于每一个实例只有一个活动的UNDO表空间。在RAC环境中,每个实例都对应一个UNDO表空间,UNDO_TABLESPACE用于指定实例对应的UNDO表空间。UNDO表空间无法进行收缩,如果UNDO表空间过大,只有通过替换的方式来缩小UNDO表空间的大小。
案例:修改数据库的回滚段表空间
1、创建一个新的UNDO表空间
SQL> create undo tablespace undotbs2 datafile '/u01/oracle/oradata/ORCL/undotbs02.dbf' size 2G;
Tablespace created.
2、-切换UNDO表空间
SQL> alter system set undo_tablespace=undotbs2 scope=both;
System altered.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS2
此时undotbs1表空间没用了。可以将其删除。
SQL> alter tablespace undotbs1 offline;
Tablespace altered.
SQL> drop tablespace undotbs1 including contents and datafiles;
Tablespace dropped.