目录:
1. 数据库的组成
A. instance(实例)
B. SGA、PGA(内存)
C. process (进程)
D. 密码文件
E. 备份文件
F. 告警和跟踪文件
数据库的组成
Oracle server 是instance和database的组合
instance(实例)= 内存 + 进程
内存由SGA+PGA组成
一个实例只能有一个SGA,所有的服务进程,后台进程都同享一个SGA;
每个服务进程都有一个PGA,存储会话信息。
database(数据库) = 文件
数据库的逻辑结构:
最小单位是块db_block,块是建库的时候选择的
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
多个连续的数据库块组成区 Extent
区是空间的分配单位,如果建立一张表,至少分配1个区。
在区存储同一类型的数据,称为段 segment
比如表,建立一个行表xs 则自动建立一个段叫xs ,段储存数据。
段在表空间里 tablespace,一表空间可以有多个段,一个段只能属于一个表空间。表空间是是最大的存储单位 ,建立对象的时候可以指定存在哪个表空间里。
实例是用来管理数据库的一种方法
启动过程
-------------
实例启动的过程就是分配内存,启动后台进程的过程,实例启动后,后台进程去加载数据库,然后把数据库打开。
数据库启动过程读文件过程:
参数文件
当执行startup 启动数据库,先读取环境变量ORACLE_SID 就是找实例名 ,然后在到$ORACLE_HOME/dbs目录去找参数文件,找 spfile<sid>.ora,如果没有找到,继续找spfile.ora文件,如果还没有找到,继续找 init<sid>.ora,都没找到就报错。(参数文件包含的你的数据库的名字,以及内存如何分配,以及控制文件在哪里)
例:
我的实例名叫orcl --> 找到的是 initorcl.ora
参数文件分配pfile和spfile文件
pfile文本文件
spfile二进制文件
$ cat initorcl.ora 是一个路径
SPFILE='+DATA/orcl/spfileorcl.ora'
最终读取的是+data/orcl/spfileorcl.ora 根据这个文件启动实例
控制文件
根据参数文件中记录的控制文件路径,去找控制文件,并读取控制文件。控制文件,记录数据库的所有的数据文件在哪里,所有的日志文件在哪里,数据库字符集 RMAN备份信息。
查看控制文件:
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string +DATA/orcl/controlfile/current
.260.853023315, +FRA/orcl/cont
rolfile/current.256.853023315
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
+DATA/orcl/controlfile/current.260.853023315
+FRA/orcl/controlfile/current.256.853023315
3. 数据文件+日志文件
根据控制文件中记录的数据文件信息读取数据文件,
日志文件非常的重要,用日志组来管理,重要日志组是可用,则数据库的日志就可用
日志组就由多个日志文件组成 ,一个组的日志文件之间是相互镜像的关系。
SQL> select NAME from v$datafile;
NAME
--------------------------------------------------------------------------------
+DATA/orcl/datafile/system.256.853023133
+DATA/orcl/datafile/sysaux.257.853023133
+DATA/orcl/datafile/undotbs1.258.853023133
+DATA/orcl/datafile/users.259.853023133
+DATA/orcl/datafile/example.265.853023375
+DATA/orcl/datafile/inx.267.853045119
检查日志组 v$log
SQL> select GROUP#, THREAD# , SEQUENCE# , STATUS , ARCHIVED,MEMBERS,BYTES/1024/1024
from v$log;
GROUP# THREAD# SEQUENCE# STATUS ARC MEMBERS BYTES/1024/1024
---------- ---------- ---------- ---------------- --- ---------- ---------------
1 1 16 INACTIVE NO 2 50
2 1 17 INACTIVE NO 2 50
3 1 18 CURRENT NO 2 50
lgwr把当前日志信息写入第三组(sequence最大,下一个是sequence最小的
或者看status=current)
日志文件v$logfile
SQL> select GROUP# , MEMBER from v$logfile ;
GROUP# MEMBER
---------- --------------------------------------------------
3 +DATA/orcl/onlinelog/group_3.263.853023339
3 +FRA/orcl/onlinelog/group_3.259.853023343
2 +DATA/orcl/onlinelog/group_2.262.853023327
2 +FRA/orcl/onlinelog/group_2.258.853023335
1 +DATA/orcl/onlinelog/group_1.261.853023319
1 +FRA/orcl/onlinelog/group_1.257.853023325
架构分为独立服务器和集群环境:
独立服务器
一个实例只能管理一个数据库,而且数据库相互独立,不能共享数据。
集群环境
一个实例只能管理一个数据库,但是一个数据库可以被多个实例管理,所有实例访问的是同一份数据,数据在实例之间共享。
我们现在研究的数据库模式都是专有模式,具有的特点为:每个用户连接都会建立一个专有服务进程,以后专职给用户使用,用户进程不能直接和数据库交互,他把请求给服务进程,服务进程连接数据库处理,然后服务进程把结果返回给用户。
查看服务进程的命令:
$ ps -elf |grep oracle<sid>
只要用户登录成功,都会产生一个服务进程。
也可以通过查询视图查看:
SQL> select SID , SERIAL# , USERNAME
from v$session
where username is not null;
SID SERIAL# USERNAME
---------- ---------- ------------------------------
34 70 DBSNMP
35 169 SYSMAN
37 47 DBSNMP
43 56 SYSMAN
44 61 DBSNMP
47 59 SYSMAN
50 12517 SYS
51 14 SYSMAN
52 94 SYSMAN
54 70 SYSMAN
10 rows selected.
如果用户建立会话,则一定在v$session看到。
B. Redo log buffer
-----------------------------
SQL操作的都是从物理磁盘拷贝的buffer cache的拷贝,没有对数据文件直接操作,内存有可能丢数据,那么造成拷贝和实际物理文件块不一样 ,因为buffer cahce 不是实时写入到磁盘,保证你做的操作成功,机制:任何操作前先产生日志 (日志记录你对数据库做了什么 ),日志在内存也不安全,所以一般很小,写入频率非常高。
查看log buffer
SQL> show parameter log_buffer
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 3547136
自动调整的值
SQL> select name ,BYTES/1024/1024 || ' M'
from v$sgainfo
order by 1;
NAME BYTES/1024/1024||'M'
-------------------------------- ------------------------------------------
Buffer Cache Size 108 M --> 动态调整值
Fixed SGA Size 2.11244964599609375 M
Free SGA Memory Available 208 M
Granule Size 4 M
Java Pool Size 4 M
Large Pool Size 4 M
Maximum SGA Size 509.703125 M
Redo Buffers 3.58984375 M --> 一般4M就够了
Shared IO Pool Size 0 M
Shared Pool Size 180 M
Startup overhead in Shared Pool 72 M
Streams Pool Size 0 M
影响执行效率就是 shared pool 和 buffer cache
C. Process
-----------------
6大核心进程
任意一个核心进程挂了,数据库就挂掉。
1. Database Writer Process (DBWn)
把buffer cache中的脏数据写回到磁盘上的数据文件,脏数据:就是buffer cache的数据块和磁盘上文件数据库块不一致
$ ps -elf |grep ora_ |grep dbw
0 S oracle 10696 1 0 75 0 - 187973 ? 21:30 ? 00:00:00 ora_dbw0_orcl
2. Log Writer Process (LGWR)
只能有1个 ,把日志缓冲区的日志条目写入到磁盘上的日志文件。
日志写入的规则:
When a user process commits a transaction --> 当用户commit;
When the redo log buffer is one-third full --> 日志缓冲的1/3 1M 左右
Before a DBWn process writes modified buffers to disk --> 当你把脏数据写入磁盘前,把记录该操作日志信息先写入日志文件
Every 3 seconds --> 每隔3秒
日志是顺序写入 按照时间写入
$ ps -elf |grep ora_ |grep lgwr
0 S oracle 10700 1 0 75 0 - 191608 ? 21:30 ? 00:00:00 ora_lgwr_orcl
Tips:日志文件存放磁盘I/O最快的地方
3. Checkpoint Process (CKPT) 检查点进程
记录检查点信息 ,把检查点信息写入到所有的控制文件和所有的数据文件的头部,称为一致点 此时此刻数据库是一致的(内存和物理磁盘块数据一样)
$ ps -elf |grep ora_ |grep ckpt
0 S oracle 10704 1 0 75 0 - 186209 ? 21:30 ? 00:00:00 ora_ckpt_orcl
4. System Monitor Process (SMON) 系统监控进程
数据库实例在启动的时候由smon进程检查所有的数据文件的头部的检查点信息和控制文件中记录的检查点信息是否一致,如果不一致,就需要做实例恢复 (需要用到日志文件),如果是一致的,则不需要恢复,数据实例直接启动。
$ ps -elf |grep ora_ |grep smon
0 S oracle 10708 1 0 75 0 - 187369 ? 21:30 ? 00:00:00 ora_smon_orcl
5. Process Monitor Process (PMON) 进程监控进程
监视用户进程,如果发现用户进程失败了,它会杀死用户用的服务进程,释放资源,清除buffer cahce ,监视会话超时。
当数据库启动的时候,由pmon进程把数据库服务名动态注册到监听。
6. Recoverer Process 恢复进程
解决分布式事务的问题 ,自动重连数据库,如果无法恢复,自动回滚。
$ ps -elf |grep ora_ |grep reco
0 S oracle 10712 1 0 75 0 - 186075 ? 21:30 ? 00:00:00 ora_reco_orcl
判断实例是否启动:
方法1:$ ps -elf |grep ora_
方法2: $ ps -elf |grep smon
$ ps -elf |grep smon |grep -v grep
0 S grid 9195 1 0 78 0 - 119077 ? Jul15 ? 00:00:00 asm_smon_+ASM
0 S oracle 14749 1 0 75 0 - 186086 ? 22:10 ? 00:00:00 ora_smon_orcl
Archiver Processes (ARCn) 可选进程
如果在归档模式下:
日志组切换的时候,把日志文件拷贝到一个备份路径,这个动作称为归档,生成的文件归档文件(就是日志) 这个动作由进程arcn,如果没有启动归档模式,日志直接被覆盖。
Process Startup Sequence 进程处理过程
操作系统启动的时候init进程就会调用 init.ohasd 这个脚本控制了很多注册oracle组件,会按照顺序自动启动。
D. 密码文件
-----------------
password file 密码文件
管理员远程连接数据库,是通过密码文件验证的。
$ cd $ORACLE_HOME/dbs 目录
密码文件名:orapw<SID>
例:
orapworcl
删除密码文件:
$ rm -rf orapworcl
$ sqlplus as sysdba
失败
重建密码文件:
$ orapwd 回车,查看语法
Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>
例:
将管理员设置为shenw
$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=shenw
$ sqlplus sys/oracle@orcl as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
$ sqlplus sys/shenw@orcl as sysdba
成功。
Tips:如果远程登录密码忘记了,重建密码文件;如果不允许管理员远程登录,删除密码文件。
E. 备份文件
------------------
备份目录:用于还原
用户可以指定备份到哪里去,如果不指定就是默认路径。
查看:
SQL> show parameter recovery
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string +FRA -->默认备份路径
db_recovery_file_dest_size big integer 3882M
F. Alert log and trace files
---------------------------------------
Alert log:用户操作故障都写入警告文件;
trace文件:后台进程后者用户跟踪文件;
11g 和10g是不一样, 11g重构体系结构, 把所有诊断信息放到一起。
11g查看诊断根目录:
SQL> show parameter diag
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest string /u01/app/oracle
diagnostic_dest/diag/rdbms/数据库名/实例名
如:
$ cd u01/app/oracle/diag/rdbms/orcl/orcl/
$ ls
alert cdump hm incident incpkg ir lck metadata stage sweep trace
alert --> 警告日志文件log.xml
trace --> alert_orcl.log 格式;alert_实例名.log 文本格式(最常看的是这个)