一. Oracle体系结构图
体系结构图如下:
体系结构图看似简单;其中很有玄机。它对Oracle来讲;相当于武功中的心法。配合体系结构来学Oracle;能起到事半功倍的效果。我们平时遇到Oracle的各种问题;很大部分都能从体系结构中找到解决方法或者更优的途径。现在我们来慢慢解析Oracle体系结构图
- Oracle Database Server: 是由Oracle实例+Oracle数据库
- 实例:实例是数据库启动时初始化的一组进程和内存结构
- 数据库:数据库则指的是用户存储数据的一些物理文件
三. Oracle实例
Oracle 实例是由内存结构和一组后台进程构成;Oracle 数据库实例启动时;就需要分配共享内存,启动后台进程。
3.1 内存结构
Oracle数据库所使用的内存主要涉及是:系统全局区(SGA)和程序全局区(PGA);如何分配和设置共享内存参数;这对数据库性能非常重要。好在对Oracle11G以上的版本来讲;引进了自动内存管理;这个在Oracle数据库创建时;根据服务器环境已经合理设置;若非特殊设置无需配置。不像PostgreSQL数据库初始化给的是保守值。
SGA指的是系统全局区(System Global Area);如Oracle体系结构图而言:
SGA = Buffer Cache + Redo Log Buffer + Shared Pool + 大池+ Java 池+ 流池
- Redo Log Buffer
Redo Log Buffer:日志缓冲区,记录数据库变更;最终通过LGWR进程写出到Rede Log
- Shared Pool
Shared Pool :即共享池。共享池主要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成:
库缓存:这块内存区域会缓存最近执行的SQL代码,这样,同样的SQL代码多次执行的时候,就不用重复地去进行SQL解析,可以很大程度上提高系统性能。
数据字典缓存:存储oracle中的数据字典,这样在分析SQL代码的时候,就不用频繁去磁盘上读取数据字典中的数据。
Oracle通过Shared Pool来实现SQL共享,减少代码硬解析。从而提供数据库的性能。
Oracle进程有分:用户进程;服务器进程;后台进程。我们通常了解后台进程就行了。如Oracle体系结构图:后台进程 必须有 PMON + SMON + DBWR + LGWR + CKPT
3.2.1 PMON
PMON:程序监控进程;清除失效的用户进程,释放用户进程所用的资源。
3.2.2 SMON
SMON:系统监控进程;监控Oracle数据库正常运转。侧重点用于实例恢复;还用于清理临时表空间、清理回滚段、合并空闲数据块。
3.2.3 CKPT
CKPT:检查点进程;负责发起检查点信号;用于更新保持日志文件,数据文件和控制文件的SCN一致性。由CKPT发起通知DBWR;DBWR将内存区的脏数据写入数据文件。从而保持控制文件的SCN和数据文件的SCN一致。
3.2.4 DBWR
DBWR:数据库写进程;负责将修改过的数据块从数据缓存区(Buffer Cache)写入数据磁盘。
3.2.5 LGWR
LGWR:日志写进程;负责将日志缓冲区(Redo Log Buffer)的记录写入日志文件。
四. Oracle数据库
4.1 控制文件
控制文件记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等。
SQL> select value from v$parameter where name = 'control_files'; VALUE ------------------------------------------------------------------- /u01/app/oradata/ora235/control01.ctl, /u01/app/oradata/ora235/control02.ctl
通过上面SQL;我们可以获知控制文件的数量和名称。如何查看控制文件的内容呢?控制文件是一个二进制文件。首先我们需要控制文件内容转存到一个文本文件
alter database backup controlfile to trace as '/home/oracle/lottu_control.txt';
转存文件的部分内容如下:
[oracle@oracle235 ~]$ cat /home/oracle/lottu_control.txt -- The following are current System-scope REDO Log Archival related -- parameters and can be included in the database initialization file. -- -- LOG_ARCHIVE_DEST='' -- LOG_ARCHIVE_DUPLEX_DEST='' -- -- LOG_ARCHIVE_FORMAT=%t_%s_%r.dbf -- -- DB_UNIQUE_NAME="ora235" -- -- LOG_ARCHIVE_CONFIG='SEND, RECEIVE, NODG_CONFIG' -- LOG_ARCHIVE_MAX_PROCESSES=4 -- STANDBY_FILE_MANAGEMENT=MANUAL -- STANDBY_ARCHIVE_DEST=?/dbs/arch -- FAL_CLIENT='' -- FAL_SERVER='' -- -- LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/dbs/arch' -- LOG_ARCHIVE_DEST_1='MANDATORY NOREOPEN NODELAY' -- LOG_ARCHIVE_DEST_1='ARCH NOAFFIRM EXPEDITE NOVERIFY SYNC' -- LOG_ARCHIVE_DEST_1='NOREGISTER NOALTERNATE NODEPENDENCY' -- LOG_ARCHIVE_DEST_1='NOMAX_FAILURE NOQUOTA_SIZE NOQUOTA_USED NODB_UNIQUE_NAME' -- LOG_ARCHIVE_DEST_1='VALID_FOR=(PRIMARY_ROLE,ONLINE_LOGFILES)' -- LOG_ARCHIVE_DEST_STATE_1=ENABLE -- -- Below are two sets of SQL statements, each of which creates a new -- control file and uses it to open the database. The first set opens -- the database with the NORESETLOGS option and should be used only if -- the current versions of all online logs are available. The second -- set opens the database with the RESETLOGS option and should be used -- if online logs are unavailable. -- The appropriate set of statements can be copied from the trace into -- a script file, edited as necessary, and executed when there is a -- need to re-create the control file. -- -- Set #1. NORESETLOGS case -- -- The following commands will create a new control file and use it -- to open the database. -- Data used by Recovery Manager will be lost. -- Additional logs may be required for media recovery of offline -- Use this only if the current versions of all online logs are -- available. -- After mounting the created controlfile, the following SQL -- statement will place the database in the appropriate -- protection mode: -- ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORA235" NORESETLOGS NOARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oradata/ora235/redo01.log' SIZE 50M BLOCKSIZE 512, GROUP 2 '/u01/app/oradata/ora235/redo02.log' SIZE 50M BLOCKSIZE 512, GROUP 3 '/u01/app/oradata/ora235/redo03.log' SIZE 50M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE '/u01/app/oradata/ora235/system01.dbf', '/u01/app/oradata/ora235/sysaux01.dbf', '/u01/app/oradata/ora235/undotbs01.dbf', '/u01/app/oradata/ora235/users01.dbf' CHARACTER SET AL32UTF8 ; -- Commands to re-create incarnation table -- Below log names MUST be changed to existing filenames on -- disk. Any one log file from each branch can be used to -- re-create incarnation records. -- ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/dbs/arch1_1_982970794.dbf'; -- Recovery is required if any of the datafiles are restored backups, -- or if the last shutdown was not normal or immediate. RECOVER DATABASE -- Database can now be opened normally. ALTER DATABASE OPEN; -- Commands to add tempfiles to temporary tablespaces. -- Online tempfiles have complete space information. -- Other tempfiles may require adjustment. ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oradata/ora235/temp01.dbf' SIZE 61865984 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M; --
4.2 重做日志文件
SQL> SELECT group#,member FROM v$logfile; GROUP# MEMBER ---------- -------------------------------------------------- 1 /u01/app/oradata/ora235/redo01.log 2 /u01/app/oradata/ora235/redo02.log 3 /u01/app/oradata/ora235/redo03.log
4.3 数据文件
数据文件存储着实际的数据,DBWn会将数据库缓冲区中的内容写入到这类文件中。
SQL> select file#,name from v$datafile; FILE# NAME ---------- ---------------------------------------- 1 /u01/app/oradata/ora235/system01.dbf 2 /u01/app/oradata/ora235/sysaux01.dbf 3 /u01/app/oradata/ora235/undotbs01.dbf 4 /u01/app/oradata/ora235/users01.dbf
4.4 实例参数文件
这个文件存储了数据库所需的一些参数设置,比如各个内存区域的大小,可允许的最大进程数,最大会话数,控制文件的位置,数据库的名称等等,参数文件也是实例启动时首先要加载的文件。
4.5 口令文件
一般称为外部口令文件。一般的用户名和口令是存放在数据字典中,不会存放在这个文件中。在一些特殊场景下,比如实例还未启动,这时,我可能需要以管理员的身份登入系统去执行一些恢复或者启动操作,然而此时,数据字典由于实例还没启动是不存在的,这时就需要外部口令文件进行用户身份的验证。
4.6 归档日志文件
ARCn将联机重做日志文件会备份归档到这类文件中去,归档日志文件保留了数据更改的完整历史信息
五. 总结