一、数据库的启动和关闭
Oracle Server共有2部分组成:Instance和Database.
Instance是指一组后台进程/线程和一块共享内存区域,而Database是指存储在磁盘上的一组物理文件。
1.1数据库的启动
数据库的启动主要分为3个步骤:
(1)启动数据库到nomount状态;
(2)启动数据库到mount状态;
(3)启动改数据库到open状态;
1.1.1启动数据库到nomount状态
Oracle首先会寻找参数文件(pfile/spfile),然后根据参数文件中的设置,创建实例,分配内存,启动后台进程!
该步只要拥有了1个参数文件,就可凭它重启实例(Instance). 该步不需要控制文件和数据文件的参与。
Oracle选择参数文件的顺序:
在Oracle9i里,Oracle首选spfile.ora文件作为启动参数文件;如果该文件不存在,Oracle选择spfile.ora文件;
如果前二者都不存在,Oracle将会选择init.ora文件;如果以上3个文件都不存在,Oracle将无法创建和启动Instance.
show parameter spfile:检查数据库是否使用了spfile文件,如果value不为null,说明使用了该文件;
在参数文件中,通常需要最少的参数是db_name,设置了这个参数之后,数据库实例就可以启动。
缺省情况下,如果不设置,background_dump_dest目录(警报日志文件alert_.log的存放地点)位于$ORACLE_HOME/rdbms/log目录下。
在使用RMAN(Recovery Manager)时存在更为特殊的情况,Oracle允许在不存在参数文件的情况下启动一个实例,数据库的db_name会被缺省的命名为DUMMY.
1.1.2启动数据库到mount状态
启动到nomount状态时,Oracle就可通过参数文件找到控制文件的位置信息。Oracle会默认创建3个控制文件,3个控制文件的内容完全一致。最后将这3个控制文件放在不同的磁盘上。
在nomount状态时,可v$parameter视图,获取参数文件信息;
在mount状态时,可查询v$controlfile视图,获取控制文件信息;
在mount数据库的过程中,Oracle需要找到控制文件并锁定控制文件;
如果丢失了1~2个控制文件,可通过复制完好的控制文件,并修改名称,来启动数据库;
如果3个控制文件全部丢失,就需要恢复或重建控制文件,来启动数据库。
在这一步骤中,数据库需要计算Mount_id并将记录在控制文件中,然后开始启动心跳,每3秒更新一次控制文件。
启动到mount状态,数据库必须具备的另一个重要文件是口令文件,该文件位于$ORACLE_HOME/dbs目录下,缺省名称为
orapw. 口令文件中存放sysdba/sysoper用户的用户名和口令。
在数据库没有启动之前,数据库内建用户是无法通过数据库本身来验证身份的,通过口令文件,Oracle可实现对用户的身份认证,在数据库未启动之前登录,进而启动数据库。
对于口令文件,缺省查找orapw文件,如果该文件不存在,则继续查找orapw文件,如果二者都不存在,则数据库报错。
如果口令文件丢失,可通过orapw工具重建,所以备份策略中必须包含口令文件;
1.1.3启动数据库open阶段
由于控制文件中记录了数据库中数据文件、日志文件的位置信息,检查点信息等重要信息,所以在此阶段,Oracle可根据控制文件这些文件进行检查点和完整性检查。
第一次检查数据文件头中的检查点计数是否和控制文件中的检查点计数一致。此步骤是为了确认数据文件来自同一版本。
第二次检查数据文件头的开始SCN和控制文件中记录的该文件的结束SCN是否一致。如果控制文件中记录的结束SCN等于数据文件头的开始SCN,则不需要对那个文件进行恢复。
对每个数据文件都完成检查后,打开数据库,锁定数据文件,同时将每个数据文件的结束SCN设置为无穷大。
仅在open阶段,oracle才尝试打开并锁定数据文件。
当数据库出现故障时,应首先检查警告日志(alert_.log),该日志中记录详细的错误信息和错误号。
1.2进阶内容
1.2.1 SCN
(1)SCN的定义
SCN(System Change Number)就是系统改变号,是一种数据结构;
SCN用以标识数据库在某个确切时刻提交的版本;在事务提交时,它赋予一个唯一的标识事务的SCN。
(2)SCN的获取方式
select dbms_flashback.get_system_change_number from dual;
1.2.2 检查点
(1)检查点的本质
检查点只是一个数据库事件,它存在的根本意义在于减少崩溃恢复时间;
查看当前实例的恢复状态:select 实例名 from v$instance_recovery;
1.3 数据库的实例恢复
实例恢复包括两个步骤:Cache Recovery和Transaction Recovery.
在启动数据库之后可以从alert_.log文件中获取数据库恢复的相关信息。
Cache Recovery的过程:首先读取日志,从最后完成的检查点开始,应用所有重做记录。该过程也称前滚;
在内部事务恢复中,一个大的事务可以被拆分,分配给几个服务器进程进行回滚。可以通过初始化参数FAST_START_PARALLEL_ROLLBACK来控制并行回滚,该参数有3个参数值:
FALSE:禁用Fast_Start_Parallel_Rollback;
LOW:限制恢复进程不能超过2倍的CPU_COUNT;
HIGH:限制恢复进程不能超过4倍的CPU_COUNT;
1.3 深入分析
1.3.1 获取数据库Open的跟踪文件
通过SQL_TRACE获得一个跟踪文件,跟踪文件里会记录从mount到open的过程中,Oracle所执行的后台操作;
1.3.2 bootstrap$及数据库初始化过程
Oracle是在内存中创建bootstrap$的结构,然后从数据文件的file 1 block 377 读取数据到内存中,完成第一次初始化;
bootstrap$表中记录了一些数据库系统基本对象的创建语句。Orace通过bootstrap$进行引导,进一步创建相关的重要对象,从而启动了数据库。
bootstrap$如果被恶意修改,当数据库关闭后,将无法再次启动;
二、参数及参数文件
2.1 初始化参数的分类
初始化参数可分为:推导参数、操作系统依赖参数和可变参数。
2.1.1 推导参数
推导参数通常来自其他参数的运算,依赖其他参数得出。该类参数一般不需要修改。例如:SESSION参数;
2.1.2 操作系统依赖参数
某些参数的有效值或取值范围或者依赖于操作系统,如db_cache_size参数,设置Oracle使用的内存大小,该参数的最大值就受限于物理内存。
2.1.3 可变参数
可变参数通常都可以修改,这些参数的修改关乎于系统性能。
2.1.4 初始化参数的获取
Oracle初始化参数可通过v$PARAMETER视图查询到,经常使用show parameter来查询;
以"_"开头的初始化参数称为隐含参数;一般不建议修改;
2.2参数文件
参数文件是一个包含一系列参数及参数对应值的操作系统文件,它有以下两种类型:
- 初始化参数文件
- 服务器参数文件
使用pfile存储参数,参数文件的修改需要手动进行,这些参数文件在系统实例启动时读取;
通过pfile的修改需要重启实例才能生效;
对于spfile文件,使用spfile用户可以通过ALTER SYSTEM或者ALTER SESSION 来修改参数,而无需手工修改;
对于动态参数,所有修改可以立即生效,同时用户可以选择使更改只应用于当前实例还是同时应用到spfile;
对于静态参数,只能将变更应用到spfile文件,这些变更在数据库重启后生效;
另外,spfile是一个二进制文件,可以通过RMAN进行备份;
2.2.2 SPFILE的创建
默认情况下,从Oracle9i开始,使用spfile启动数据库;spfile必须由pfile创建,新创建的spfile在下一次启动数据库时生效;
CREATE SPFILE需要SYSDBA或者SYSOPER的权限;具体语法如下:
CREATE SPFILE[='SPFILE-NAME'] FROM PFILE[='PFILE-NAME']
例如:
SQL>create spfile from pfile;
spfile默认创建如下缺省系统目录:
- 对于UNIX,目录为$ORACLE_HOME/dbs;
- 对于NT,目录为$ORACLE_HOME\database;
2.2.3 SPFILE的搜索顺序
重启数据库,使用startup命令,Oracle会按照如下顺序在缺省目录下搜索参数文件:
(1)spfile.ora,缺省目录如下:
- UNIX:$ORACLE_HOME/dbs/
- NT: %ORACLE_HOME%\database
- UNIX:$ORACLE_HOME/dbs/
- NT: %ORACLE_HOME%\database
- UNIX:$ORACLE_HOME/dbs/
- NT: %ORACLE_HOME%\database
创建了spfile,重新启动数据库,Oralce会按顺序搜索以上目录,spfile就会自动生效!
2.2.4 使用PFILE和SPFILE启动数据库
通过在pfile中调用spfile,使用后设置的参数覆盖spfile中的参数设置,是解决spfile中参数设置错误的一种方法;
2.2.5 修改参数
可以通过ALTER SYSTEM或导入导出来更改spfile的内容;
从Oracle9i开始,ALTER SYSTEM 命令增加了一个新的选项scope. scope参数有3个可选值:memory、spfile和both.
- memory: 只改变当前实例运行,重新启动数据库后失效;
- spfile: 只改变spfile的设置,不改变当前实例运行,重启数据库后生效;
- both : 同时改变实例及spfile ,当前更改立即生效,重启数据库后仍然有效;
针对RAC 环境,ALTER SYSTEM 还可以指定SID参数,对不同实例进行不同设置。
所以,通过spfile修改参数的完整命令如下:
alter system set = scope=memory|spfile|both [sid=]
scope参数的几个用法:
(1)scope=memory
该修改,在重启数据库后即失效;
(2)scope=spfile
当指定scope=spfile时,当前实例运行不受影响;
该修改,在下次重启数据库后生效;它虽对当前实例无效,但可通过v$spparameter视图中查询到。
(3)scope=both
使用both选项是实际上等同于不带参数的ALTER SYSTEM语句;
(4)RAC环境中的修改
在RAC环境中,如果不指定SID名称,或者指定为*,那么修改缺省的对所有实例生效;
如果需要修改指定的实例,则需要设置相应的SID参数;
(5)在关闭数据库状态修改为spfile
可以在数据库shutdown时创建和修改spfile
如果不慎错误修改了参数导致数据库无法启动时,可以通过修改pfile文件,修改其中的参数,再由pfile创建spfile的方式解决,最好由spfile正常启动数据库;
由spfile创建pfile文件语句: create pfile from spfile;
由pfile创建spfile文件语句: create spfile from pfile;
由于spfile是二进制文件,所以不能用手工方式去修改。不然,会损坏该文件!
2.2.6 重置spfile中设置的参数
当想要恢复某个参数为缺省值时,可用如下命令:
alter system reset parameter sid='sid|*'
2.2.7 是否使用了spfile
判断是否使用了spfile,可以有以下几种方法:
(1)查询v$parameter动态视图,如果以下查询返回空值,那么你在使用pfile
SQL> select name,value from v$parameter where name='spfile';
(2)使用show命令,返回空值,说明使用的是pfile
SQL>show parameter spfile;
(3)查询v$spparameter视图,如果如下查询结果返回0,表示使用的是pfile;
SQL>select count(*) from v$spparameter where value IS NOT NULL;
2.2.8 SPFILE的备份和恢复
如果配置了控制文件自动备份,那么oracle会在数据库发生重大变化时自动进行控制文件和spfile的备份。
(1)设置控制文件自动备份
SQL>rman target /
SQL>CONFIGURE CONTROLFILE AUTOBACKUP ON;
查询是否开启自动备份:select * from v$rman_configuration;
(2)使用自动备份恢复spfile文件
SQL>rman target /
SQL>restore spfile to '/tmp/spfileeygle.ora' from autobackup; #恢复spfile文件
SQL>restore controlfile to '/tmp/control01.ctl' from autobackup; #恢复控制文件
2.2.9 如何设置EVENTS事件
SQL>alter system set event='10841 trace name context forever' scope='spfile'; #设置event事件
SQL>alter system reset event scope=spfile sid='*'; #取消设置event事件
2.2.10 导出spfile文件
spfile文件可以导出为文本文件;
SQL>create pfile='e:\initeyglen.ora' from spfile;
2.3 诊断案例
2.3.1 登录系统检查alert.log文件
控制警报日志文件位置的初始化参数是BACKGROUD_DUMP_DEST; 缺省文件名为alert_.log
SQL>show parameter backgroud_dump_dest;
2.3.2 尝试重新启动数据库
2.3.3 检查数据文件
检查数据文件,查看UNDO表是否存在;
2.3.4 mount数据库,检查系统参数
2.3.5 检查参数文件
三、数据字典
3.1数据字典概述
数据字典是元数据的存储地点。
数据字典包括以下内容:
- 所有数据库Schema对象的定义(表、视图、索引、聚簇、同义词、序列、过程、函数、包、触发器等);
- 数据库空间分配和使用情况;
- 字段的缺省值;
- 完整性约束信息;
- Oracle用户名称,角色、权限等信息;
- 审计信息;
- 其他数据库信息;
3.2 内部RDBMS(X$)表
X$表用于跟踪内部数据库信息,维持数据库的正常运行。X$表是加密命名的,而且Oracle不做文档说明。
X$表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。该表不允许sysdba以外的用户访问。
可以通过设置autotrace来查看这些表:set autotrace trace explain;
3.3 数据字典表
数据字典表用于存储表、索引、约束以及其他数据库结构的信息。这些对象通常以$结尾,在创建数据库的时候通过运行sql.bsq脚本来创建!
sql.bsq文件中包含了数据字典表的定义及注释说明。该文件位于$ORACLE_HOME/dbms/admin目录下。
3.4 动态性能视图
该视图记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映当前数据库状态。
3.4.1 GV$和V$视图
GV$:全局视图,针对多个实例环境;
V$: 针对某个实例的视图;
X$:是GV$视图的数据来源,oracle内部表;
GV_$:是GV$的同义词;
V_$: 是V$的同义词;
我们可以使用V$FIXED_VIEW_DEFINITION视图查询到V$视图和GV$视图的定义。
在$ORACLE_HOME/rdbms/admin/catalog.sql中执行了cdfixed.sql脚本。我们在这个脚本中可以找到GV、$V_$同义词的创建。
SQL>select view_definition from v$fixed_view_definition where view_name='V$FIXED_TABLE';
SQL>select view_definition from v$fixed_view_definition where view_name='GV$FIXED_TABLE';
从查询结果可以看出:V$FIXED_TABLE是基于GV$FIXED_TABLE创建。
在进行数据访问时,Oracle访问VIEW优先,然后是同义词。
3.4.3 数据字典视图
数据字典视图是在X$表和数据字典表之上创建的视图,在创建数据库时由catalog.sql脚本创建。
数据字典视图分为如下3类:
- USER_类视图:包含了用户所拥有的相关对象信息;
- ALL_类视图:包含老用户有权限访问的所有相关对象信息;
- DBA_类视图:包含了数据库所有相关对象的信息;
通常USER_类视图不包含Owner字段。
Oracle的X$表信息可以从v$fixed_table中查询到。
总结下SQL语句中Oracle对于对象名的解析顺序:
(1)Oracle首先查看在发出命令的用户模式中是否存在表或视图;
(2)如果表和视图不存在,Oracle检查私有同义词是否存在;
(3)如果私有同义词存在,将使用这个同义词所引用的对象;
(4)如果私有同义词不存在,检查同名的公共同义词是否存在;
(5)如果公共同义词存在,将使用这个同义词所引用的对象;
(6)如果公共同义词不存在,Oracle返回消息“ORA-00942 table or view does not exist”
四、内存管理
4.1 SGA管理
4.1.1 什么是SGA
SGA指系统全局区(System Global Area),是一块用于加载数据、对象并保存运行状态和数据库控制信息的一块内存区域,在数据库实例启动时分配,当实例关闭时释放,每个实例都拥有自己的SGA区。
当数据库启动到nomount状态,SGA已经分配,同时启动后台进程。
SGA主要有以下几个部分组成:
(1)Buffer Cache-缓存区高速缓存,用于存储最近使用的数据块,这些数据块可能是被修改过的,也可能是未经修改的。
Buffer Cache的设置由3个参数决定:db_block_size、db_block_buffers、db_cache_size.
Buffer Cache的大小=db_block_size * db_block_buffers.
db_cache_size参数用于定义主Block Size的Default缓冲池大小!
db_cache_size的大小取决于估计的SGA的总大小:
- 如果估计的SGA 大小<128MB, 则值为4MB;
- 否则值为16MB;
4.2 PGA管理
PGA管理是指程序全局区(Program Global Area),是服务器进程使用的一块包含数据和控制信息的内存区域,PGA是非共享的内存,在服务器进程启动或创建时分配,并为Server Process排他访问。
PGA包含私有SQL区和session信息等内容;
所有服务器进程分配的PGA总和通常被称为PGA合计。PGA由一系列区域组成,这些区域包括主要由*_area_size参数控制。
主要参数有:
- Sort_Area_Size;
- Hash_Area_Size;
- Bitmap_Merge_Size;
- Create_Bitmap_Area_Size;
可通过手工修改Sort_Area_Size、Hash_Area_Size等参数值来控制PGA的使用;
为实现自动的PGA管理,Oracle引入了几个新的初始化参数:
- PGA_AGGREGATE_TARGET:此参数用来指定所有session总计可以使用最大PGA内存。该参数可被动态修改;
- WORKAREA_SIZE_POLICY: 此参数用于开关PGA内存自动管理功能,该参数有两个选择AUTO和MANUAL, Oracle9i默认为AUTO;
PGA_AGGREGATE_TARGET参数同时限制全局PGA分配和私有工作区内存分配:
(1)对于串行操作,单个SQL操作能够使用的PGA内存按照如下原则分配:
MIN (5% PGA_AGGREGATE_TARGET,100 MB)
(2)对于并行操作:
30% PGA_AGGREGATE_TARGET /DOP (DOP=Degree Of Parallelism 并行度)
SQL在工作区中以3种方式执行:
- Optimal(优化方式):指所有处理可以在内存中完成;
- Onepass: 大部分操作可以在内存中完成,但是需要使用到磁盘操作;
- Multipass: 大量操作需要产生磁盘交互,性能极差;
PGA的优化建议通过v$pga_target_advice和v$pga_target_advice_histogram提供!
4.3 Oracle的内存分配和使用
Oracle数据库在系统占用的内存分为两个部分:SGA和PGA.
根据Oracle的建议,Oracle最多可以使用80%的物理内存,其余20%保留给操作系统使用,在这80%内存中,对于OLTP系统,Oracle建议分配20%给PGA使用;对于DSS系统,可以分配50%给PGA使用;
- 对于OLTP系统
PGA_AGGREGATE_TARGET=( * 80%) * 20%
- 对于DSS系统
进一步归纳一下就是SGA+PGA<= * 80%, 也就是:
SGA_MAX_SIZE + PGA_AGGREGATE_TARGET <= * 80%