Oracle Server作为主流的关系型数据库系统,其核心由Instance(实例) 和Database(数据库) 两部分构成。Instance是由一组后台进程(Windows下为线程)和共享内存区域(SGA)组成的动态运行单元,而Database是存储在磁盘上的物理文件集合。两者协同工作,才能实现数据库的动态访问与数据管理。数据库的启动与关闭是Oracle运维的基础操作,背后涉及复杂的底层逻辑与流程控制,深入理解这些机制不仅能提升运维效率,更能在故障发生时快速定位根源。
一、数据库启动:三阶段递进式初始化
Oracle数据库的启动并非单一命令操作,而是通过Nomount→Mount→Open三个递进阶段完成,每个阶段对应特定的初始化目标与底层操作,关闭过程则为该流程的逆向执行。
1.1 Nomount阶段:创建实例,奠定运行基础
Nomount阶段的核心是创建Instance(实例),无需依赖控制文件或数据文件,仅需参数文件提供初始化配置。
1.1.1 核心依赖:参数文件的查找与作用
参数文件(pfile/spfile)是实例启动的核心依据,记录了内存分配、数据库名称等关键配置。Oracle查找参数文件的优先级的顺序为:
- spfile<ORACLE_SID>.ora(数据库实例专属服务器参数文件);
- spfile.ora(通用服务器参数文件);
- init<ORACLE_SID>.ora(文本格式初始化参数文件)。
若以上文件均不存在,实例将无法启动。参数文件的默认存储路径为:Unix/Linux系统的$ORACLE_HOME/dbs目录,Windows系统的$ORACLE_HOME\database目录。
实例启动的最小参数需求仅需配置db_name,例如通过echo "db_name=eygle" > initeygle.ora即可创建最简参数文件,满足Nomount阶段的启动条件。
1.1.2 实例创建:内存分配与后台进程启动
Oracle读取参数文件后,会完成两项关键操作:
- 分配共享内存区域(SGA),包括共享池、数据缓冲区、重做日志缓冲区等;
- 启动后台进程,构建实例与操作系统的交互通道。
核心后台进程及其作用如下:
- PMON(进程监控进程):监控用户进程与后台进程,释放失败进程的资源,向TNS监听器注册实例;
- DBWn(数据库写进程):将内存中修改后的脏数据批量写入数据文件,最多支持20个进程(DBW0DBW9、DBWaDBWj);
- LGWR(日志写进程):将重做日志缓冲区的事务日志写入在线日志文件,确保事务提交的持久性;
- CKPT(检查点进程):更新控制文件与数据文件头的检查点信息,触发DBWn写操作;
- SMON(系统监控进程):数据库启动时执行实例恢复,清理死事务与临时段;
- VKTM(虚拟时钟进程):Oracle 11g新增进程,提供数据库内部虚拟时钟,降低与操作系统的时间交互开销。
这些进程的启动信息会记录在告警日志(alert_<ORACLE_SID>.log)中,Oracle 11g及以上版本的日志会包含进程PID(数据库内部标识)与OS ID(操作系统进程标识),便于故障定位。
1.1.3 关键视图与诊断工具
- V$PROCESS视图:关联操作系统进程与数据库进程,通过SPID(操作系统进程号)可查询进程对应的数据库角色,是操作系统与数据库的“桥梁”;
- 告警日志:记录参数文件加载、内存分配、进程启动等信息,默认存储路径为$ORACLE_HOME/rdbms/log(缺省配置)。
1.1.4 常见故障与解决方案
Nomount阶段故障多源于系统资源不足或参数文件异常,典型案例包括:
- 信号量不足(ORA-27300):Unix/Linux系统中,若同一主机运行多个实例,可能因内核参数(如信号量数量)设置不足导致启动失败,需调整/etc/system等内核配置文件;
- 操作系统补丁不完整:服务器异常断电后,若AIX等系统补丁缺失,可能导致后台进程启动后立即中止,需应用完整系统补丁。
1.2 Mount阶段:挂载数据库,验证物理文件
Nomount阶段完成后,Oracle通过参数文件中的control_files配置找到控制文件,进入Mount阶段。此阶段的核心是关联实例与数据库物理文件,完成文件存在性校验与锁定。
1.2.1 控制文件的核心作用
控制文件是数据库的“目录文件”,记录了数据文件、日志文件的路径、检查点信息、数据库名称等关键元数据。Oracle 10g之前默认创建3个镜像控制文件,10g及以上版本支持将控制文件存储在不同磁盘组,提升容错性。
若控制文件全部丢失,数据库将抛出ORA-00205错误;若仅部分丢失,可复制完好的控制文件并重命名为缺失文件名,即可恢复挂载。
1.2.2 关键文件与锁定机制
- 数据文件存在性校验:Oracle通过控制文件记录的路径,检查所有数据文件是否存在,缺失信息会记录在告警日志与V$RECOVER_FILE视图中;
- 口令文件:存储SYSDBA/SYSOPER用户的认证信息,Unix/Linux系统默认名为orapw<ORACLE_SID>,Windows系统为PWD<ORACLE_SID>.ora,缺失将导致远程SYSDBA登录失败;
- lk<ORACLE_SID>文件:Unix/Linux系统专属锁定文件,数据库启动时创建并锁定,关闭时释放,异常情况下未释放锁定会导致下次启动失败,需手动清理共享内存段。
1.2.3 控制文件心跳(HeartBeat)
Mount阶段会启动控制文件“心跳机制”,每3秒更新一次控制文件中的心跳值,用于标识实例与数据库的挂载关系,该值可通过SELECT CPHBT from X$KCCCP查询。
1.3 Open阶段:一致性校验,开放数据访问
Open阶段是启动的最后一步,核心是校验数据一致性,确保所有文件可正常读写,最终开放数据库访问权限。
1.3.1 一致性校验的两大核心步骤
- 检查点计数校验:对比数据文件头与控制文件中的检查点计数(Checkpoint cnt),确保数据文件来自同一版本,未被非法修改;
- SCN校验:验证数据文件头的开始SCN与控制文件中的结束SCN是否一致,若不一致需执行实例恢复。
若校验通过,Oracle会将所有数据文件的结束SCN设置为无穷大(0xffff.ffffffff),锁定文件并开放访问;若数据文件缺失或损坏,将抛出ORA-01157错误,需通过恢复操作修复。
1.3.2 Oracle 11g+诊断新特性:ADR与FDI
Oracle 11g引入自动诊断库(ADR) 与故障诊断基础架构(FDI),优化日志管理与故障定位:
- ADR:统一存储诊断日志、跟踪文件等,默认路径由
diagnostic_dest参数控制(优先使用ORACLE_BASE,未设置则为ORACLE_HOME/log); - 告警日志:支持文本与XML双格式,可通过ADRCI工具读取XML日志,命令示例:
adrci> show alert -tail 10; - FDI:自动捕获故障数据(跟踪文件、核心转储),通过IPS(事件打包服务)生成压缩包,便于Oracle技术支持分析,命令示例:
ips generate package 1 in /opt/oracle/diag。
二、数据库访问:网络配置与连接机制
数据库启动后,需通过网络配置实现远程访问,核心依赖客户端与服务器端的配置文件及监听器服务。
2.1 客户端配置:TNSNAMES.ORA文件
客户端需通过tnsnames.ora文件定义数据库连接信息,默认存储路径为$ORACLE_HOME/network/admin,典型配置如下:
EYGLE=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.33.11)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = eygle) -- 推荐使用服务名,替代传统SID
)
)
配置完成后,可通过tnsping eygle测试网络连通性,但需注意:tnsping仅验证监听器端口可达,不检查数据库是否启动或服务名配置正确。
2.2 服务器端配置:监听器与服务注册
服务器端通过监听器(Listener) 接收客户端请求,核心配置文件为listener.ora,存储路径与tnsnames.ora一致。
2.2.1 监听器核心配置
监听器配置包含两部分:
- 监听地址:定义协议(TCP/IPC)、主机IP与端口(默认1521);
- 服务列表:通过SID_LIST_LISTENER定义提供的数据库服务,支持同一实例对外暴露多个服务名。
示例配置如下:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.33.11)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC = (SID_NAME = PLSExtProc)(ORACLE_HOME = /opt/oracle)(PROGRAM = extproc))
(SID_DESC = (GLOBAL_DBNAME = eygle)(ORACLE_HOME = /opt/oracle)(SID_NAME = eygle))
)
2.2.2 动态服务注册(推荐)
Oracle 8i及以上支持动态服务注册,无需在listener.ora中配置SID_LIST,实例启动后由PMON进程自动将服务名(SERVICE_NAMES参数定义)注册到监听器。动态注册的优势包括:
- 简化配置,无需手动维护服务列表;
- 支持RAC环境的故障转移(Failover)与负载均衡;
- 监听器实时感知实例状态,显示为READY(静态注册为UNKNOWN)。
若监听器端口非默认1521,需通过LOCAL_LISTENER参数指定注册地址,例如:alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=tcp)(HOST=prod-server)(PORT=1522))'。
2.3 简化连接:Easy Connect方式
Oracle 10g及以上支持Easy Connect连接方式,无需配置tnsnames.ora,直接通过URL格式连接,语法为:
sqlplus username/password@host:port/service_name
示例:sqlplus eygle/eygle@172.16.3.248:1521/eygle。
启用该功能需在客户端与服务器端的sqlnet.ora中配置:NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)。
三、数据库关闭:四模式可控式终止
数据库关闭是启动的逆向流程(Close→Dismount→Shutdown),Oracle提供四种关闭模式,适配不同运维场景,核心差异在于对当前连接与事务的处理方式。
3.1 关闭阶段拆解
- Close阶段:关闭所有数据文件与日志文件,终止事务恢复,需确保无活跃会话,否则抛出ORA-01093错误;
- Dismount阶段:卸载数据库,释放控制文件锁定,告警日志记录
Completed: alter database dismount; - Shutdown阶段:终止后台进程,释放SGA内存,实例停止运行。
3.2 四种关闭模式对比
| 关闭模式 | 允许新连接 | 等待活跃会话 | 等待活跃事务 | 强制检查点 | 下次启动恢复 |
|---|---|---|---|---|---|
| SHUTDOWN NORMAL | × | √ | √ | √ | 无需 |
| SHUTDOWN IMMEDIATE | × | × | ×(回滚事务) | √ | 无需 |
| SHUTDOWN TRANSACTIONAL | × | × | √(等待完成) | √ | 无需 |
| SHUTDOWN ABORT | × | × | ×(强制中断) | × | 需实例恢复 |
3.2.1 各模式适用场景
- NORMAL(默认):等待所有用户主动断开连接,关闭耗时最长,适用于无业务访问的维护场景;
- IMMEDIATE(最常用):中断当前事务并回滚,强制断开连接,关闭安全且高效,适用于日常运维;
- TRANSACTIONAL:禁止新事务,等待现有事务完成后关闭,适用于需保证事务完整性的场景;
- ABORT(不推荐):强制终止所有进程与事务,可能导致数据不一致,仅用于其他模式关闭失败或紧急停机场景。
3.3 关闭故障案例分析
某客户数据库执行shutdown immediate时长时间无响应,告警日志反复出现“PMON failed to acquire latch”错误。通过10046跟踪发现,关闭过程中数据库执行delete from sys.mon_mods$ where obj# not in (select obj# from sys.obj$)语句时,因NOT IN操作走全表扫描导致阻塞。解决方案:手工删除无效记录或等待删除操作完成,该问题在Oracle 9i之后已修复。
四、核心概念辨析:避免配置混淆
4.1 ORACLE_SID与INSTANCE_NAME
- ORACLE_SID:操作系统环境变量,用于标识实例,决定参数文件、后台进程名称(如ora_pmon_<ORACLE_SID>);
- INSTANCE_NAME:数据库初始化参数,默认与ORACLE_SID一致,可手动修改,同一ORACLE_HOME下允许不同实例使用相同INSTANCE_NAME。
4.2 DB_NAME与DB_UNIQUE_NAME
- DB_NAME:数据库名称,创建时写入控制文件与数据文件,参数文件与控制文件中的DB_NAME必须一致,否则无法Mount;
- DB_UNIQUE_NAME:Oracle 10g新增参数,用于区分同一主机上相同DB_NAME的数据库,替代9i的lock_name_space参数,支持创建备用数据库。
五、Oracle数据库启动与关闭核心操作手册
前置准备
1.1 环境检查
- 环境变量配置:确认
ORACLE_SID(实例标识)与ORACLE_HOME(Oracle安装目录)已正确配置,命令如下:/* by 01022.hk - online tools website : 01022.hk/zh/textflip.html */ # Unix/Linux echo $ORACLE_SID # 示例输出:eygle echo $ORACLE_HOME # 示例输出:/opt/oracle/product/12.1.0 # Windows echo %ORACLE_SID% echo %ORACLE_HOME% - 权限验证:需以
SYSDBA或SYSOPER身份操作,这是启动/关闭数据库的必备权限。
1.2 工具准备
- SQL*Plus:Oracle默认交互工具,用于执行启动/关闭命令,启动方式:
/* by 01022.hk - online tools website : 01022.hk/zh/textflip.html */ sqlplus "/ as sysdba" # 本地认证(推荐) sqlplus sys/oracle@eygle as sysdba # 远程认证 - ADRCI:Oracle 11g+新增诊断工具,用于查看告警日志(替代传统文本日志),启动方式:
adrci # 进入ADRCI交互模式 adrci> show alert # 查看告警日志
数据库启动操作(核心三阶段)
Oracle启动需经历Nomount→Mount→Open三阶段,阶段间依次依赖,也可通过单命令直接完成全流程。
2.1 阶段1:Nomount(创建实例)
2.1.1 目的
仅创建Instance(实例)(分配SGA内存+启动后台进程),不依赖控制文件/数据文件,核心用于参数文件验证、实例恢复等场景。
2.1.2 操作步骤
- 执行启动命令:
SQL> startup nomount; # 启动到Nomount状态 # 成功输出:ORACLE instance started.(含SGA内存分配信息) - 验证状态:
SQL> select status from v$instance; # 输出:STARTED(Nomount状态标识) SQL> show parameter spfile; # 验证是否使用SPFILE参数文件
2.1.3 关键依赖与注意事项
- 参数文件:Oracle按以下优先级查找参数文件(缺失则启动失败):
spfile<ORACLE_SID>.ora(实例专属SPFILE)spfile.ora(通用SPFILE)init<ORACLE_SID>.ora(文本PFILE)
- 默认路径:Unix/Linux为
$ORACLE_HOME/dbs,Windows为$ORACLE_HOME\database。
- 最小参数:仅需配置
db_name即可启动,示例创建最简PFILE:# Unix/Linux echo "db_name=eygle" > $ORACLE_HOME/dbs/initeygle.ora
2.2 阶段2:Mount(挂载数据库)
2.2.1 目的
通过参数文件中的control_files配置找到控制文件,验证控制文件有效性,并关联实例与数据库物理文件(不打开数据文件)。
2.2.2 操作步骤
- 执行挂载命令(需先完成Nomount):
SQL> alter database mount; # 从Nomount切换到Mount # 成功输出:Database altered. - 验证状态:
SQL> select status from v$instance; # 输出:MOUNTED SQL> select name from v$controlfile; # 查看控制文件路径(来自控制文件本身)
2.2.3 关键依赖与注意事项
- 控制文件:若控制文件丢失/损坏,将抛出
ORA-00205错误,解决方案:- 部分丢失:复制完好的控制文件并重命名为缺失文件名(控制文件为镜像,内容一致);
- 全部丢失:通过
alter database backup controlfile to trace生成重建脚本,重建控制文件。
- 口令文件:Unix/Linux默认名为
orapw<ORACLE_SID>(路径$ORACLE_HOME/dbs),缺失将导致ORA-01990错误,重建命令:orapwd file=$ORACLE_HOME/dbs/orapweygle password=oracle entries=5
2.3 阶段3:Open(开放数据访问)
2.3.1 目的
验证数据文件/日志文件一致性,打开所有文件,数据库进入就绪状态,可对外提供数据访问。
2.3.2 操作步骤
- 执行打开命令(需先完成Mount):
SQL> alter database open; # 从Mount切换到Open # 成功输出:Database altered. - 验证状态:
SQL> select status from v$instance; # 输出:OPEN SQL> select open_mode from v$database; # 输出:READ WRITE(默认读写模式)
2.3.3 特殊场景启动
- 只读启动:适用于报表查询、数据备份场景,命令:
SQL> alter database open read only; - 强制启动:数据文件轻微不一致时(如日志丢失),需结合恢复命令强制打开(谨慎使用):
SQL> alter database open resetlogs; # 重置日志后打开(需先完成不完全恢复)
2.4 全流程快速启动
若无需中间阶段验证,可通过单命令直接完成Nomount→Mount→Open全流程:
SQL> startup; # 等价于startup open,直接启动到Open状态
数据库关闭操作(四种模式)
关闭是启动的逆向流程(Close→Dismount→Shutdown),Oracle提供四种模式,适配不同运维场景。
3.1 关闭阶段说明
- Close:关闭数据文件/日志文件,终止事务恢复(需无活跃会话);
- Dismount:卸载数据库,释放控制文件锁定;
- Shutdown:终止后台进程,释放SGA内存,实例停止。
3.2 四种关闭模式对比与操作
| 模式 | 适用场景 | 操作命令 | 核心特点 | 下次启动恢复 |
|---|---|---|---|---|
| NORMAL(默认) | 无业务访问的维护 | shutdown normal; | 禁止新连接,等待所有用户主动断开 | 无需 |
| IMMEDIATE(推荐) | 日常运维、快速关闭 | shutdown immediate; | 强制断开连接,回滚未提交事务 | 无需 |
| TRANSACTIONAL | 需保证现有事务完成 | shutdown transactional; | 禁止新事务,等待现有事务完成后关闭 | 无需 |
| ABORT(紧急) | 其他模式失败、紧急停机 | shutdown abort; | 强制终止所有进程,不回滚事务 | 需实例恢复 |
3.2.1 常用模式操作示例
- IMMEDIATE(推荐):
SQL> shutdown immediate; # 成功输出:Database closed. Database dismounted. ORACLE instance shut down. - ABORT(紧急):
SQL> shutdown abort; # 仅在紧急场景使用(如数据库无响应) # 成功输出:ORACLE instance shut down.
3.3 分阶段关闭(进阶)
若需验证中间状态,可分阶段执行关闭命令:
# 1. Close阶段(关闭数据文件)
SQL> alter database close; # 需无活跃会话,否则抛ORA-01093
# 2. Dismount阶段(卸载数据库)
SQL> alter database dismount;
# 3. Shutdown阶段(终止实例)
SQL> shutdown;
关键参数与文件(必知)
4.1 核心参数
| 参数名 | 作用 | 配置示例 |
|---|---|---|
db_name | 数据库名称(启动最小参数) | db_name=eygle |
control_files | 控制文件路径(Mount阶段依赖) | control_files='/opt/oracle/control01.ctl' |
ORACLE_SID | 实例标识(关联参数文件/进程名) | 环境变量配置:export ORACLE_SID=eygle |
diagnostic_dest | Oracle 11g+告警日志存储路径 | 默认:$ORACLE_BASE(无则为$ORACLE_HOME/log) |
4.2 关键文件
| 文件名 | 作用 | 默认路径(Unix/Linux) |
|---|---|---|
spfile<ORACLE_SID>.ora | 二进制参数文件(优先使用) | $ORACLE_HOME/dbs |
alert_<ORACLE_SID>.log | 告警日志(记录启动/关闭/故障信息) | $ORACLE_HOME/diag/rdbms/eygle/alert(11g+) |
orapw<ORACLE_SID> | 口令文件(SYSDBA认证) | $ORACLE_HOME/dbs |
lk<ORACLE_SID> | 实例锁定文件(防止重复启动) | $ORACLE_HOME/dbs |
故障排查(常见场景)
5.1 启动故障
5.1.1 Nomount阶段:参数文件丢失(ORA-01078)
- 现象:
startup nomount抛出ORA-01078: failure in processing system parameters; - 原因:未找到
spfile<ORACLE_SID>.ora/init<ORACLE_SID>.ora; - 解决方案:
- 从备份恢复参数文件;
- 若无备份,创建最简PFILE:
echo "db_name=eygle" > initeygle.ora。
5.1.2 Mount阶段:控制文件丢失(ORA-00205)
- 现象:
alter database mount抛出ORA-00205: error in identifying controlfile; - 解决方案:
- 复制完好的控制文件到缺失路径(如
cp control01.ctl control02.ctl); - 若全部丢失,通过
alter database backup controlfile to trace生成重建脚本,执行脚本重建。
- 复制完好的控制文件到缺失路径(如
5.1.3 Open阶段:数据文件缺失(ORA-01157)
- 现象:
alter database open抛出ORA-01157: cannot identify/lock data file 3; - 原因:控制文件记录的数据文件缺失或权限不足;
- 解决方案:
- 恢复缺失的数据文件到原路径;
- 若文件永久丢失,执行数据文件恢复:
alter database datafile 3 offline drop;(需后续全量恢复)。
5.2 关闭故障
5.2.1 会话阻塞(ORA-01093)
- 现象:
alter database close抛出ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected; - 原因:存在活跃会话未断开;
- 解决方案:
- 查看活跃会话:
select sid,serial# from v$session where status='ACTIVE';; - 强制断开会话:
alter system kill session 'sid,serial#';(如alter system kill session '15,200';)。
- 查看活跃会话:
5.2.2 ABORT后启动慢
- 现象:
shutdown abort后,下次启动时Open阶段耗时过长; - 原因:ABORT未执行检查点,启动时需执行实例恢复;
- 优化方案:下次ABORT前手动执行检查点:
alter system checkpoint;。
FAQ(常见问题)
-
Q:如何切换参数文件(从PFILE到SPFILE)?
A:通过create spfile from pfile;生成SPFILE,重启后自动使用。 -
Q:Oracle 11g后告警日志在哪里?
A:默认路径由diagnostic_dest控制,通过adrci> show alert查看,或直接访问$ORACLE_BASE/diag/rdbms/<实例名>/alert。 -
Q:动态注册监听器失败怎么办?
A:检查LOCAL_LISTENER参数,确保监听器地址正确,示例:alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.33.11)(PORT=1521))' scope=both; -
Q:同一主机能否启动多个相同ORACLE_SID的实例?
A:不同ORACLE_HOME下可以,同一ORACLE_HOME下不行(ORACLE_SID需唯一)。
74

被折叠的 条评论
为什么被折叠?



