一、概述
Oracle文件系统包括实例相关的文件:参数文件、跟踪文件、警告文件;数据库相关的文件:控制文件、数据文件、重做日志文件、临时文件、密码文件、修改跟踪文件、闪回日志文件。另外一些与数据库相关的其他文件转储文件、数据泵文件、平面文件不在此处细说。
二、参数文件(parameter file)
记录控制文件所在位置,存储一些参数,如内存配置相关、恢复相关、数据库名等,包括db_name、sga_aggregate_target、shared_pool_size、java_pool_size、db_block_size等的值,实例启动和运行会用到这些参数。另外还指定了控制文件存储的地方。
10g以前是每个客户端都存储一个initOID.ora的文件,10g后只在服务端存储一份,防止参数文件在客户端泛滥。可以通过命令行把spfile转储成文本的pfile,恢复数据库启动实例时候还是会用到pfile的。可以通过如下命令来根据spfile创建pfile:
SQL> create pfile from spfile; 文件已创建。
生成的文件在%ORACLE_HOME%\dbhome_1\database目录下,如我的是INITorc11gr2.ORA。
可以通过命令修改这些参数:
alter system set parameter = value [comment = 'text'] [deferred] [scope = memory|spfile|both ]
parameter = value提供了参数及其相应的值,如sga_target = 800m
comment = 'text' 为参数添加注释,可以说明修改原因,
问题是这个注释存储在哪里?
deferred表示不是立即生效,是在下次启动时候才生效。有些参数并不是修改后立即生效的,比如?
scope表示修改参数作用范围,如果是memory表示只在当前实例生效;spfile指写到参数文件,下次生效;both表示当前实例生效并写入参数文件。
跟deferred有冲突的?如果是memory并且deferred什么情况?
三、跟踪文件(trace file)
记录数据库对某些时间的响应,记录数据库的调试信息,用于数据库出错诊断。
又分为core、background和user三种类型的跟踪文件,通过sql可以得到三个文件存放的位置:
SQL> show parameter dump_dest;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
background_dump_dest string d:\oracle\diag\rdbms\orc11gr2\orc11gr2\trace
core_dump_dest string d:\oracle\diag\rdbms\orc11gr2\orc11gr2\cdump
user_dump_dest string d:\oracle\diag\rdbms\orc11gr2\orc11gr2\trace
这个是oracle11g的结果,在oracle10g,目录是有差异的。
其中background_dump_dest是共享服务器连接时进程的跟踪文件所在目录,user_dump_dest是专用服务器连接时进程的跟踪文件目录。core_dump_dest是系统出现严重问题时候的诊断信息。
可以通过三种方式启动记录跟踪文件:
1、alter system set sql_trace=true;
2、dbms_monitor
3、通过事件
如何提取跟踪文件信息?如何阅读?
四、警告文件(alert file)
数据库的完整日志信息,包括启动、停止、异常终止等。改动系统参数信息也会记录在警告文件里,在oracle11g是存放在D:\oracle\diag\rdbms\orc11gr2\orc11gr2\alert\log.xml文件里。
五、控制文件(control file)
记录数据文件、重做日志文件和临时文件所在位置。记录检查点信息等。
控制文件是二进制文件,参数文件中有记录控制文件存在何处。
六、数据文件(data file)
存放数据的文件。oracle存储数据的文件可以是多种文件类型:
1、cooked文件系统,数据文件作为操作系统的文件存在,可以在硬盘上看到这类文件,对此文件读写可以利用os的缓存。
优缺点?
2、raw文件系统,数据直接存储在原始分区上,从os上看不到这类文件,不能利用os的缓存,
但是这种文件系统操作更快?优缺点?
3、自从存储管理?
4、集群文件系统,集群环境下使用的文件系统,控制处理并发访问。
数据的存储,在逻辑上分为是有多层的体系结构的:
a、表空间,表空间包含有一到多个数据文件,表空间创建后可以给用户使用。
b、段segment,每个数据库对象至少属于一个段,如表段、索引段、回滚段、聚集段、lob段。一个对象可能包含多个段。表空间由段组成,一个段可以跨多个数据文件,但是不能跨表空间。
c、区段extent,段由区段组成,区段是逻辑上连续的一块存储空间,物理上可能不连续。段的两个区段也可能不连续。区段不能跨段,不能跨数据文件。
d、数据块db block,区段由数据块组成,数据块大小一般是2m、4m、8m、16m、32m,也可是是非2的幂大小。多种块大小一般在数据交换的环境中。
如果一个系统有些数据表列比较多,有些表列比较少,可以通过不同的数据块大小来提高性能么?数据块的逻辑上又可以划分为多个部分:块首部,包含数据块地址、当前事务和上次事务信息等;表目录,块上数据的表信息,一个块上可能存储了多个表的数据,如聚簇表;行目录,块上存储的数据行的信息,此处存储了每一行数据的地址;空闲空间,是未使用的空间;数据部分,存储的是数据。
如何知道表空间、段、区段、块信息?
通过以下sql可以知道用户的表空间和临时表空间信息:
SQL> select username, default_tablespace,temporary_tablespace from dba_users;
获取表空间信息数据文件信息:
SQL> select f.tablespace_name,trim(f.file_name),s.block_size from dba_tablespaces s left join dba_data_files f on f.tablespace_name = s.tablespace_name;
获取表空间的段信息:
SQL> select seg.segment_name,seg.segment_type,seg.segment_subtype, seg.tablespace_name,ts.extent_management from dba_segments seg join dba_tablespaces ts on seg.tablespace_name = ts.tablespace_name where ts.tablespace_name = 'USERS'获取区段信息:
SQL> select seg.segment_name,seg.segment_type,seg.segment_subtype, seg.tablespace_name,ts.extent_management,ext.* from dba_segments seg join dba_tablespaces ts on seg.tablespace_name = ts.tablespace_name join dba_extents ext on ext.segment_name = seg.segment_name where ts.tablespace_name = 'SYSTEM';
获取块信息如何获取?通过DBA_TABLES.BLOCKS获取分配给表的块,DBA_SEGMENTS.BLOCKS获取分配给段的块数,
具体信息那里获取呢?
七、临时文件(temporary file)
存放排序、hash数据,以及临时表数据。如果排序或者hash的时候,内存放不下,就会放到临时文件中。临时文件和临时表空间什么关系?如何查看临时文件信息?
八、重做日志文件(redo log file)
事务的日志文件,用来回放事务。有了重做日志,就可以把之前做过的事情再做一遍了,比如delete的重做就是重新delete。重做日志主要有三个作用:
· 数据库服务器掉电后的恢复
· 介质恢复
·
standby
· 数据共享,数据同步。Golden Gate就是通过redo log实现数据同步、共享和转移的。
重做日志还分为联机重做日志和归档重做日志。
联机重做日志是指数据库LGWR进程写日志数据时候用的日志文件
。分为多个组,每次使用一个组的日志文件,等用完后就下一组,等所有组的日志文件都用完后就重新使用第一组的,循环使用。因为循环使用,所以会把一段时间之前的日志给覆盖掉,如果没有把日志转储到别的地方就覆盖了,等系统崩溃或者介质失败的时候,就可能导致数据丢失。
归档重做日志
就是在日志被覆盖之前将其转储到别的地方,这些被转储的日志就叫归档重做日志。
九、密码文件(password file)
远程登录时候的密码验证策略等信息。
十、修改跟踪文件(change trace file)
用作增量备份,记录每次修改的内容。再有修改跟踪文件之前,每次增量备份都要读取所有数据,计算差异,生成增量备份信息。
存在何处?
十一、闪回恢复文件
用作闪回数据库,快速的将数据库对象回退到某一时刻。在数据库提供闪回功能之前,数据库或数据库对象要想回退到某一时刻的状态,就必须恢复某段时间以前的数据库,然后通过重做日志文件冲做到需要回退到的时刻。有了闪回功能之后,可以轻松的恢复到某个时刻:
flashback database to scn 1157722;最后那个数字是系统修改号,通过dbms_flashback.get_system_change_number获取。 但是开发人员或者dba不可能时时刻刻都记录一个scn,这样恢复起来不是还不知恢复到何时?
闪回恢复文件存在何处?