三、内存结构:
1、系统全局区SGA(System Glbal Area):共享的系统内存区域。SGA由三部分组成:数据缓冲区、日志缓冲区、共享池。
(1) 数据缓冲区(Database Buffer Cache): 存储由磁盘数据文件读入的数据,所有用户共享。数据缓冲区大小由参数db_block_buffers确定。
。数据缓冲区大小:db_block_buffers * db_block_size
。参数文件位置:
Windows NT: D:/oracle/admin/db_name/pfile/init.ora
UNIX: /home/app/oracle/admin/db_name/pfile/initSID.ora
// Dirty: 数据被修改而未写盘。Pinned: 未修改的数据
。LRU( Least Recently Used): 最近最少使用原则
(2) 日志缓冲区(Log Buffer Cache): 存储数据库修改信息,由LGWR将日志缓冲区数据写入磁盘日志文件组。
。大小由参数log_buffer确定
(3) 共享池(Shared Pool): SQL 缓冲区及数据字典区。对于SQL、PL/SQL程序进行语法分析、编译的内存区域。
。大小由参数SHARED_POOL_SIZE来确定。(在参数文件中,单位为字节)
。分三部分:Libary cache, Data Dictionary cache, UGA(User Global Area)
。
[C*] SQL 语句执行计划:
Rule_Based: 基于规则,只考虑语句运行效率,不考虑成本。
Cost_Based: 基于成本,考虑代价,硬件资源占用小。
。SGA = db_block_buffers * db_block_size + log_buffer + shared_pool_size
[在实用情况中,SGA当然是越大越好,但最大不要超过系统可用内存的55%~57%。]
。查询SGA及数据参数取值:
SVRMGR> show sga
SVRMGR> show parameter
SVRMGR> show parameter db
SVRMGR> show parameter log
SVRMGR> show parameter 参数名称
SQL> select * from v$sga;
SQL>select * from v$sgastat;
查询数据库名称:SQL> select name from v$database;
查询数据库实例名称:SQL> select instance_name from v$instance;
2、程序全局区PGA(Pragram Global Area): 非共享区域,主要是用户编程时变量、数组工作区域。
3、排序区SORT AREA:用户使用order by排序、汇总时临时工作区域。排序区大小由参数SORT_AREA_SIZE确定。
4、大区(Large Pool): 使用于数据备份工具Rman, 只用在Oracle8以上的版本数据库,大区的大小由参数:Large_Pool_size确定。
5、Java语言区(Java Pool): 用于Oracle 8i、Oracle9i中的Java语言。Java区的大小由参数Java_Pool_Size确定。
四、Oracle 实例的进程结构:
1、什么是Oracle实例?
数据库启动时,系统分配SGA内存区域,同时启动后台进程,该SGA与后台进程合称为一个Oracle实例(Instance)。
Instance ==> SGA + Background Processes
数据库与实例相联系,有一个数据库就有一个实例。实例名用参数instance_name表示,数据库名用参数db_name表示。
。数据库实例名:
instance_name (Oracle参数)
ORACLE_SID(操作系统环境变量)
在Unix系统中选择数据库实例:
$ORACLE_SID=ora8i
$export ORACLE_SID
存取另一个数据库时:
$ ORACLE_SID=ora835
$ export ORACLE_SID
$ svrmgrl
在Windows NT/2000中选择数据库实例:
c:/> set ORACLE_SID=ora8i
C:/> svrmgrl
C:/> set ORACLE_SID=ora835
C:/> svrmgrl
[*] 在Windows NT/2000中,数据库实例名定义在注册表中。
2、Oracle实例的进程结构:
Oracle进程:单进程
多进程==> 用户进程、服务器进程、后台进程。
Dnnn(Dispatcher): 调度进程
ARCH:归档进程
PMON: 进程监控
SMON: 系统监控
CKPT: checkpoint
RECO: Recovery
[*] 进程数量的限制参数:Processes,Oracle数据库进程数Processes < Unix 操作系统核心参数SEMMNS(这个参数指定Unix的最大进程数)。
// 查询后台进程及说明
SQL> select name, description from v$bgprocess;
(1) 用户与服务器进程
。用户进程(User Precess)在用户运行应用程序时自动产生。
[*] 数据存取方法:
a. 用户发出查询命令,产生user进程,server进程查找内存。
b. server 进程在内存没有找到数据时,则server进程从数据文件中读数据,则server进程在LRU找空闲块。
c. 将LRU中的dirty块--> Dirty List
d. Dirty List超长(threshold), 通知DBWR刷新缓冲区。
e. 从磁盘读数据进入空闲内存。
(2) 后台进程:
[A]DBWR:数据写入进程。该进程将数据缓冲区数据写入磁盘数据文件,是进行数据缓冲区管理的后台进程。
设置DBWR进程数量参数:DB_WRITE_PROCESSES=1-10
进程名称依次为:DBW0, DBW1, ... DBW9
[B]LGWR:日志写入进程。将日志缓冲区日志信息写入磁盘日志文件组,在日志切换时,再将日志信息由归档进程ARCH写入磁盘或磁带,产生归档日志。一个数据库只有一个LGWR日志写入进程。
[C]PMON(Process Monitor): 进程监控。在用户进程中断时,负责清理该用户所占用的硬件资源。
[D]SMON(System Monitor):系统监控。负责清理用户不再使用的临时段。
[E]ARCH:归档进程。该进程在日志切换时,负责将日志信息写到指定的磁盘存储目录,产生归档日志,是与数据库备份有关的一个后台进程。在缺少状态下该进程不存在(因为oracle默认安装状态为下日志为非归档方式)。
[*] 与ARCH有关的数据库参数:
。启动归档进程参数:log_archive_start=true (缺省为false)
。确定归档日志文件磁盘存储目录:log_archive_dest=目录名
log_archive_dest=/home/oracle/archive
log_archive_dest=d:/oracle/archive
。确定归档文件存储格式:log_archive_format=%t.%s.arc
/* %t:表示线程号 %s:表示日志序列号,这样文件不会同名。可以不要%t, 扩展名自己给,也可以不要扩展名。如%s.log。如果写成%S(大写的S),则文件名前面加零对齐。如123.log 会变成00123.log这种形式。*/
。确定归档日志文件镜象目录:
log_archive_duplex_dest=镜像目录名 (Oracle8以上)
log_archive_duplex_dest=/home1/oracle/archive
。Oracle8i启用新的日志文件存储目录:
log_archive_dest_n = 'Location=目录名'(Oracle8i以上) n<=5 // 在oracle9i,n <= 10
log_archive_dest_1 = 'location=/home1/oracle/archive'
log_archive_dest_2 = 'location=/home2/oracle/archive'
...
log_archive_dest_5 = 'location=/home5/oracle/archive'
[注意:]归档日志存储目录要么为2个,即使用dest and duplex_dest这种方式,要么为5个,即使用dest_n这种方式,两种方式不能混用。
。失效参数(Oracle8i):
log_archive_dest_state_n=DEFER(失效)
log_archive_dest_state_n=ENABLE(生效)
//使相应目录失效:log_archive_dest_state_1 = DEFER
[*]也可以在线设置失效:SQL> alter system set log_archive_dest_state_1=defer;
。启动多个归档进程参数:log_archive_max_processes = 1~10 //要启动几个就写几
归档进程名称依次为:ARCH0, ARCH1, ... ARCH9
// 以上参数查询请在svrmgrl中使用:show parameter log
[SVRMGR> shutdown abort 是比shutdown immediate更有效的关闭数据库的命令]
[F] CKPT:检验点(Checkpoint)进程,用来同步各个数据文件。Checkpoint_Change#。
a. checkpoint产生的六个条件[参考PowerPiont教程:dba_结构.ppt P61]。
// DBA强制产生检验点:SQL> alter system checkpoint;
b. 检验点的几个参数
/* SVRMGR> show parameter checkpoint
NAME TYPE VALUE
----------------------------------- ------- ------------------------------
log_checkpoint_interval ?? 10000
log_checkpoint_timeout ?? 1800
log_checkpoints_to_alert ??? FALSE
*/
五、Oracle连接配置结构
3、多线程服务器体系结构MTS(Multithreaded Server)
SVRMGR> show parameter mts;
[第二章 数据库启动与关闭]
一、数据库启动:
Unix:
login: oracle
Password: xxxx
$
$ORACLE_HOME: /home/app/oracle/product/8.1.7
$ svrmgrl
SVRMGR>connect internal
SVRMGR> startup
SVRMGR> exit
[*]启动监听进程:
$lsnrctl start
如果在启动时报错,检查:/home/app/oracle/product/8.1.7/network/admin/listener.ora
$lsnrctl stop // 停止监听进程
$lsnrctl status // 显示监听进程状态
二、数据库启动过程:
1、启动数据库实例: ORACLE instance started
。读取参数文件
。分配SGA区
。启动后台进程
// 如果启动出现问题,有可能是因为参数文件有问题或者内存不足。
2、数据库安装:Database mounted
。读取控制文件
。打开控制文件
// 如果启动出现问题,可能是控制文件出现问题。
3、打开数据库:Database opened
。打开全部数据文件
。打开全部日志文件
// 如果有一个文件出现问题,则数据库不能启动。
数据库文件读取顺序:参数文件 ==> 控制文件 ==> 日志、数据文件,三类文件中不能有一个文件损坏,否则数据库不能启动。
4、数据库启动过程中可以使用的选项:
SVRMGR> startup OPEN --1、2、3 // 加OPEN与不加OPEN效果相同,1、2、3指三个步骤:启动实例 ==> 安装数据库 ==> 打开数据库
SVRMGR> startup MOUNT --1、2 启动实例=> 安装数据库
SVRMGR> startup NOMOUNT -- 1 只启动数据库实例
(1) OPEN用于数据库的正常启动(或不加OPEN)。
(2) MOUNT的使用方式:
。用于修改数据库归档方式
。用于数据库恢复。Recovery命令在mount状态使用。
在mount状态,所有v$xxxx 数据字典可以使用,所有alter database命令可以使用。
(3) NOMOUNT的使用方式:
。创建控制文件
。创建新的数据库
(4) 数据库在MOUNT下可以使用的选项:
SVRMGR> startup MOUNT
SVRMGR> Alter database ARCHIVELOG; // 将数据库由非归档方式修改为归档方式
[*] SVRMGR> Alter database NOARCHIVELOG; // 将数据库由归档方式修改为非归档方式
// SVRMGR> archive log list
// SVRMGR> select log_mode from v$database;
SVRMGR> Alter database OPEN; // 将数据库由MOUNT直接到OPEN状态。
SVRMGR> Alter database OPEN READ ONLY; // 整个数据库以只读方式打开
SVRMGR> Alter database OPEN READ WRITE; // 整个数据库以读写方式打开(系统缺省方式,不需要写上READ WRITE)
[2002.05.14]
//=====================================================================================================================
(5) 数据库在OPEN下可以使用的选项:
[A]
SVRMGR> startup PFILE=参数文件名称及路径
// 在有两个数据库存在的情况下,可以用如下方法同时启动两个数据库。
SVRMGR> startup PFILE=第一个数据库的参数文件名称及路径
SVRMGR> startup PFILE=第二个数据库的参数文件名称及路径
[B]
SVRMGR> startup RESTRICT // 限制性数据库启动命令,以这种方式启动数据库后,具有restricted session权限的用户可以连接数据库,其他用户不能连接。
DBA可以指定用户连接:
SQL> grant restricted session to scott; // 指定权限
SQL> revoke restricted session from scott; // 收回权限
修改限制:
SQL> Alter system disable restricted session; // 解禁
SQL> alter system enable restricted session; // 禁止
[C]
SVRMGR> startup FORCE // 强制性数据库启动命令
[D*] 允许多个选项同时使用,顺序没有关系:
SVRMGR> startup PFILE=c:/init.ora FORCE MOUNT
SVRMGR> startup force restrict pfile=c:/init.ora
三、数据库关闭命令:
在关闭服务器之前,必须使用shutdown命令先关闭数据库,再关闭操作系统。
SVRMGR> shutdown normal // 正常关机。系统等待所有用户从数据库中正常退出,很难关掉。
SVRMGR> shutdown immediate // 立即关机。中断现在连接,回退未提交事务,不再接收用户的连接请求。(有的用户数据会丢失)
SVRMGR> shutdown abort // 异常关机。只关闭实例,释放内存,不保证数据完整性。尽量少用。
SVRMGR> shutdown transactional // 事务终结后关机。等待用户提交数据后关闭数据库。
[补充内容]
四、数据库启动过程中失败恢复方法:
1、第一步不启动(实例):参数文件错误:参数错误、路径、文件名、参数设置错误等。
2、第二步不能mount:控制文件坏。检查有没有镜像文件,如果没有,需要重新创建控制文件。
3、第三步,数据库不能Open。数据文件或日志损坏。
(1) 数据文件(Datafile)被破坏或被误删除时数据库的恢复方法。
SVRMGR> startup mount
[A]如果数据库运行在ARCHIVELOG模式下,使用以下命令:
SVRMGR> alter database datafile '被删数据文件名及路径' OFFLINE;
// 在归档方式下,这个被删的文件可能通过归档日志恢复数据。
打开数据库:SVRMGR> Alter database open;
[B]如果数据库运行在NOARCHIVELOG模式下,使用以下命令:
SVRMGR> alter database datafile '被删数据文件名及路径' OFFLINE DROP;
// 在非归档方式下,被删数据文件的内容绝对不可能恢复,所以只好DROP掉。
打开数据库:SVRMGR> Alter database open;
(2) 日志文件(Redo Log Files)被破坏或被误删除时数据库的恢复方法。
SVRMGR> startup mount
删除被物理破坏的日志文件组:
SVRMGR> Alter database drop logfile group n;
增加已经被物理破坏的日志文件组:
SVRMGR> Alter database add logfile group n('日志成员文件', '日志成员文件') size xxM;
SVRMGR> Alter database open;
// 如果当前日志被破坏,则恢复操作将比较复杂,必须通过数据库备份来恢复(不完全恢复)。
4、重新创建控制文件(Control Files):
创建控制文件的语法:
SVRMGR> startup nomount
Create controlfile database 数据库名称
logifle
group 1 (日志文件名及路径'', '日志文件名及路径') size xxM,
group 2 (日志文件名及路径'', '日志文件名及路径') size xxM,
...
noresetlogs
datafile
'第一个数据文件名称及路径' size xxM, // xxM中不能出现小数点儿,如果有小数,就使用K,如果仍然有小数,则使用字节。
'第二个数据文件名称及路径' size xxM,
...
character set zhs16gbk;
SVRMGR> startup nomount
Create controlfile database ora8i
logfile
group 1 ('d:/oracle/oradata/ora8i/redo01.dbf') size 1M,
group 2 ('d:/oracle/oradata/ora8i/redo02.dbf') size 1M,
group 3 ('d:/oracle/oradata/ora8i/redo03.dbf') size 1M,
noresetlogs
datafile
'd:/oracle/oradata/ora8i/system01.dbf' size 70M,
'd:/oracle/oradata/ora8i/rbs01.dbf' size 520M,
...
character set zhs16gbk;
SQL> select bytes/1024/1024, blocks, file_name from dba_data_files;
// 通过这个命令来查询数据文件的大小,以Oracle中查询的数据为准,不要根据操作系统显示的文件大小来决定,建议事先做好备份。
[*C] 修改数据库名称时,需要重新创建数据库控制文件,语法如下(注意与上面的语法稍有不同):
SVRMGR> startup nomount
Create controlfile set database 新数据库名称 // 这一行有不同,注意:数据库的名称一般不要超过5个字符。
logifle
group 1 (日志文件名及路径'', '日志文件名及路径') size xxM,
group 2 (日志文件名及路径'', '日志文件名及路径') size xxM,
...
resetlogs // 这一行也有不同
datafile
'第一个数据文件名称及路径' size xxM, // xxM中不能出现小数点儿,如果有小数,就使用K,如果仍然有小数,则使用字节。
'第二个数据文件名称及路径' size xxM,
...
character set zhs16gbk;
五、检测数据库文件工具:DBVerify
使用方法:
C:/> dbv file=文件名及路径 logfile=输出结果文件名 blocksize=数据块大小(缺省是2K,否则指出) start=起始数据块 end=终止数据块
可以检测数据、日志及控制文件等。如果不加start 和 end,则默认检测整个数据文件。