1.前言
通常来说Oracle server 主要由两个部分组成:instance和database. instance是指一组后台进程(在window上是一组线程)和一块共享内存区域,database是指存储在磁盘上的一组物理文件,通过instance与database协同,Oracle数据库才能形成一个动态的可访问关系型数据库系统。
2.数据的启动
oracle的数据库的启动不是仅仅看表象用sysdba/sysoper身份登录然后输入startup命令即可启动数据库。其实往往当执行startup之后,Oracle需要执行一系列的复杂的操作。
Oracle数据库的启动主要包括3个过程:
- 启动数据库到nomount状态;
- 启动数据库到mount状态;
- 启动数据库到open状态;
完成这3个过程,数据库才能进入就绪状态,准备提供数据访问。
3.启动数据库到nomount状态的过程
在启动的第一步,Oracle首先寻找参数文件(pfile/spfile),然后根据参数文件中的设置(内存分配等设置),创建实例(instance),分配内存,启动后台进程,Nomount的过程也就是启动数据库实例的过程,这个过程在后台是启动oracle可执行程序的过程,window上是oracle.exe文件的初始化,在unix/linux上是oracle可执行文件的初始化。
在linux中可以通过file命令查看oracle执行文件来判断oralce是64位或者是32位
[oracle@node04 dbs]$ file $ORACLE_HOME/bin/oracle /data/oracle/product/11.2.0/db_1/bin/oracle: setuid setgid ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=af262d40ee8c98c737770f1d9685cc6de14bb355, not stripped
查看数据库启动文件位置
SQL> show parameter spfile; NAME TYPE VALUE ------------------------------------ ---------------------- ------------------------------ spfile string /data/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora
通常默认用的是spfile启动,spfile是一个二进制文件,一般我们可以用strings命令进行查看: strings spfileorcl.ora
在nomount初始化过程中,只要拥有一个参数文件,就可以凭之启动实例(instance),这一步骤并不需要任何的控制文件或者数据文件参与。
以下是正常情况下启动数据库到nomount状态的过程:
SQL> startup nomount ORACLE instance started. Total System Global Area 759943168 bytes Fixed Size 2217224 bytes Variable Size 473959160 bytes Database Buffers 276824064 bytes Redo Buffers 6942720 bytes
注意这里,oracle根据参数文件的内容,创建了instance,分配了相应的内存区域,启动了相应的后台进程,SGA的分配信息从以上的输出中可以看到。
观察告警日志(alert_<oracle_SID>.log),可以看到这一阶段的启动过程,读取参数文件,应用参数启动实例,所有在参数文件中定义的非缺省参数都会记录在告警日志文件中,启动告警日志的文件可以通过命令:
SQL> show parameter background_dump_dest;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
background_dump_dest string /data/oracle/diag/rdbms/orcl/orcl/trace
这里我们可以通过该alert_<oracle_sid>.log,可以看到这一阶段启动的过程,读取参数文件,应用参数启动实例,所有在参数文件中
Fri Sep 17 17:42:08 2021 Starting ORACLE instance (normal) LICENSE_MAX_SESSION = 0 LICENSE_SESSIONS_WARNING = 0 Picked latch-free SCN scheme 3 Using LOG_ARCHIVE_DEST_1 parameter default value as USE_DB_RECOVERY_FILE_DEST Autotune of undo retention is turned on. IMODE=BR ILAT =27 LICENSE_MAX_USERS = 0 SYS auditing is disabled Starting up: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options. Using parameter settings in server-side spfile /data/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora System parameters with non-default values: processes = 150 memory_target = 728M control_files = "/data/oracle/oradata/orcl/control01.ctl" control_files = "/data/oracle/flash_recovery_area/orcl/control02.ctl" db_block_size = 8192 db_16k_cache_size = 12M compatible = "11.2.0.0.0" db_recovery_file_dest = "/data/oracle/flash_recovery_area" db_recovery_file_dest_size= 3882M undo_tablespace = "UNDOTBS1" remote_login_passwordfile= "EXCLUSIVE" db_domain = "" dispatchers = "(PROTOCOL=TCP) (SERVICE=orclXDB)" local_listener = "LISTENER_ORCL" audit_file_dest = "/data/oracle/admin/orcl/adump" audit_trail = "DB" db_name = "orcl" open_cursors = 300 diagnostic_dest = "/data/oracle"
应用参数创建实例之后,后台进程依次启动,注意以下输出中包含了PID以及OS ID两个信息,PID代表该进程在数据库内部的标识符编号,而OS ID则代表该进程在操作系统上的进程编号:
Fri Sep 17 17:42:09 2021 PMON started with pid=2, OS id=86062 Fri Sep 17 17:42:09 2021 VKTM started with pid=3, OS id=86064 VKTM running at (100ms) precision Fri Sep 17 17:42:09 2021 GEN0 started with pid=4, OS id=86068 Fri Sep 17 17:42:09 2021 DIAG started with pid=5, OS id=86070 Fri Sep 17 17:42:09 2021 DBRM started with pid=6, OS id=86072 Fri Sep 17 17:42:09 2021 PSP0 started with pid=7, OS id=86074 Fri Sep 17 17:42:09 2021 DIA0 started with pid=8, OS id=86076 Fri Sep 17 17:42:09 2021 MMAN started with pid=9, OS id=86078 Fri Sep 17 17:42:09 2021 DBW0 started with pid=10, OS id=86080 Fri Sep 17 17:42:09 2021 LGWR started with pid=11, OS id=86082 Fri Sep 17 17:42:09 2021 CKPT started with pid=12, OS id=86084 Fri Sep 17 17:42:09 2021 SMON started with pid=13, OS id=86086 Fri Sep 17 17:42:09 2021 RECO started with pid=14, OS id=86088 Fri Sep 17 17:42:09 2021 MMON started with pid=15, OS id=86090 Fri Sep 17 17:42:09 2021
这个关系我们也可以通过视图v$process查询到
select addr,pid,spid,username,program from v$process; --这里的pid是数据库内部的标识符编号,而spid则代表该进程在操作系统上的编号
如果在操作系统上发现某个进程表现异常(如占用很高的cpu资源),那么通过操作系统上的PID和v$process视图中的SPID关联,就可以找到这个os上的进程在数据库内部的化身,从而进一步的跟踪诊断。