时间就是挤得嘛,不然我买的那些书,啥时能看完呢,话不多说,开始正事。
这篇涉及段的管理、控制文件、重做日志文件、归档日志文件
段可分为表段、索引段、UNDO段、临时段、LOB段等
段的分配与删除
段的分配
默认情况下,ORACLE按照表空间的区管理方式为段分配存储,但用户若是想要段的管理方式不同于表空间的方式,则可以通过存储参数来指定,如下:
CREATE TABLE XXX(ID INT) TABLESPACE XX STORAGE(INITIAL 2M NEXT 3M)
上面的sql乍看是指定表创建时,指定第一个区大小为2MB,第二个区为3MB,其实另有玄机,实际情况分为两种:
(1)如果XX表空间的区管理方式是“AUOALLOCATE”,则段中的区有4个可选值:64KB、1MB、8MB、64MB,如果用户通过存储参数指定的分区是这四个中的一个,那么实际分配大小和指定的一致,如果指定的大小不在四个里面,那么将按照从上面四个值中不超过指定大小的最大的一个,例如:INITIAL 是2M,则段会实际分配两个区,每个区大小为1M,如果INITIAL 是65MB,则也会分配两个区,每个大小为64MB,段的分配可以从dba_segments、user_segment中查到
(2)如果表空间的区管理方式是“UNIFORM_SIZE”,假设UNIFORM_SIZE是3MB,那么该表空间的每个区都是3MB,INITIAL是2M时,则实际会分配一个区3MB,INITIAL是7MB时会分配三个区,每个区3MB。
移动数据库对象后,段中区的分配情况、数据块大小会根据表空间的改变而改变。
ALTER TABLE XX MOVE TABLESPACE XXX;
ALTER INDEX XX REBUILD TABLESPACE XXX;
段的延迟创建
段、表、索引都是可以创建的,就是说表、索引在创建时,它们的信息可以只是在数据字典中存在,而不是立即的分配空间,只有当真正使用时(例如插入数据),才会分配空间。
段的延迟有两种:
(1).通过初始化参数DEFERRED_SEGMENT_CREAION来指定,TRUE(默认方式)是使用延迟创建,FALSE则相反。
ALTER SESSION SET deferred_segment_creaion=TRUE;
(2).表上指定延迟,11.2版本开始表的创建默认采用延迟,表的延迟优先于初始化参数DEFERRED_SEGMENT_CREAION的延迟,sql如下:
CREATE TABLE XX(ID INT) SEGMENT CREATION DEFERRED;
#延迟创建
CREATE TABLE XX(ID INT) SEGMENT CREATION IMMEDIATE TABLESPACE XXX;
#立即创建
(3).索引的段是否延迟取决于该表的段是否延迟,当然,索引段也可以明确指定要不要延迟,sql如下:
CREATE INDEX XX ON XXX(ID) UNUSABLE;
#延迟创建
ALTER INDEX XX REBUILD;
#立即重建索引
ALTER INDEX XX UNUSABLE;
#删除索引数据,不删除字典信息
段的空间回收
我们知道段的分配是由高水位线HWM的位置决定的,当做insert操作时,HWM不断上升,即使delete操作后,HWM也是不变,而HWM影响着数据的扫描,过多的空间碎片会降低数据库的效率,由以下方式降低高水位线HWM
(1)使用ddl语句,导出后,drop或truncate操作再导入
(2)使用move降低高水位线,但是move会锁表,数据小还好,数据大了,就不适用了
ALTER TABLE XX MOVE;
ALTER TABLE XX TABLESPACE XXX;
(3)使用下面的sql回收
ALTER TABLE XX DEALLOCATE UNUSED;
ALTER INDEX XX DEALLOCATE UNUSED;
ALTER TABLE XX DEALLOCATE UNUSED KEEP 100M;
数据库会自动分辨这些对象哪些空间是可以回收的,哪些需要保留的,之后会回收那些可回收的空间。
控制文件
它是一个二进制的文件,数据库的任何结构变化都会被写入到控制文件,它里面记录了一下信息:
(1)数据库的名称
(2)数据文件和重做日志的路径及名称
(3)数据库创建的时间戳
(4)检查点的信息
(5)对数据库出所做的备份记录
(6)当前日志组的SEQUENCE号
如果控制文件的丢失或损坏,数据库服务及最多只能启动到nomount状态,因此它很重要,一般情况下会对它进行多元化,就是说生成两个控制文件,它们互相作为镜像,两个文件内容完全相同,可以通过下面操作指定多元化控制文件:
a.修改初始化参数
ALTER SYSTEM SET control_file="/u01/app/data/control01.ctl","/u02/app/data/control02.ctl" SCOPE=SPFILE;
b.关闭数据库,将控制文件根据路径复制出来另一个
c.启动数据库
重做日志文件
数据要发生变化时,服务器进程会将原先的数据写入重做日志缓冲区中,然后在数据库缓冲区修改相应的缓冲区(脏缓冲区),在重做日志中记录事务的执行情况(什么时间、什么用户、对什么数据做了什么),在一定时间下,后台进程DBWR将数据库缓冲区中的脏缓存区写入到文件,后台进程LGWR将重做日志缓冲区的内容写入到重做日志文件。
即使事务没有提交,数据文件、重做日志文件也可能被写入,只是没有记录SCN号,重做日志缓冲区的修改速度总是比数据缓冲区的要快,因为重做日志缓冲区时连续的内存地址,也正是这样,假如速度相反,为了保证重做日志的产生,则会产生大量的事务的等待。
数据库启动时会对比控制文件、重做日志、数据文件的SCN号,如果它们的最大scn号一致,则正常启动,否则,会启动异常,假设控制文件和重做日志的最大SCN一致,数据文件的最大SCN比它们的小,则数据会先按照重做日志的记录进行前滚,等数据完整了,再按照数据文件的SCN号进行回滚,最后将当前SCN写入到控制文件和重做日志文件并启动数据库。
数据库中至少要有两个重做日志组,一个组写满换另一个组接替,一个组可能有很多重做日志文件,但每个日志文件的内容和大小则会完全相同。与重做日志相关的视图有两个:V$LOG和V$LOGFILE,分别记录重做日志组信息和重做日志文件信息。
ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/app/data/redo41.log',
'/u01/app/data/redo42.log') SIZE 500M;
#添加日志组
ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/data/redo22.log' TO GROUP 2,'/u01/app/redo32.log' TO GROUP 3;
#向日志组中添加文件(添加的文件会在下次写入该日志组时写入数据)
ALTER DATABASE DROP LOGFILE GROUP 4;
#删除重做日志组4
ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/data/redo22.log';
#删除重做日志文件
ALTER SYSTEM SWITCH LOGFILE;
#手动切换重做日志组
重做日志组太小可能会产生的问题:当事务频繁时,很容易便写满了1日志组,当一个循环后轮到1日志组时,1日志组的文件还在归档,这时后来的事务便会挂起,等待这个日志组归档后才能运行。
归档日志
它其实就是将重做日志文件保存下来,数据库可以选择是否开启归档模式(通过ARCHIVE LOG LIST查看日志模式)。
SELECT log_mode FROM v$database;
#查询日志模式
切换归档
SHUTDOWN;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG(或NOARCHIVELOG);
ALTER DATABASE OPEN;
如果不开启归档,则重做日志会不断的被覆盖,开启了归档后,重做日志会按照一定的规则保留下来,规则如下,且必须包含以下三个变量:
%S:数据库使用重做日志组的SEQUENCE编号,而且在左边补0,补够10位,SEQUENCE永不会重复。
%T:代表重做日志的THREAD编号,而且在左边补0,补够4位,在单机数据库中,这个变量的值是1,在RAC环境中,变量值顺实际编号相同。
%R:代表数据库最近一次以RESETLOGS方式打开时的时间戳,而且在左边补0,补够10位。
如果是%s,%t,%r含义相同,只不过不在左边补0.
它们是通过初始化参数指定的:
ALTER SYSTEM SET log_archive_format='ARCH%S_%R_%T' SCOPE=SPFILE;
在任何时刻,一个归档进程(ARC0、ARC1...中的一个)只能对一个重组日志组进行归档,如果归档进程太少,导致日志组被写满,归档没有及时完成,就会导致事务被挂起。归档进程的数量由LOG_ARCHIVE_MAX_PROCESSES进行设置,它的最大值是30.
ALTER SYSTEM SET log_archive_max_processes=4;
可以从视图V$ARCHIVE_PROCESSES中查询每个归档进程的状态,归档日志信息可以从V$ARCHIVED_LOG中查询。
归档还有一种模式,就是手动归档,需要管理员对日志组手动归档,归档不及时会导致事务挂起,切换如下:
ALTER DATABASE ARCHIVELOG MANUAL;
#切换成手动归档
ALTER SYSTEM ARCHIVE LOG ALL;
#对重做日志组进行归档
ALTER SYSTEM ARCHIVE LOG CURRENT;
#对当前重做日志组进行归档
归档路径
归档文件需要存到某个目录,如果没有指定,则默认存在快速恢复区(通过ARCHIVE LOG LIST查看),快速恢复区可以防止疏忽没有设归档路径,但是快速恢复区大小是有限制的,因此需要指定归档日志路径:
(1)
ALTER SYSTEM SET log_archive_dest='/u01/aechive';
ALTER SYSTEM SET log_archive_duplex_dest='/u01/archive2';
#ORACLE会在这两个目录下同时产生日志文件
(2) 另外ORACLE还提供了另外一组参数LOG_ARCHIVE_DEST_n(n为131),用来指定31个存储位置,这个与(1)不能同时使用,另外还提供了31个参数LOG_ARCHIVE_DEST_STATE_n(n为131)用于指定归档路径的状态,这些参数的值为ENABLE(默认)或DEFER(不生效)、ALTERNATE(替代路径),该参数优先于强制路径,状态修改之后立刻生效。
ALTER SYSTEM SET log_archive_dest_1='location=/u01/archive1';
ALTER SYSTEM SET log_archive_dest_state_1=defer;
如果没有指定归档路径,则归档路径为快速快速恢复区,此时只有第一个初始化参数有具体参数值,其他的参数值都是空的:
LOG_ARCHIVE_DEST_1='location=use_db_recovery_file_dest';
另a. 初始化参数LOG_ARCHIVE_MIN_SUCCESSED_DEST用于指定成功产生归档日志文件的归档路径数量,默认值是1,如果设置成n,那么数据库至少保证在其中n个路径下能够成功产生归档日志文件,否则,数据库将挂起。
b.初始化参数LOG_ARCHIVE_DEST_n指定路径时,可以通过关键字MANDAORY指定某个归档路径为强制路径,或者通过OPTIONAL指定某个归档路径时可选路径,,强制路径会保证归档必须正常产生,否则挂起,如果归档在可选路径无法正常生成时,会自动忽略。
ALTER SYSTEM SET log_archive_dest_1='location=/archive mandatory'
只有前10个(n为1~10)可以为MANDAORY
c.替代路径,如果某个指定的路径不可用时,可以选择替代路径存储。
ALTER SYSTEM SET log_archive_dest_3='locatin=/u01/arch3'
ALTERNATE=log_archive_dest_4;
ALTER SYSTEM SET log_archive_dest_4='locatin=/u01/arch4';
ALTER SYSTEM SET log_archive_dest_state_4=ALTERNATE
#指定4为3的替代路径,平时4是不存的,当3出现故障无法使用时,才会存4
重做日志、归档日志也是二进制文件
浙公网安备 33010602011771号