oracle数据库重要的文件包括参数文件,控制文件,数据文件,临时文件,重做日志文件。
1 参数文件
oracle的参数文件可以设置数据库的名称,SGA和PGA的大小,控制文件的路径等系统参数。这些参数可以通过V$PARAMETER视图进行查询。oracle有两类参数文件,分别为pfile参数文件和spfile参数文件。oracle优先使用spfile参数文件,如果没有spfile参数文件,才会读取pfile参数文件的数据。
1.1 pfile参数文件
pfile参数文件的目录在Linux上一般是$ORACLE_HOME/dbs,文件名格式为init$ORACLE_SID.ora。可以通过文本编辑器进行编辑,而且可以保存在客户端,客户端可以根据客户端的参数文件启动数据库。
1.2 spfile参数文件
spfile参数文件的目录在Linux上一般是$ORACLE_HOME/dbs,文件名格式为spfile$ORACLE_SID.ora。spfile参数文件的参数不可以通过文本编辑器编辑。只能通过sql命令alter system set 命令来对系统参数进行设置,只能存放在oracle服务端。
1.3 pfile和spfile创建
只要pfile和spfile文件在系统默认目录上,都可以根据对方进行创建。
spfile根据pfile创建命令如下:
create spfile from pfile;
pfile根据spfile创建命令如下:
create pfile='init_ora12crl_2014.ora' from spfile;
有时候会遇到oracle重启数据库后,数据库因为spfile的参数设置不当,导致重启失败。因为没有成功启动数据库,所以也根据无法使用aler system set命令设置spfile的参数。我们就可以先根据spfile创建一个临时的pfile。然后用文本编辑器修改临时pfile参数文件里面的参数。启动数据库时指定这个临时的pfile启动数据库。
create pfile='init_ora12crl_2014.ora' from spfile;
startup pfile=init_ora12crl_2014.ora
2 控制文件
控制文件会记录数据文件,重做日志的路径。oracle启动过程中,先找到参数文件,根据参数文件的控制文件路径找到控制文件,然后再根据控制文件上记录的数据文件路径和重做日志路径找到数据文件、重做日志,才会开始加载数据,修复数据。控制文件还会记录一些其他信息,例如检查点,SCN等。
3 数据文件
oracle数据文件是存储数据的地方,包括oracle元数据以及应用数据。一般以dbf结尾。使用oracle的自动存储管理(Automatic Storage Management, ASM )技术进行管理。可以通过视图DBA_DATA_FILES去查询具体的数据文件信息,包括文件位置信息。数据文件从oracle物理存储概念去理解的。如果从逻辑存储概念去理解oracle的存储体系,从小到大可分为块,区段,段,表空间。
3.1 块
块是oracle最小的空间分配单位。可以在创建数据时指定大小,也可以在创建表空间时指定块的大小,每个表空间可以设置不同的块大小。块大小一般设置为2KB、4KB、 8KB或16KB。从一般的表的块的结构来看,块可以拆分为首部,表目录,行目录,已用空间,空闲空间等。
- 首部一般含有块所属对象类型的信息(例如表块,索引块)、块在磁盘上的位置信息,块上的事务信息。
- 表目录记录这个块上包含哪些表
- 行目录记录这个块上表的行的描述信息
3.2 区段
区段是文件的一段逻辑上连续的块。是oracle分配存储空间的基本单位。例如当插入数据到一张表里,这个表的空间已经满了,需要oracle分配空间,分配的单位是区段,根据需要分配多少个单位的区段。区段的大小可能不同,区段可能是一个块大小,但是最大可以到达2GB。一个区段必须分布在同一个数据文件中
3.3 段
段是oracle中占用存储空间的数据库对象。创建表时会创建一个段,创建索引也会创建一个段。需要注意的是,创建表时可能会创建多个段。例如创建一个表CREATE TEST(ID PRIMARY KEY)。TEST这个表会创建两个段,一个是TEST表本身,一个是为主键所创建的索引。段由一个或多个区段组成,不同的区段可分布在不同的数据文件中,因此一个段可以分布在同一个表空间上不同的数据文件上。
3.4 表空间
表空间是一个容器,包含多个段。 一个段不可以跨表空间存储。表空间由一个或者多个数据文件组成,一个数据文件不可以被多个表空间同时使用。下图显示了一个名为USER_DATA的表空间,其中包括2个数据文件user_data01. dbf和user_data02.dbf。在这个表空间中有3个段T1、T2和I1及其4个区段。段 T1包括两个区段,分别在不同的文件中;段T2和I1都各有一个区段。
4 临时文件
临时文件是临时表空间里面的文件,当oracle内存不足时,会使用临时文件存储临时数据。例如,当进行一些较大的排序的排序结果或者全局临时表的数据会使用到临时表空间,把数据放到临时文件上。使用视图DBA_TEMP_FILES可以查看具体的临时文件信息。
临时文件的数据有个特点,就是对临时文件数据的操作不会产生redo日志,但是会产生undo日志,进而生成保护undo的redo日志。因此在操作一个临时表时,操作本身不会产生redo,但会产生保护undo日志的redo日志。oralce 12c引入了一个参数TEMP_UNDO_ENABLED(会话和全局都可以设置),当这个参数设为TRUE时,全局临时表产生的undo会写入到临时表空间中。所以全局临时表就不会产生redo日志了。在一个存储过程中有临时表参与事务,可以在存储过程开头设置TEMP_UNDO_ENABLED为TRUNE。可以大大加快操作临时表的速度。
EXECUTE IMMEDIATE 'ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE';
5 重做日志文件
重做日志最重要的功能是实例失败后,能够恢复已经提交的事务,保证数据的一致性和原子性。ORACLE上几乎所有的操作都会记录在重做日志文件中。例如当我们往一个表插入一条记录时,这条记录也会写入redo日志文件。可以通过字典v$logfile查询具体的重做日志信息。当然,一些操作也可以尽量减少redo日志的产生,用来加快操作的完成。例如在创建表和创建索引时使用nologging。重做日志可分为在线重做日志以及归档重做日志。
5.1 在线重做日志
- 在线重做日志构成和日志切换
在线重做日志在oracle中至少有两组重做日志,每组重做日志包含一个或者多个在线重做日志文件,同一组内的重做日志内容完全一样。日志切换是指当一组重做日志写满时,oracle清空下一组重做日志并在下一组写入重做日志。所以,重做日志是循环使用的。 - 数据库高速缓存和重做日志缓存
数据库高速缓存是缓存从磁盘读取到的块以及修改后写入磁盘前的块,当我们在查询数据库的数据时,会先从磁盘的数据文件里读取对应的块,并把块放到高速缓存。这样下一次读同样的数据时不需要再次从磁盘读取。重做日志缓存是临时存储重做日志的内存区域,我们修改数据时产生的redo日志会先存放到重做日志缓存中。当我们提交事务时,数据库会将事务对应的重做日志缓存的数据写入到在线重做日志文件,但是提交事务时oracle不会将高速缓存中事务修改的块数据写入到数据文件中。当触发检查点时,才会将修改的块写入数据文件。 - 检查点
检查点的作用是要求数据库将高速缓存中的脏块写入磁盘。当我们写满日志文件组1并切换到日志文件组2时,Oracle就会启动一个检查点。此时,DBWn将日志文件组1所保护的所有脏块写至磁盘。
检查点触发的条件一般有如下条件- A. 在线重做日志切换
- B. 高速缓存快使用完时
- C. 满足log_checkpoint_timeout,log_checkpoint_interval触发参数
- 日志切换的悬停状态
在发生日志切换时,如果要切换到的下一组的重做日志所保护的脏块还在快速缓存中,还没有全部写入磁盘,这时需要等待DBWn进程将脏块全部写入磁盘。等待DBWn进程将脏块全部写入磁盘后,悬停状态才会结束,才会清空下一组重做日志文件并写入数据。
如果在跟踪文件目录的alter.log文件发现类似如下内容
Thread 1 cannot allocate new log, sequence 41801
Checkpoint not complete
说明发生日志切换悬停,需要增加重做日志组或者增大重做日志文件,避免因为日志切换悬停导致数据库卡顿。
5.2 归档重做日志
如果数据库处于归档模式,那当在线重做日志发生切换时,就会将当前刚写满的在线重做日志文件进行归档,复制在线重做日志数据到归档重做日志文件。如果归档进程参数(log_archive_max_processes)设置不当,可能会导致数据库卡顿。例如当前在线重做日志还没有完成归档,而且发生下一轮日志切换,重新要清空当前在线重做日志文件,但是无法清空,需要等待当前在线重启日志完成归档。