1. 首页 > Oracle教程 > 正文

Oracle教程FG005-Oracle数据库启动与关闭管理

1.2 数据库状态

Oracle数据库有以下几种状态:

  • SHUTDOWN:数据库完全关闭
  • NOMOUNT:实例已启动,未加载数据库
  • MOUNT:数据库已加载,但未打开
  • OPEN:数据库完全打开,可以读写
  • OPEN READ ONLY:数据库只读模式

1.3 启动阶段

Oracle数据库启动经历以下阶段:

  1. NOMOUNT阶段:启动实例,读取参数文件,分配内存,启动后台进程
  2. MOUNT阶段:加载控制文件,读取数据文件和日志文件信息
  3. OPEN阶段:打开数据文件和日志文件,执行实例恢复
风哥提示:每个启动阶段都有特定的用途,可以根据需要停在不同阶段进行操作。

1.4 关闭模式

Oracle数据库有四种关闭模式:

  • NORMAL:等待所有用户断开连接后关闭
  • IMMEDIATE:中断当前事务,回滚未提交事务,关闭数据库
  • TRANSACTIONAL:等待所有事务完成后关闭
  • ABORT:立即关闭,不等待,下次启动需要实例恢复

Part02-生产环境规划与建议

2.1 启动规划

生产环境数据库启动规划:

# 启动前检查清单
– 检查参数文件是否存在
– 检查控制文件是否存在
– 检查数据文件是否存在
– 检查日志文件是否存在
– 检查监听器状态
– 检查磁盘空间是否充足
– 检查内存是否足够
– 检查系统资源限制

# 启动步骤规划
1. 启动监听器
2. 启动数据库实例
3. 验证数据库状态
4. 检查应用连接
5. 执行健康检查

2.2 关闭规划

生产环境数据库关闭规划:

# 关闭前检查清单
– 检查当前连接数
– 检查正在执行的事务
– 检查备份状态
– 通知相关用户
– 选择合适的关闭模式
– 确认维护窗口

# 关闭步骤规划
1. 通知应用停止连接
2. 检查活动会话
3. 执行检查点
4. 选择关闭模式
5. 关闭数据库
6. 验证关闭状态

2.3 自动化建议

生产环境自动化建议:

  • 配置数据库开机自启动
  • 编写启动和关闭脚本
  • 设置健康检查脚本
  • 配置告警通知
  • 使用集群管理工具(如CRS)
生产环境建议:在RAC环境中,使用srvctl命令管理数据库的启动和关闭,确保集群节点间的协调。

Part03-生产环境项目实施方案

3.1 正常启动数据库

3.1.1 启动到NOMOUNT状态

# 启动到NOMOUNT状态
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 – Production on Thu Mar 31 19:00:00 2026
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup nomount;ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size 9136720 bytes
Variable Size 419430400 bytes
Database Buffers 637534208 bytes
Redo Buffers 7639040 bytes

SQL> select status from v$instance;STATUS
————
STARTED

SQL> show parameter control_files;NAME TYPE VALUE
———————————— ———– ——————————
control_files string /oracle/app/oracle/oradata/f
gedudb/control01.ctl, /oracle
/app/oracle/fast_recovery_are
a/fgedudb/control02.ctl

3.1.2 启动到MOUNT状态

# 从NOMOUNT到MOUNT
SQL> alter database mount;Database altered.

SQL> select status from v$instance;STATUS
————
MOUNTED

SQL> select name, open_mode from v$database;NAME OPEN_MODE
——— ——————–
FGEDUDB MOUNTED

SQL> select name from v$datafile;NAME
——————————————————————————–
/oracle/app/oracle/oradata/fgedudb/system01.dbf
/oracle/app/oracle/oradata/fgedudb/sysaux01.dbf
/oracle/app/oracle/oradata/fgedudb/undotbs01.dbf
/oracle/app/oracle/oradata/fgedudb/users01.dbf

3.1.3 启动到OPEN状态

# 从MOUNT到OPEN
SQL> alter database open;Database altered.

SQL> select status from v$instance;STATUS
————
OPEN

SQL> select name, open_mode from v$database;NAME OPEN_MODE
——— ——————–
FGEDUDB READ WRITE

SQL> select instance_name, status, database_status from v$instance;INSTANCE_NAME STATUS DATABASE_STATUS
—————- ———— —————–
fgedudb OPEN ACTIVE

3.1.4 完整启动数据库

# 直接启动数据库到OPEN状态
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 – Production on Thu Mar 31 19:10:00 2026
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup;ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size 9136720 bytes
Variable Size 419430400 bytes
Database Buffers 637534208 bytes
Redo Buffers 7639040 bytes
Database mounted.
Database opened.

SQL> select open_mode, database_role from v$database;OPEN_MODE DATABASE_ROLE
——————– —————-
READ WRITE PRIMARY

3.2 特殊启动方式

3.2.1 以只读模式启动

# 启动到MOUNT状态
SQL> startup mount;ORACLE instance started.
Database mounted.

# 以只读模式打开
SQL> alter database open read only;Database altered.

SQL> select name, open_mode from v$database;NAME OPEN_MODE
——— ——————–
FGEDUDB READ ONLY

3.2.2 限制模式启动

# 限制模式启动
SQL> startup restrict;ORACLE instance started.
Database mounted.
Database opened.

SQL> select logins from v$instance;LOGINS
———-
RESTRICTED

# 或者在打开后启用限制模式
SQL> alter system enable restricted session;System altered.

# 禁用限制模式
SQL> alter system disable restricted session;System altered.

3.2.3 使用PFILE启动

# 使用指定的PFILE启动
SQL> startup pfile=’/oracle/app/oracle/product/19c/db_1/dbs/initfgedudb.ora’;ORACLE instance started.
Database mounted.
Database opened.

SQL> show parameter spfile;NAME TYPE VALUE
———————————— ———– ——————————
spfile string

3.3 正常关闭数据库

3.3.1 NORMAL模式关闭

# NORMAL模式关闭
SQL> shutdown normal;Database closed.
Database dismounted.
ORACLE instance shut down.

# 注意:NORMAL模式会等待所有用户断开连接
# 如果有用户连接,会一直等待

3.3.2 IMMEDIATE模式关闭

# IMMEDIATE模式关闭
SQL> shutdown immediate;Database closed.
Database dismounted.
ORACLE instance shut down.

# IMMEDIATE模式会:
# 1. 禁止新的连接
# 2. 中断当前执行的SQL
# 3. 回滚未提交的事务
# 4. 断开所有用户连接
# 5. 关闭数据库

3.3.3 TRANSACTIONAL模式关闭

# TRANSACTIONAL模式关闭
SQL> shutdown transactional;Database closed.
Database dismounted.
ORACLE instance shut down.

# TRANSACTIONAL模式会:
# 1. 禁止新的连接
# 2. 等待所有事务完成
# 3. 断开所有用户连接
# 4. 关闭数据库

3.4 特殊关闭方式

3.4.1 ABORT模式关闭

# ABORT模式关闭(紧急情况使用)
SQL> shutdown abort;ORACLE instance shut down.

# ABORT模式会:
# 1. 立即终止实例
# 2. 不回滚事务
# 3. 下次启动需要实例恢复
# 注意:只有在紧急情况下使用

3.4.2 分步关闭数据库

# 分步关闭:从OPEN到MOUNT
SQL> alter database close;Database altered.

# 从MOUNT到NOMOUNT
SQL> alter database dismount;Database altered.

# 关闭实例
SQL> shutdown;ORACLE instance shut down.

3.5 状态转换

3.5.1 在OPEN状态间切换

# 从READ WRITE切换到READ ONLY
SQL> alter database open read only;Database altered.

SQL> select open_mode from v$database;OPEN_MODE
——————–
READ ONLY

# 从READ ONLY切换回READ WRITE(需要先关闭再打开)
SQL> shutdown immediate;Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup;ORACLE instance started.
Database mounted.
Database opened.

SQL> select open_mode from v$database;OPEN_MODE
——————–
READ WRITE

Part04-生产案例与实战讲解

4.1 启动场景实战

4.1.1 场景1:正常启动数据库

# 步骤1:检查监听器状态
$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 – Production on 31-MAR-2026 19:30:00

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac1)(PORT=1521)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 – Production
Start Date 31-MAR-2026 18:00:00
Uptime 0 days 1 hr. 30 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/19c/db_1/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/rac1/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac1)(PORT=1521)))
Services Summary…
Service “fgedudb” has 1 instance(s).
Instance “fgedudb”, status READY, has 1 handler(s) for this service…
The command completed successfully

# 步骤2:启动数据库
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 – Production on Thu Mar 31 19:31:00 2026
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup;ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size 9136720 bytes
Variable Size 419430400 bytes
Database Buffers 637534208 bytes
Redo Buffers 7639040 bytes
Database mounted.
Database opened.

# 步骤3:验证数据库状态
SQL> select instance_name, status, database_status from v$instance;INSTANCE_NAME STATUS DATABASE_STATUS
—————- ———— —————–
fgedudb OPEN ACTIVE

SQL> select name, open_mode, database_role from v$database;NAME OPEN_MODE DATABASE_ROLE
——— ——————– —————-
FGEDUDB READ WRITE PRIMARY

# 步骤4:检查表空间状态
SQL> select tablespace_name, status from dba_tablespaces;TABLESPACE_NAME STATUS
—————————— ———
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE

# 步骤5:检查告警日志
SQL> exit
$ tail -50 /oracle/app/oracle/diag/rdbms/fgedudb/fgedudb/trace/alert_fgedudb.log

4.1.2 场景2:恢复模式启动

# 启动到MOUNT状态进行恢复
SQL> startup mount;ORACLE instance started.
Database mounted.

# 执行介质恢复
SQL> recover database;Media recovery complete.

# 打开数据库
SQL> alter database open;Database altered.

4.2 关闭场景实战

4.2.1 场景1:正常维护窗口关闭

# 步骤1:检查活动会话
SQL> select sid, serial#, username, status, machine from v$session where type = ‘USER’;SID SERIAL# USERNAME STATUS MACHINE
———- ———- —————————— ——– ——————–
123 45 SYS ACTIVE rac1
124 23 FGAPP_USER INACTIVE app-server-01
125 67 FGAPP_USER INACTIVE app-server-02

# 步骤2:发送通知给用户
# (通过应用或邮件通知用户)

# 步骤3:等待一段时间让用户断开连接
# (等待10分钟)

# 步骤4:检查剩余会话
SQL> select sid, serial#, username, status, machine from v$session where type = ‘USER’;SID SERIAL# USERNAME STATUS MACHINE
———- ———- —————————— ——– ——————–
123 45 SYS ACTIVE rac1

# 步骤5:使用IMMEDIATE模式关闭
SQL> shutdown immediate;Database closed.
Database dismounted.
ORACLE instance shut down.

# 步骤6:验证关闭状态
SQL> exit
$ ps -ef | grep ora_
oracle 1234 1 0 19:00 ? 00:00:00 ora_pmon_fgedudb
# (如果没有看到进程,说明已关闭)

# 步骤7:检查告警日志
$ tail -20 /oracle/app/oracle/diag/rdbms/fgedudb/fgedudb/trace/alert_fgedudb.log
Shutting down instance (immediate)
Shutting down instance: further logons disabled
Stopping background process MMNL
Stopping background process MMON
License high water mark = 5
All dispatchers and shared servers shutdown
ALTER DATABASE CLOSE NORMAL
Completed: ALTER DATABASE CLOSE NORMAL
ALTER DATABASE DISMOUNT
Completed: ALTER DATABASE DISMOUNT
Shutting down archive processes
Archiving is disabled
Archive process shutdown avoided: 0 active
Shutting down instance (complete)
Instance terminated by USER, pid = 5678

4.2.2 场景2:紧急情况关闭

# 紧急情况使用ABORT模式
SQL> shutdown abort;ORACLE instance shut down.

# 注意:下次启动需要实例恢复
# 启动时会自动进行实例恢复
SQL> startup;ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size 9136720 bytes
Variable Size 419430400 bytes
Database Buffers 637534208 bytes
Redo Buffers 7639040 bytes
Database mounted.
Database opened.

# 检查告警日志确认恢复完成
$ tail -50 /oracle/app/oracle/diag/rdbms/fgedudb/fgedudb/trace/alert_fgedudb.log

4.3 故障排查

4.3.1 启动失败排查

# 问题1:参数文件丢失
SQL> startup;ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file ‘/oracle/app/oracle/product/19c/db_1/dbs/initfgedudb.ora’

# 解决方案:从备份恢复或从SPFILE创建
SQL> create pfile from spfile=’/oracle/app/oracle/product/19c/db_1/dbs/spfilefgedudb.ora’;# 问题2:控制文件损坏
SQL> startup;ORA-00205: error in identifying control file, check alert log for more info

# 解决方案:检查告警日志,从备份恢复控制文件

# 问题3:数据文件损坏
SQL> startup;ORA-01157: cannot identify/lock data file 1 – see DBWR trace file
ORA-01110: data file 1: ‘/oracle/app/oracle/oradata/fgedudb/system01.dbf’

# 解决方案:检查文件权限和存在性,从备份恢复

# 问题4:内存不足
SQL> startup;ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory

# 解决方案:检查系统内存,调整SGA参数

4.3.2 关闭失败排查

# 问题1:无法关闭数据库(有长时间运行的事务)
SQL> shutdown immediate;(长时间无响应)

# 解决方案:查询长事务,使用ABORT模式
SQL> select sid, serial#, username, status from v$transaction t, v$session s where t.addr = s.taddr;# 然后使用ABORT模式
SQL> shutdown abort;# 问题2:监听器阻止关闭
# 解决方案:先停止监听器,再关闭数据库
$ lsnrctl stop
$ sqlplus / as sysdba
SQL> shutdown immediate;

Part05-风哥经验总结与分享

5.1 最佳实践

  • 选择合适的关闭模式:日常维护使用IMMEDIATE,紧急情况使用ABORT
  • 启动前检查:每次启动前检查文件、磁盘空间、系统资源
  • 监控告警日志:启动和关闭后检查告警日志
  • 使用脚本自动化:编写启动和关闭脚本,减少人为错误
  • 验证状态:启动或关闭后验证数据库状态

5.2 日常维护

5.2.1 定期检查

# 检查数据库状态
$ sqlplus / as sysdba
SQL> select instance_name, status, database_status from v$instance;# 检查启动时间
SQL> select startup_time from v$instance;STARTUP_TIME
——————-
2026-03-31 19:00:00

# 检查告警日志
$ tail -100 /oracle/app/oracle/diag/rdbms/fgedudb/fgedudb/trace/alert_fgedudb.log

5.2.2 开机自启动配置

# 配置Oracle开机自启动
# 编辑/etc/oratab
# vi /etc/oratab
fgedudb:/oracle/app/oracle/product/19c/db_1:Y

# 创建启动脚本
# vi /etc/init.d/oracle
#!/bin/bash
# chkconfig: 345 99 10
# from:www.itpux.com.qq113257174.wx:itpux-com
# web `http://www.fgedu.net.cn`
# description: Oracle auto start-stop script

ORACLE_HOME=/oracle/app/oracle/product/19c/db_1
ORACLE_OWNER=oracle
ORACLE_SID=fgedudb

case “$1” in
start)
su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/lsnrctl start”
su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/sqlplus / as sysdba << EOF startup;exit;EOF" ;;stop) su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/sqlplus / as sysdba << EOF shutdown immediate;exit;EOF" su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl stop" ;;restart) $0 stop $0 start ;;*) echo "Usage: $0 {start|stop|restart}" exit 1 ;;esac exit 0 # 设置权限和启用服务 # chmod 755 /etc/init.d/oracle # chkconfig --add oracle # chkconfig oracle on

5.3 紧急处理

5.3.1 数据库挂起处理

# 情况1:数据库挂起,无法响应
# 步骤1:尝试正常关闭
SQL> shutdown immediate;(无响应)

# 步骤2:使用ABORT模式
SQL> shutdown abort;ORACLE instance shut down.

# 步骤3:重新启动
SQL> startup;ORACLE instance started.
Database mounted.
Database opened.

# 步骤4:检查数据一致性
SQL> select * from v$database_block_corruption;no rows selected

5.3.2 快速恢复流程

# 快速恢复流程
1. 使用ABORT关闭数据库
2. 检查告警日志了解问题
3. 从备份恢复必要文件
4. 执行恢复操作
5. 打开数据库
6. 验证数据完整性

# 注意:保持冷静,按照流程操作,记录所有步骤

风哥提示:数据库启动和关闭是DBA的基本操作,但在生产环境中需要非常谨慎。每次操作前都要做好检查和准备,确保万无一失。学习交流加群风哥微信: itpux-com

生产环境建议:在执行任何数据库启动或关闭操作前,先在测试环境演练,熟悉操作流程和可能遇到的问题。

风哥提示:IMMEDIATE模式是生产环境最常用的关闭模式,它能快速关闭数据库,同时保证数据一致性。更多学习教程公众号风哥教程itpux_com

注意事项:ABORT模式虽然能快速关闭数据库,但会导致实例恢复,只在紧急情况下使用。使用后要仔细检查数据一致性。

风哥提示:建立完善的操作文档和应急方案,定期进行演练,确保团队成员都熟悉启动和关闭流程。学习交流加群风哥QQ113257174

性能监控:在启动和关闭过程中,监控系统资源使用情况,确保有足够的资源供数据库使用。

风哥提示:请根据实际情况调整配置和参数,确保生产环境的安全性和稳定性。学习交流加群风哥QQ113257174

更多学习教程公众号风哥教程itpux_com

from oracle:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息