1.2 数据库状态
Oracle数据库有以下几种状态:
- SHUTDOWN:数据库完全关闭
- NOMOUNT:实例已启动,未加载数据库
- MOUNT:数据库已加载,但未打开
- OPEN:数据库完全打开,可以读写
- OPEN READ ONLY:数据库只读模式
1.3 启动阶段
Oracle数据库启动经历以下阶段:
- NOMOUNT阶段:启动实例,读取参数文件,分配内存,启动后台进程
- MOUNT阶段:加载控制文件,读取数据文件和日志文件信息
- 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)
Part03-生产环境项目实施方案
3.1 正常启动数据库
3.1.1 启动到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状态
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状态
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 完整启动数据库
$ 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 以只读模式启动
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启动
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模式关闭
SQL> shutdown normal;Database closed.
Database dismounted.
ORACLE instance shut down.
# 注意:NORMAL模式会等待所有用户断开连接
# 如果有用户连接,会一直等待
3.3.2 IMMEDIATE模式关闭
SQL> shutdown immediate;Database closed.
Database dismounted.
ORACLE instance shut down.
# IMMEDIATE模式会:
# 1. 禁止新的连接
# 2. 中断当前执行的SQL
# 3. 回滚未提交的事务
# 4. 断开所有用户连接
# 5. 关闭数据库
3.3.3 TRANSACTIONAL模式关闭
SQL> shutdown transactional;Database closed.
Database dismounted.
ORACLE instance shut down.
# TRANSACTIONAL模式会:
# 1. 禁止新的连接
# 2. 等待所有事务完成
# 3. 断开所有用户连接
# 4. 关闭数据库
3.4 特殊关闭方式
3.4.1 ABORT模式关闭
SQL> shutdown abort;ORACLE instance shut down.
# ABORT模式会:
# 1. 立即终止实例
# 2. 不回滚事务
# 3. 下次启动需要实例恢复
# 注意:只有在紧急情况下使用
3.4.2 分步关闭数据库
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状态间切换
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:正常启动数据库
$ 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:恢复模式启动
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:正常维护窗口关闭
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:紧急情况关闭
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 启动失败排查
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 关闭失败排查
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 开机自启动配置
# 编辑/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:尝试正常关闭
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. 验证数据完整性
# 注意:保持冷静,按照流程操作,记录所有步骤
更多学习教程公众号风哥教程itpux_com
from oracle:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
