













数据库部署完成只是工作的起点,绝大多数DBA的日常工作集中在标准化运维管理。我是风哥,在大量项目落地过程中,很多重大业务故障并非由软件BUG引发,而是源于日常巡检缺失、参数基线漂移、表空间耗尽、长事务锁阻塞、告警日志报错长期无人处置,小隐患逐步演变为生产停机事故。风哥 itpux-com
本文基于Oracle19c单机非CDB数据库,硬件规格为单节点64G内存、8CPU,数据库实例与数据库名称fgedudb,业务操作用户fgedu,本地软件路径全部统一替换为/fgedudb。教程完整覆盖实例生命周期管理、spfile/pfile参数管理、存储管理(表空间、UNDO、REDO、归档、FRA快速恢复区)、用户权限Profile资源管控、会话锁与等待事件排查、告警日志分析、AWR/ASH性能诊断、闪回回收站技术,配套大量可落地Shell、SQL实战命令,建立完整标准化数据库运维工作流程,为后续备份恢复、迁移、集群运维打下坚实基础。
内容大纲:
标准化Oracle运维分为五大模块:例行巡检、变更管控、故障处置、性能监控、数据保护。
基线硬件规格64G内存、8CPU,实例
fgedudb关键spfile参数基线:
参数名称 参数值 参数说明 memory_target 48G 实例总内存,预留16G内存供操作系统、后台进程使用 processes 2000 最大并发进程数,支撑业务大量并发会话 open_cursors 500 单会话最大打开游标,规避游标泄露ORA‑01000 session_cached_cursors 300 会话游标缓存,降低SQL软解析CPU开销 undo_retention 900 UNDO数据最小保留时间,单位秒,保障一致性读、闪回查询 parallel_max_servers 16 并行执行进程上限,适配8CPU硬件 db_recovery_file_dest_size 30G FRA快速恢复区总容量,存放归档、备份、闪回日志 recyclebin ON 回收站功能开启,支持DROP对象闪回恢复
Oracle实例启动分为三个严格阶段:
数据库四种关闭模式:
SHUTDOWN IMMEDIATE:生产标准关闭方式,拒绝新连接,回滚未提交事务,干净一致性关闭实例;SHUTDOWN NORMAL:等待所有用户主动断开会话,生产极少使用;SHUTDOWN TRANSACTIONAL:等待现有事务提交完成后断开会话;SHUTDOWN ABORT:强制终止实例,不回滚事务,下次启动触发实例崩溃恢复,仅限紧急故障场景,禁止日常维护使用。参数文件分为两类:
ALTER SYSTEM修改,禁止vi直接编辑二进制文件;CREATE PFILE FROM SPFILE、CREATE SPFILE FROM PFILE。风哥数据库教程 itpux-comORA‑01555快照过旧、ORA‑30036无法扩展undo错误,需要扩容undo表空间。log file sync等待事件。V$SESSION动态视图记录数据库全部会话信息;DML操作产生行级锁,行锁不会阻塞普通SELECT查询;长时间未提交事务会持续持有行锁,引发业务会话阻塞等待。
等待事件是性能故障诊断的核心依据,高频关键等待事件:log file sync日志刷盘等待、buffer busy waits缓冲区冲突、enq: TX‑row lock contention行锁冲突。
background_dump_dest参数控制。回收站recyclebin:普通DROP表不会立刻物理删除,对象重命名移入回收站,可以执行FLASHBACK TABLE ... TO BEFORE DROP恢复误删除表;PURGE命令彻底清除回收站对象。
闪回查询依靠UNDO数据读取历史时间点数据;闪回表可以将表恢复至过去时间点;闪回数据库需要开启闪回日志,依赖FRA存储。所有闪回能力受undo保留时间、闪回日志存储空间约束,闪回属于应急恢复手段,不能替代RMAN物理备份。
说明:操作系统RHEL7,硬件规格64G内存8CPU;数据库实例
fgedudb,全部路径替换/fgedudb;oracle用户执行数据库操作,root执行操作系统操作;全部脚本务必先在测试环境验证,生产执行前完成变更评审。
su - oracle
export ORACLE_BASE=/fgedudb/app
export ORACLE_HOME=/fgedudb/app/product/19.0.0/dbhome_1
export ORACLE_SID=fgedudb
sqlplus / as sysdba
--生产标准干净关闭
SHUTDOWN IMMEDIATE;
--分步启动 nomount → mount → open
STARTUP NOMOUNT;
STARTUP MOUNT;
ALTER DATABASE OPEN;
--一步完整启动
STARTUP;
--由spfile生成文本pfile
CREATE PFILE='/fgedudb/app/product/19.0.0/dbhome_1/dbs/initfgedudb.ora' FROM SPFILE;
--由pfile重建二进制spfile
CREATE SPFILE FROM PFILE='/fgedudb/app/product/19.0.0/dbhome_1/dbs/initfgedudb.ora';
--查看当前正在使用的参数文件
SHOW PARAMETER spfile;
scope取值说明:spfile仅写入参数文件,重启实例生效;memory当前内存即时生效;both内存与spfile同时修改。
ALTER SYSTEM SET undo_retention=900 SCOPE=BOTH;
ALTER SYSTEM SET parallel_max_servers=16 SCOPE=SPFILE;
ALTER SYSTEM SET processes=2000 SCOPE=SPFILE;
ALTER SYSTEM SET db_recovery_file_dest_size=30G SCOPE=BOTH;
ALTER SYSTEM SET recyclebin=ON SCOPE=SPFILE;
--查看参数
SHOW PARAMETER undo_retention;
SHOW PARAMETER parallel_max_servers;
SHOW PARAMETER recyclebin;
SELECT
t.tablespace_name,
round(SUM(d.bytes)/1024/1024,2) total_mb,
round(SUM(d.bytes‑COALESCE(f.bytes,0))/1024/1024,2) used_mb,
round((SUM(d.bytes‑COALESCE(f.bytes,0))/SUM(d.bytes))*100,2) used_pct
FROM dba_tablespaces t
LEFT JOIN dba_data_files d ON t.tablespace_name=d.tablespace_name
LEFT JOIN dba_free_space f ON d.tablespace_name=f.tablespace_name AND d.file_id=f.file_id
GROUP BY t.tablespace_name
ORDER BY used_pct DESC;
CREATE TABLESPACE fgedu_biz
DATAFILE '+DATA/fgedudb/fgedu_biz01.dbf' SIZE 2G AUTOEXTEND ON NEXT 512M MAXSIZE 15G
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
ALTER TABLESPACE fgedu_biz ADD DATAFILE '+DATA/fgedudb/fgedu_biz02.dbf' SIZE 2G AUTOEXTEND ON NEXT 512M MAXSIZE 15G;
SELECT tablespace_name,status FROM dba_undo_tablespaces;
SELECT status,SUM(bytes)/1024/1024 mb FROM v$undo_extents GROUP BY status;
SELECT tablespace_name,file_name,bytes/1024/1024 size_mb FROM dba_temp_files;
--查看redo日志组状态
SELECT group#,thread#,bytes/1024/1024 size_mb,status FROM v$log;
SELECT group#,member FROM v$logfile;
--查看归档模式
SELECT name,log_mode,open_mode FROM v$database;
--FRA快速恢复区使用率
SELECT file_type,percent_space_used,percent_space_reclaimable,number_of_files
FROM v$flash_recovery_area_usage;
--归档日志列表
SELECT sequence#,first_time,next_time,name,applied FROM v$archived_log ORDER BY sequence# DESC;
归档磁盘满数据库挂起应急提示:禁止直接操作系统rm删除归档文件;rm后数据库元数据仍然记录归档存在,需要进入RMAN执行
crosscheck archivelog all; delete expired archivelog all;。
--创建业务用户
CREATE USER fgedu IDENTIFIED BY Fgedu@123
DEFAULT TABLESPACE fgedu_biz
TEMPORARY TABLESPACE temp;
--最小权限原则授权
GRANT CREATE SESSION,CREATE TABLE,CREATE VIEW,CREATE SEQUENCE TO fgedu;
GRANT CONNECT,RESOURCE TO fgedu;
--回收权限
REVOKE CREATE VIEW FROM fgedu;
--锁定、解锁账号
ALTER USER fgedu ACCOUNT LOCK;
ALTER USER fgedu ACCOUNT UNLOCK;
--修改账号密码
ALTER USER fgedu IDENTIFIED BY Fgedu@New123;
--查看默认profile配置
SELECT resource_name,limit FROM dba_profiles WHERE profile='DEFAULT';
--自定义业务profile,管控密码策略与资源
CREATE PROFILE prof_fgedu LIMIT
PASSWORD_LIFE_TIME 180
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
SESSIONS_PER_USER 50
CPU_PER_SESSION UNLIMITED;
--用户指定profile
ALTER USER fgedu PROFILE prof_fgedu;
SELECT username,default_tablespace,temporary_tablespace,account_status FROM dba_users WHERE username='FGEDU';
SELECT grantee,privilege FROM dba_sys_privs WHERE grantee='FGEDU';
SELECT s.sid,s.serial#,s.username,s.machine,s.program,s.status,s.event,s.sql_id
FROM v$session s WHERE s.username IS NOT NULL;
SELECT
s1.sid block_sid,s1.serial# block_serial,s1.username block_user,s1.machine block_machine,
s2.sid wait_sid,s2.serial# wait_serial,s2.username wait_user,s2.event wait_event,s2.sql_id wait_sqlid
FROM v$session s1
JOIN v$session s2 ON s1.sid=s2.blocking_session
WHERE s1.blocking_session IS NULL AND s2.blocking_session IS NOT NULL;
--语法 ALTER SYSTEM KILL SESSION 'sid,serial#';
ALTER SYSTEM KILL SESSION '145,31246';
SELECT sid,type,lmode,request,id1,id2 FROM v$lock WHERE TYPE IN('TX','TM');
--查询告警日志文件路径
SHOW PARAMETER background_dump_dest;
操作系统层面,示例路径/fgedudb/app/diag/rdbms/fgedudb/fgedudb/trace/alert_fgedudb.log
#实时跟踪告警日志输出
tail -f /fgedudb/app/diag/rdbms/fgedudb/fgedudb/trace/alert_fgedudb.log
#过滤搜索ORA错误信息
grep ORA‑ /fgedudb/app/diag/rdbms/fgedudb/fgedudb/trace/alert_fgedudb.log
登录sqlplus / as sysdba执行内置脚本,报告输出至当前工作目录。
--生成AWR快照性能报告
@?/rdbms/admin/awrrpt.sql
--AWR对比报告,对比两个时间段性能差异
@?/rdbms/admin/awrddrpt.sql
--ASH活动会话报告,处理瞬时突发故障
@?/rdbms/admin/ashrpt.sql
查询AWR快照列表,确认时间点
SELECT snap_id,startup_time,begin_interval_time,end_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 20 ROWS ONLY;
SHOW PARAMETER recyclebin;
--模拟业务用户删除表
CONNECT fgedu/Fgedu@123;
CREATE TABLE t_fgedu_test(id NUMBER);
INSERT INTO t_fgedu_test VALUES(100);
COMMIT;
DROP TABLE t_fgedu_test;
--查看回收站对象
SELECT object_name,original_name,drop_time FROM user_recyclebin;
--闪回恢复被DROP删除的表
FLASHBACK TABLE t_fgedu_test TO BEFORE DROP;
--清除单张表回收站记录
PURGE TABLE t_fgedu_test;
--清空当前用户全部回收站
PURGE RECYCLEBIN;
--闪回查询,读取5分钟之前的数据
SELECT * FROM t_fgedu_test AS OF TIMESTAMP SYSDATE‑5/24/60;
--闪回表至指定时间点,需要开启行移动
ALTER TABLE t_fgedu_test ENABLE ROW MOVEMENT;
FLASHBACK TABLE t_fgedu_test TO TIMESTAMP SYSDATE‑10/24/60;
ALTER TABLE t_fgedu_test DISABLE ROW MOVEMENT;
保存脚本文件/fgedudb/soft/oracle_daily_check_fgedudb.sh
#!/bin/bash
export ORACLE_BASE=/fgedudb/app
export ORACLE_HOME=/fgedudb/app/product/19.0.0/dbhome_1
export ORACLE_SID=fgedudb
export PATH=$ORACLE_HOME/bin:$PATH
echo "================实例基础信息================"
sqlplus -S / as sysdba <<EOF
set pagesize 120 linesize 160
SELECT instance_name,host_name,version,status,startup_time FROM v\$instance;
SELECT name,log_mode,open_mode FROM v\$database;
SHOW PARAMETER memory_target;
SHOW PARAMETER processes;
EOF
echo "================表空间使用率================"
sqlplus -S / as sysdba <<EOF
set pagesize 120 linesize 160
SELECT
t.tablespace_name,
round(SUM(d.bytes)/1024/1024,2) total_mb,
round(SUM(d.bytes‑COALESCE(f.bytes,0))/1024/1024,2) used_mb,
round((SUM(d.bytes‑COALESCE(f.bytes,0))/SUM(d.bytes))*100,2) used_pct
FROM dba_tablespaces t
LEFT JOIN dba_data_files d ON t.tablespace_name=d.tablespace_name
LEFT JOIN dba_free_space f ON d.tablespace_name=f.tablespace_name AND d.file_id=f.file_id
GROUP BY t.tablespace_name
ORDER BY used_pct DESC;
EOF
echo "================FRA快速恢复区、REDO日志================"
sqlplus -S / as sysdba <<EOF
SELECT group#,bytes/1024/1024 size_mb,status FROM v\$log;
SELECT file_type,percent_space_used FROM v\$flash_recovery_area_usage;
EOF
echo "================失效对象检查================"
sqlplus -S / as sysdba <<EOF
SELECT object_name,object_type,status FROM dba_objects WHERE status!='VALID';
EOF
echo "================监听状态================"
lsnrctl status
echo "================操作系统内存CPU信息================"
free -g
lscpu
赋予执行权限,运行巡检脚本
chmod +x /fgedudb/soft/oracle_daily_check_fgedudb.sh
./fgedudb/soft/oracle_daily_check_fgedudb.sh
Oracle数据库日常运维,不是简单执行启停命令,而是一套完整标准化运维体系。我是风哥,在大量项目实施过程中,很多生产事故的根源,都来自巡检缺位:表空间持续上涨无人处理、归档磁盘占满业务挂起、长事务持有锁引发大面积阻塞、告警日志ORA报错长期被忽略。风哥 itpux-com
本文基于硬件规格64G内存、8CPU的Oracle19c单机实例,全部路径替换为/fgedudb,数据库实例fgedudb,业务用户fgedu。完整覆盖实例生命周期管理、spfile/pfile参数、各类存储组件运维、账号权限Profile管控、会话锁阻塞排查、告警日志、AWR/ASH性能诊断、闪回回收站技术,配套完整可直接落地的自动化巡检脚本。
这里有几条必须严格遵守的生产运维关键点:
SHUTDOWN IMMEDIATE,SHUTDOWN ABORT只用于极端故障场景,禁止日常维护使用;二进制spfile文件禁止vi直接编辑,统一使用ALTER SYSTEM命令修改参数;ARCHIVELOG归档模式,定期巡检表空间、FRA快速恢复区使用率,磁盘告警阈值提前设置;日常运维工作重点是防患于未然,例行巡检、变更管控、故障演练三者缺一不可。本教程为单机运维基础,后续RAC集群运维、RMAN备份恢复、ADG容灾、补丁升级都建立在这套运维能力之上。DBA不能只会复制脚本执行,需要读懂每一条动态视图输出背后含义,理解数据库内部运行机制,才能从容应对各类真实线上故障。风哥数据库教程 itpux-com
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。