Oracle Database 常用运维指令手册
Oracle Database 常用运维指令手册
适用版本:Oracle Database 19c / 21c / 23ai(23.x)/ Oracle AI Database 26ai(23.26.x) 约定:
#root 或 oracle 用户,$普通用户,SQL>sqlplus 提示符,RMAN>RMAN 提示符,<xxx>为占位符。 差异标注:正文用> **版本差异**引用块标注跨版本不一致之处。 更新时间:2026-11
目录
- 版本与支持周期
- 下载地址与安装
- 实例启停与服务管理
- 监听器与网络配置
- SQL*Plus 与客户端连接
- 参数与 SPFILE
- 多租户:CDB 与 PDB
- 用户、权限与表空间配额
- 表空间与数据文件
- 对象日常操作
- 归档模式与日志
- RMAN 备份与恢复
- Data Pump 逻辑备份
- Data Guard 与 ADG
- 日志体系与告警
- 性能诊断:AWR / ASH / 锁
- 空间与容量管理
- 升级与迁移
- 高频故障速查
- 危险命令与避坑清单
- 附录:巡检脚本与视图速查
1. 版本与支持周期
1.1 版本格局
| 版本 | 定位 | 支持状态(2026-11) | 说明 |
|---|---|---|---|
| 11g R2 (11.2) | 老一代主力 | 已 EOL | 仍在不少老系统运行,无补丁 |
| 12c R2 (12.2) | 首个成熟多租户 | 已 EOL | 升级跳板 |
| 19c | 长期支持(Long Term) | Premier 至 2027-04,Extended 至 2032-04 | 当前存量最大的生产版本 |
| 21c | Innovation | 已 EOL | 不建议新部署 |
| 23ai | Innovation → 长期线 | 持续更新 | 首个内置 AI Vector Search 的版本 |
| 26ai | 当前主推(AI Database) | 活跃 | 版本号仍为 23.26.x,功能上延续 23ai |
关键:Oracle 的版本号与实际发行名不一致。26ai 的内部版本号是 23.26.x(例如
23.26.3.0.0),sqlplus里看到的是 23.x,不要误判为旧版本。 19c 是最稳妥的存量升级目标;新建系统选 26ai(免费版可用)。
1.2 版本识别
SQL> SELECT * FROM v$version;
SQL> SELECT banner_full FROM v$version;
SQL> SELECT version_full FROM v$instance;
SQL> SELECT instance_name, host_name, version, status, database_status FROM v$instance;
$ORACLE_HOME/OPatch/opatch lspatches # 已打的补丁(RU / CPU)
$ORACLE_HOME/OPatch/opatch lsinventory | head -40
-- 补丁与组件版本
SELECT * FROM registry$history ORDER BY action_time DESC;
SELECT comp_name, version, status FROM dba_registry;
1.3 免费版限制(Oracle AI Database Free)
| 项目 | 限制 |
|---|---|
| CPU | 2 核 |
| 内存 | 2 GB(SGA + PGA) |
| 用户数据 | 12 GB |
| 用途 | 开发、测试、学习;可用于生产小应用,但无官方支持 |
2. 下载地址与安装
2.1 官方入口总表
| 用途 | 地址 |
|---|---|
| 数据库下载总入口 | https://www.oracle.com/database/technologies/oracle-database-software-downloads.html |
| Oracle AI Database Free(免费版) | https://www.oracle.com/database/free/ |
| 26ai Linux 下载(RPM/ZIP/客户端) | https://www.oracle.com/database/technologies/oracle26ai-linux-downloads.html |
| 19c 下载 | https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html |
| Docker 免费版镜像 | container-registry.oracle.com/database/free:latest |
| Oracle Container Registry | https://container-registry.oracle.com/ |
| 官方文档 | https://docs.oracle.com/en/database/oracle/oracle-database/ |
| My Oracle Support(补丁) | https://support.oracle.com |
| Instant Client | https://www.oracle.com/database/technologies/instant-client.html |
| SQL Developer | https://www.oracle.com/database/sqldeveloper/ |
| Oracle Linux 预安装 RPM | 见各版本安装文档的 preinstall 包 |
国内下载通常需要 Oracle 账号登录,企业环境一般通过 MOS 或内部制品库分发。
2.2 Oracle Linux / RHEL 安装(RPM 方式,26ai 示例)
# 1) 预安装包:自动创建 oracle 用户、组、内核参数、目录、limits
dnf install -y oracle-database-preinstall-26ai
# 19c 对应 oracle-database-preinstall-19c
# 2) 安装数据库软件(RPM 内含 dbca/netca 所需组件)
dnf install -y oracle-ai-database-ee-26ai-1.0-1.el9.x86_64.rpm
# 3) 配置环境变量
cat >> /home/oracle/.bash_profile <<'EOF'
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/26ai/dbhome_1
export ORACLE_SID=ORCLCDB
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
EOF
source /home/oracle/.bash_profile
# 4) 建库(静默,CDB + 1 个 PDB)
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbName ORCLCDB -sid ORCLCDB \
-createAsContainerDatabase true \
-numberOfPDBs 1 -pdbName ORCLPDB1 \
-sysPassword 'Sys#Str0ng2026' \
-systemPassword 'Sys#Str0ng2026' \
-characterSet AL32UTF8 \
-totalMemory 4096 \
-emConfiguration NONE \
-datafileDestination /opt/oracle/oradata
注意:
-totalMemory单位 MB。免费版上限 2GB 内存,设置超过会被拒绝或运行异常。
2.3 ZIP 方式(runInstaller)
# 解压到 ORACLE_HOME
mkdir -p /opt/oracle/product/26ai/dbhome_1
cd /opt/oracle/product/26ai/dbhome_1
unzip -q LINUX.X64_2326100_db_home.zip
# 静默安装(响应文件方式)
./runInstaller -silent -waitforcompletion -responseFile /tmp/db_install.rsp
# 按提示用 root 执行配置脚本
/opt/oracle/oraInventory/orainstRoot.sh
/opt/oracle/product/26ai/dbhome_1/root.sh
响应文件关键项:
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/opt/oracle/oraInventory
ORACLE_HOME=/opt/oracle/product/26ai/dbhome_1
ORACLE_BASE=/opt/oracle
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=ora01
oracle.install.db.InstallEdition=EE
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
2.4 Docker 部署(最快上手)
docker pull container-registry.oracle.com/database/free:latest
docker run -d --name oracle-free \
--restart unless-stopped \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_PWD='Sys#Str0ng2026' \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v /data/oracle/oradata:/opt/oracle/oradata \
container-registry.oracle.com/database/free:latest
# 首次启动建库需要几分钟
docker logs -f oracle-free
# 连接
docker exec -it oracle-free sqlplus sys/Sys#Str0ng2026@localhost:1521/FREEPDB1 as sysdba
2.5 安装后必做
# 1) 确认监听与实例
lsnrctl status
sqlplus -S / as sysdba <<'SQL'
SELECT instance_name, status FROM v$instance;
SELECT name, open_mode, cdb FROM v$database;
SQL
# 2) 设置归档(生产必须)
sqlplus / as sysdba
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
SQL> ARCHIVE LOG LIST;
# 3) 配置开机自启(见第 3 章)
3. 实例启停与服务管理
3.1 SQL*Plus 启停(最基础)
sqlplus / as sysdba # OS 认证,要求当前用户在 dba 组
sqlplus sys/password as sysdba
sqlplus system/password@ORCLPDB1
SQL> STARTUP; -- 启动到 OPEN
SQL> STARTUP MOUNT; -- 到 MOUNT(改归档、恢复时用)
SQL> STARTUP NOMOUNT; -- 只启动实例(建库、恢复控制文件)
SQL> STARTUP FORCE; -- 异常时强制重启
SQL> STARTUP RESTRICT; -- 限制模式,只允许有 RESTRICTED SESSION 权限的用户
SQL> SHUTDOWN NORMAL; -- 等所有会话主动退出(几乎不用,会挂住)
SQL> SHUTDOWN TRANSACTIONAL; -- 等当前事务结束
SQL> SHUTDOWN IMMEDIATE; -- 回滚未提交事务后关闭(日常首选)
SQL> SHUTDOWN ABORT; -- 直接终止,下次启动走实例恢复
| 关闭方式 | 行为 | 适用 |
|---|---|---|
NORMAL |
等所有连接断开 | 几乎不用 |
TRANSACTIONAL |
等事务结束,断开会话 | 有计划维护 |
IMMEDIATE |
回滚事务、检查点、关闭 | 日常标准 |
ABORT |
立即终止,需实例恢复 | 卡死、紧急 |
危险:
SHUTDOWN ABORT不会损坏数据(有 redo 保护),但下次启动需要实例恢复,且未提交事务丢失。非紧急不用。
3.2 状态查询
SQL> SELECT instance_name, status, database_status, active_state FROM v$instance;
SQL> SELECT name, open_mode, database_role, protection_mode FROM v$database;
SQL> SELECT log_mode FROM v$database;
SQL> SELECT status FROM v$instance;
状态含义:
v$instance.status |
含义 |
|---|---|
STARTED |
NOMOUNT,只起了实例 |
MOUNTED |
读了控制文件,数据文件未打开 |
OPEN |
正常可用 |
OPEN MIGRATE |
升级中 |
3.3 监听器
lsnrctl status
lsnrctl status LISTENER
lsnrctl start
lsnrctl stop
lsnrctl reload # 重读 listener.ora,不断连接
lsnrctl services
lsnrctl version
# 动态注册之外,手工注册
sqlplus / as sysdba
SQL> ALTER SYSTEM REGISTER;
3.4 开机自启(systemd)
Oracle 自带的 dbstart/dbshut 依赖 /etc/oratab:
# /etc/oratab 最后一段从 N 改成 Y 才会被 dbstart 拉起
ORCLCDB:/opt/oracle/product/26ai/dbhome_1:Y
# /etc/systemd/system/oracle-db.service
[Unit]
Description=Oracle Database Startup
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
User=oracle
Environment=ORACLE_HOME=/opt/oracle/product/26ai/dbhome_1
ExecStart=/opt/oracle/product/26ai/dbhome_1/bin/dbstart /opt/oracle/product/26ai/dbhome_1
ExecStop=/opt/oracle/product/26ai/dbhome_1/bin/dbshut /opt/oracle/product/26ai/dbhome_1
TimeoutStartSec=600
[Install]
WantedBy=multi-user.target
# 监听器单独一个单元
# /etc/systemd/system/oracle-listener.service
[Unit]
Description=Oracle Net Listener
After=network.target
[Service]
Type=forking
User=oracle
Environment=ORACLE_HOME=/opt/oracle/product/26ai/dbhome_1
ExecStart=/opt/oracle/product/26ai/dbhome_1/bin/lsnrctl start
ExecStop=/opt/oracle/product/26ai/dbhome_1/bin/lsnrctl stop
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now oracle-listener oracle-db
注意:
dbstart对多租户 CDB 只会启动到 CDB,PDB 的打开状态由PDB_SAVE_STATE决定,见 7.4。
3.5 多实例(同一主机)
export ORACLE_SID=ORCL2
export ORACLE_HOME=/opt/oracle/product/26ai/dbhome_2
sqlplus / as sysdba
每个 SID 在 /etc/oratab 各占一行,监听器可通过 SID_LIST_LISTENER 静态注册多个实例。
4. 监听器与网络配置
4.1 三个文件的分工
| 文件 | 位置 | 作用 |
|---|---|---|
listener.ora |
$ORACLE_HOME/network/admin |
服务端监听配置 |
tnsnames.ora |
$ORACLE_HOME/network/admin 或 $TNS_ADMIN |
客户端连接别名 |
sqlnet.ora |
同上 | 命名方法、加密、超时 |
echo $TNS_ADMIN
ls $ORACLE_HOME/network/admin/
4.2 listener.ora 示例
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.11)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC = (GLOBAL_DBNAME = ORCLCDB)(ORACLE_HOME = /opt/oracle/product/26ai/dbhome_1)(SID_NAME = ORCLCDB))
)
ADR_BASE_LISTENER = /opt/oracle
4.3 tnsnames.ora 示例
ORCLPDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.11)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCLPDB1)
)
)
ORCLCDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.11)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = ORCLCDB))
)
4.4 sqlnet.ora 常用项
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.EXPIRE_TIME = 10 # 每 10 分钟探活,清理死连接
SQLNET.ENCRYPTION_SERVER = required
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)
SQLNET.CRYPTO_CHECKSUM_SERVER = required
4.5 连通性排查
# 1) 监听在不在
lsnrctl status
ss -lntp | grep 1521
# 2) 服务名解析对不对
tnsping ORCLPDB1
tnsping 10.0.0.11:1521/ORCLPDB1
# 3) 直连测试(绕过 tnsnames)
sqlplus system/pass@//10.0.0.11:1521/ORCLPDB1
# 4) 看监听日志
tail -100 $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log
常见错误码:
ORA-12541无监听;ORA-12514监听不认识该服务名(动态注册未完成或service_names不含它);ORA-12154客户端解析不到别名(TNS_ADMIN或tnsnames.ora路径错);ORA-12545主机名解析失败。
5. SQL*Plus 与客户端连接
5.1 基本用法
sqlplus / as sysdba # OS 认证
sqlplus sys/pass@ORCLCDB as sysdba
sqlplus system/pass@ORCLPDB1
sqlplus -S system/pass@ORCLPDB1 <<'SQL' # 静默执行,脚本常用
SELECT sysdate FROM dual;
EXIT
SQL
sqlplus system/pass@ORCLPDB1 @/tmp/script.sql # 执行脚本
sqlplus -S system/pass@ORCLPDB1 @script.sql > out.txt
5.2 会话设置(脚本必备)
SQL> SET LINESIZE 200
SQL> SET PAGESIZE 200
SQL> SET LONG 100000
SQL> SET LONGCHUNKSIZE 10000
SQL> SET SERVEROUTPUT ON SIZE UNLIMITED
SQL> SET TIMING ON
SQL> SET AUTOTRACE ON EXPLAIN STATISTICS
SQL> SET FEEDBACK ON
SQL> SET ECHO OFF
SQL> COL name FOR a30
SQL> COL value FOR a60
SQL> SPOOL /tmp/report.txt
...
SQL> SPOOL OFF
5.3 常用数据字典命令
SQL> SELECT table_name FROM dict WHERE table_name LIKE 'DBA_%' AND ROWNUM < 20;
SQL> DESC dba_tablespaces;
SQL> SELECT * FROM tab; -- 当前用户对象
SQL> SELECT object_name, object_type, status FROM user_objects;
SQL> SHOW PARAMETER sga;
SQL> SHOW ALL;
SQL> DEFINE;
5.4 错误码查询
oerr ora 12514
oerr ora 01555
oerr rman 1234
SQL> SELECT * FROM v$diag_info; -- 各类诊断文件路径
6. 参数与 SPFILE
6.1 SPFILE 与 PFILE
SQL> SHOW PARAMETER spfile;
SQL> CREATE PFILE='/tmp/pfile_bak.ora' FROM SPFILE;
SQL> CREATE SPFILE FROM PFILE='/tmp/pfile_bak.ora'; -- 需重启
SQL> SELECT name, value, isspecified FROM v$spparameter WHERE isspecified='TRUE';
6.2 修改参数
SQL> ALTER SYSTEM SET sga_target=8G SCOPE=BOTH; -- 内存 + SPFILE
SQL> ALTER SYSTEM SET processes=1000 SCOPE=SPFILE; -- 只写文件,重启生效
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=500G SCOPE=BOTH;
SQL> ALTER SYSTEM RESET open_cursors SCOPE=BOTH;
SQL> ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI:SS';
| SCOPE | 效果 |
|---|---|
MEMORY |
只改内存,重启丢失 |
SPFILE |
只改文件,重启生效(静态参数必须用这个) |
BOTH |
两者都改(默认) |
SQL> SELECT name, value, isdefault FROM v$parameter WHERE name IN
('sga_target','pga_aggregate_target','processes','sessions','open_cursors',
'db_block_size','compatible','undo_tablespace','db_recovery_file_dest_size');
注意:
compatible、db_block_size、db_name等属于静态参数,只能SCOPE=SPFILE并重启。SGA_TARGET在 AMM 开启时与MEMORY_TARGET不能同时设置。
6.3 内存管理三种模式
-- 1) AMM(自动内存管理,11g 起)
SQL> ALTER SYSTEM SET memory_target=12G SCOPE=SPFILE;
SQL> ALTER SYSTEM SET memory_max_target=12G SCOPE=SPFILE;
-- 需重启,且需 /dev/shm 足够大
-- 2) ASMM(自动共享内存管理,当前主流)
SQL> ALTER SYSTEM SET sga_target=8G SCOPE=BOTH;
SQL> ALTER SYSTEM SET pga_aggregate_target=4G SCOPE=BOTH;
SQL> ALTER SYSTEM SET memory_target=0 SCOPE=SPFILE;
-- 3) 手工管理(一般不用)
SQL> ALTER SYSTEM SET sga_max_size=8G SCOPE=SPFILE;
SQL> SELECT component, current_size/1024/1024 AS mb FROM v$sga_dynamic_components;
SQL> SELECT name, value/1024/1024 AS mb FROM v$pgastat WHERE name='aggregate PGA target parameter';
6.4 关键参数基线
| 参数 | 建议 | 说明 |
|---|---|---|
sga_target / sga_max_size |
物理内存 50%~60% | 与 PGA 合计不超 80% |
pga_aggregate_target |
物理内存 20%~25% | 排序、哈希、并行用 |
processes |
按连接数 ×1.2 | 改完需重启,sessions 自动推导 |
open_cursors |
500~1000 | 太小报 ORA-01000 |
db_recovery_file_dest_size |
按备份量 | 满了会导致归档失败、库挂起 |
undo_tablespace |
UNDOTBS1 | |
undo_retention |
900~10800 | 支撑闪回查询 |
sga_target 与 memory_target |
二选一 | 同时设会报错 |
compatible |
与版本一致 | 升级后不要急着改,影响降级能力 |
optimizer_mode |
ALL_ROWS |
默认即可 |
cursor_sharing |
EXACT |
不建议改 FORCE |
deferred_segment_creation |
FALSE(12c+ 建议) |
避免空表不占空间导致的统计问题 |
7. 多租户:CDB 与 PDB
12c 之后的核心架构变化:一个 CDB(容器数据库)下挂多个 PDB(可插拔数据库),运维必须明确"当前在哪个容器里"。
7.1 基本概念
| 术语 | 含义 |
|---|---|
| CDB$ROOT | 根容器,存放公共用户与元数据 |
| PDB$SEED | 模板,建 PDB 时复制它 |
| PDB | 业务库,应用连的是 PDB |
| Common User | C## 前缀,CDB 内全局用户 |
| Local User | 只在某个 PDB 内存在 |
7.2 切换容器
SQL> SHOW CON_NAME;
SQL> SELECT sys_context('USERENV','CON_NAME') FROM dual;
SQL> ALTER SESSION SET CONTAINER = ORCLPDB1;
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;
# 直接连到 PDB
sqlplus system/pass@ORCLPDB1
7.3 PDB 生命周期
-- 查看
SQL> SELECT con_id, name, open_mode, restricted FROM v$pdbs;
SQL> SELECT pdb_name, status FROM cdb_pdbs;
-- 创建(从种子克隆)
SQL> CREATE PLUGGABLE DATABASE apppdb ADMIN USER appadmin IDENTIFIED BY 'App#2026'
FILE_NAME_CONVERT=('/opt/oracle/oradata/ORCLCDB/pdbseed/','/opt/oracle/oradata/ORCLCDB/apppdb/');
-- 打开 / 关闭
SQL> ALTER PLUGGABLE DATABASE apppdb OPEN;
SQL> ALTER PLUGGABLE DATABASE apppdb OPEN READ ONLY;
SQL> ALTER PLUGGABLE DATABASE apppdb CLOSE IMMEDIATE;
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
-- 保存打开状态,重启后自动打开
SQL> ALTER PLUGGABLE DATABASE apppdb SAVE STATE;
SQL> ALTER PLUGGABLE DATABASE apppdb DISCARD STATE;
-- 删除(必须先关)
SQL> ALTER PLUGGABLE DATABASE apppdb CLOSE IMMEDIATE;
SQL> DROP PLUGGABLE DATABASE apppdb INCLUDING DATAFILES;
-- 克隆 PDB
SQL> CREATE PLUGGABLE DATABASE apppdb2 FROM apppdb
FILE_NAME_CONVERT=('/oradata/apppdb/','/oradata/apppdb2/');
-- 插拔:拔出到 XML
SQL> ALTER PLUGGABLE DATABASE apppdb UNPLUG INTO '/tmp/apppdb.xml';
-- 插入到另一个 CDB
SQL> CREATE PLUGGABLE DATABASE apppdb USING '/tmp/apppdb.xml'
COPY FILE_NAME_CONVERT=('/old/path/','/new/path/');
7.4 服务与连接
SQL> SELECT name, pdb FROM v$services ORDER BY name;
SQL> ALTER SESSION SET CONTAINER=apppdb;
SQL> SHOW PARAMETER service_names;
注意:应用连接串必须写 PDB 的 service_name,不是 SID。连 CDB$ROOT 的应用会看不到业务表,这是 12c 之后最常见的"表不存在"原因。
8. 用户、权限与表空间配额
8.1 创建用户
-- 在 PDB 内建本地用户
SQL> ALTER SESSION SET CONTAINER = apppdb;
SQL> CREATE USER app IDENTIFIED BY 'App#Str0ng2026'
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON app_data
PROFILE DEFAULT;
-- 公共用户(CDB 级,必须以 C## 开头)
SQL> CREATE USER c##dba IDENTIFIED BY 'Dba#2026' CONTAINER=ALL;
SQL> GRANT DBA TO c##dba CONTAINER=ALL;
-- 修改
SQL> ALTER USER app IDENTIFIED BY 'New#2026';
SQL> ALTER USER app QUOTA 10G ON app_data;
SQL> ALTER USER app ACCOUNT LOCK;
SQL> ALTER USER app ACCOUNT UNLOCK;
SQL> ALTER USER app DEFAULT TABLESPACE app_data;
-- 删除
SQL> DROP USER app CASCADE; -- 危险,连带删除所有对象
8.2 权限授予
-- 系统权限
SQL> GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SEQUENCE TO app;
SQL> GRANT CREATE PROCEDURE, CREATE TRIGGER TO app;
SQL> GRANT UNLIMITED TABLESPACE TO app; -- 慎用,绕过配额
SQL> GRANT SELECT ANY TABLE TO app; -- 高危,可读全库
SQL> GRANT DBA TO app; -- 极高危
-- 对象权限
SQL> GRANT SELECT, INSERT, UPDATE, DELETE ON app.orders TO report;
SQL> GRANT SELECT ON app.v_orders TO report;
SQL> GRANT EXECUTE ON app.p_calc TO app;
-- 角色
SQL> CREATE ROLE role_read;
SQL> GRANT SELECT ON app.orders TO role_read;
SQL> GRANT role_read TO report;
-- 查看
SQL> SELECT * FROM dba_sys_privs WHERE grantee='APP';
SQL> SELECT * FROM dba_tab_privs WHERE grantee='APP';
SQL> SELECT * FROM dba_role_privs WHERE grantee='APP';
SQL> SELECT * FROM session_privs; -- 当前会话拥有的权限
8.3 PROFILE 与密码策略
SQL> CREATE PROFILE app_profile LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 90
PASSWORD_REUSE_MAX 5
PASSWORD_GRACE_TIME 7
SESSIONS_PER_USER 50
IDLE_TIME 60
CONNECT_TIME UNLIMITED;
SQL> ALTER USER app PROFILE app_profile;
SQL> SELECT username, profile, account_status, expiry_date FROM dba_users;
SQL> SELECT * FROM dba_profiles WHERE profile='APP_PROFILE' ORDER BY resource_name;
注意:
FAILED_LOGIN_ATTEMPTS触发后账号会变成LOCKED(TIMED),需要ALTER USER app ACCOUNT UNLOCK;。默认 PROFILE 的PASSWORD_LIFE_TIME在 11g 是 180 天,很多老系统突然"密码过期"就是这个。
8.4 表空间配额
SQL> SELECT username, tablespace_name, bytes/1024/1024 AS mb, max_bytes/1024/1024 AS max_mb
FROM dba_ts_quotas WHERE username='APP';
SQL> ALTER USER app QUOTA 20G ON app_data;
SQL> ALTER USER app QUOTA UNLIMITED ON app_data;
-- 用户对象占用
SQL> SELECT segment_type, SUM(bytes)/1024/1024 AS mb
FROM dba_segments WHERE owner='APP' GROUP BY segment_type;
9. 表空间与数据文件
9.1 表空间类型
| 类型 | 说明 |
|---|---|
| 永久表空间 | 存表、索引(app_data) |
| UNDO 表空间 | 回滚、一致性读、闪回 |
| TEMP 表空间 | 排序、临时表 |
| 大文件表空间(BIGFILE) | 单文件最大 32TB,简化管理 |
9.2 常用操作
-- 创建永久表空间
SQL> CREATE TABLESPACE app_data
DATAFILE '/opt/oracle/oradata/ORCLCDB/apppdb/app_data01.dbf'
SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 32G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
-- 加数据文件
SQL> ALTER TABLESPACE app_data ADD DATAFILE
'/opt/oracle/oradata/ORCLCDB/apppdb/app_data02.dbf' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 32G;
-- 扩展现有文件
SQL> ALTER DATABASE DATAFILE '/opt/oracle/oradata/ORCLCDB/apppdb/app_data01.dbf' RESIZE 4G;
-- 改自动扩展
SQL> ALTER DATABASE DATAFILE '...' AUTOEXTEND ON NEXT 200M MAXSIZE 32G;
-- 创建 TEMP
SQL> CREATE TEMPORARY TABLESPACE temp2 TEMPFILE '...' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 16G;
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
-- 创建 UNDO
SQL> CREATE UNDO TABLESPACE undotbs2 DATAFILE '...' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 16G;
SQL> ALTER SYSTEM SET undo_tablespace='UNDOTBS2' SCOPE=BOTH;
-- 删除(永久表空间必须先空)
SQL> DROP TABLESPACE app_data INCLUDING CONTENTS AND DATAFILES; -- 危险
SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;
9.3 使用率查询
-- 表空间使用率(含 AUTOEXTEND 后的极限)
SELECT t.tablespace_name,
ROUND(t.used_space*t.block_size/1024/1024/1024, 2) AS used_gb,
ROUND(t.tablespace_size*t.block_size/1024/1024/1024, 2) AS total_gb,
ROUND(t.used_percent, 2) AS used_pct
FROM dba_tablespace_usage_metrics t
ORDER BY t.used_percent DESC;
-- 数据文件与自动扩展
SELECT tablespace_name, file_name,
ROUND(bytes/1024/1024/1024,2) AS size_gb,
autoextensible,
ROUND(maxbytes/1024/1024/1024,2) AS max_gb
FROM dba_data_files ORDER BY tablespace_name, file_name;
-- 临时表空间
SELECT tablespace_name, ROUND(bytes_used/1024/1024,1) AS used_mb,
ROUND(bytes_free/1024/1024,1) AS free_mb
FROM v$temp_space_header;
告警阈值:永久表空间 > 80% 开始关注,> 90% 立即处理。注意
used_percent是基于当前文件大小算的,若开启了AUTOEXTEND且MAXSIZE很大,实际风险要看MAXSIZE与磁盘余量。
9.4 段与碎片
-- 最大的段
SELECT owner, segment_name, segment_type,
ROUND(bytes/1024/1024/1024,2) AS gb
FROM dba_segments
ORDER BY bytes DESC FETCH FIRST 20 ROWS ONLY;
-- 表空间碎片(空闲空间不连续)
SELECT tablespace_name, count(*) AS free_chunks,
ROUND(SUM(bytes)/1024/1024,1) AS free_mb,
ROUND(MAX(bytes)/1024/1024,1) AS largest_mb
FROM dba_free_space GROUP BY tablespace_name;
-- 表实际占用 vs 高水位
SELECT segment_name, ROUND(bytes/1024/1024,1) AS mb, blocks
FROM dba_segments WHERE segment_name='ORDERS';
-- 收缩(10g+ 支持 ASSM 表空间在线收缩)
SQL> ALTER TABLE app.orders ENABLE ROW MOVEMENT;
SQL> ALTER TABLE app.orders SHRINK SPACE COMPACT;
SQL> ALTER TABLE app.orders SHRINK SPACE;
-- 或 MOVE 重建(会失效索引,需 rebuild)
SQL> ALTER TABLE app.orders MOVE TABLESPACE app_data;
SQL> ALTER INDEX app.idx_orders REBUILD ONLINE;
10. 对象日常操作
10.1 表
SQL> CREATE TABLE app.orders (
id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
user_id NUMBER NOT NULL,
amount NUMBER(12,2) DEFAULT 0 NOT NULL,
status NUMBER(2) DEFAULT 0 NOT NULL,
created_at TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL
) TABLESPACE app_data;
SQL> CREATE INDEX app.idx_orders_user ON app.orders(user_id, created_at) TABLESPACE app_idx ONLINE;
SQL> ALTER TABLE app.orders ADD (remark VARCHAR2(200));
SQL> ALTER TABLE app.orders MODIFY (amount NUMBER(14,2));
SQL> ALTER TABLE app.orders RENAME COLUMN remark TO note;
SQL> ALTER TABLE app.orders DROP COLUMN note;
SQL> TRUNCATE TABLE app.orders; -- 危险,不可回滚
SQL> DROP TABLE app.orders PURGE; -- PURGE 不进回收站
SQL> FLASHBACK TABLE app.orders TO BEFORE DROP; -- 从回收站恢复(未 PURGE 时)
SQL> SELECT * FROM user_recyclebin;
SQL> PURGE RECYCLEBIN;
重要:
DROP TABLE默认只是移入回收站(占用空间不释放),必须PURGE或DROP ... PURGE才真正删。但TRUNCATE不可闪回(除非有备份)。
10.2 分区表
SQL> CREATE TABLE app.logs (
id NUMBER, created_at DATE, msg VARCHAR2(4000)
) PARTITION BY RANGE (created_at) (
PARTITION p202610 VALUES LESS THAN (TO_DATE('2026-11-01','YYYY-MM-DD')),
PARTITION p202611 VALUES LESS THAN (TO_DATE('2026-12-01','YYYY-MM-DD')),
PARTITION pmax VALUES LESS THAN (MAXVALUE)
);
-- 增删分区
SQL> ALTER TABLE app.logs ADD PARTITION p202612 VALUES LESS THAN (TO_DATE('2027-01-01','YYYY-MM-DD'));
SQL> ALTER TABLE app.logs DROP PARTITION p202610 UPDATE GLOBAL INDEXES;
SQL> ALTER TABLE app.logs TRUNCATE PARTITION p202610 UPDATE GLOBAL INDEXES;
-- 分区交换(归档常用,秒级)
SQL> ALTER TABLE app.logs EXCHANGE PARTITION p202610 WITH TABLE app.logs_202610 INCLUDING INDEXES;
-- 查看分区
SQL> SELECT partition_name, high_value, num_rows FROM user_tab_partitions WHERE table_name='LOGS';
注意:
DROP/TRUNCATE PARTITION不加UPDATE GLOBAL INDEXES会让全局索引失效(UNUSABLE),必须随后ALTER INDEX ... REBUILD。这是分区表运维最常见的坑。
10.3 统计信息
-- 收集(推荐用 DBMS_STATS,不要用 ANALYZE)
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'APP', tabname => 'ORDERS',
cascade => TRUE, degree => 4,
method_opt => 'FOR ALL COLUMNS SIZE AUTO');
END;
/
-- 收集整个 schema
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'APP', cascade => TRUE, degree => 4);
END;
/
-- 查看统计信息时间
SELECT table_name, last_analyzed, num_rows, stale_stats
FROM user_tab_statistics WHERE table_name='ORDERS';
-- 锁定统计信息(防止变化)
BEGIN DBMS_STATS.LOCK_TABLE_STATS('APP','ORDERS'); END;
/
11. 归档模式与日志
11.1 归档模式
SQL> ARCHIVE LOG LIST;
SQL> SELECT log_mode FROM v$database;
-- 开启归档(需 MOUNT)
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
-- 归档路径与空间
SQL> SHOW PARAMETER db_recovery_file_dest;
SQL> SHOW PARAMETER db_recovery_file_dest_size;
SQL> SELECT * FROM v$recovery_file_dest;
SQL> SELECT * FROM v$flash_recovery_area_usage;
致命点:
db_recovery_file_dest_size满后归档写不进去,数据库会挂起(所有 DML 卡住)。必须监控v$recovery_file_dest.space_used_percent,超过 80% 就清理或扩容。
11.2 redo 日志组
SQL> SELECT group#, thread#, sequence#, bytes/1024/1024 AS mb, members, status, archived
FROM v$log;
SQL> SELECT group#, member, status FROM v$logfile ORDER BY group#;
-- 加组 / 加成员(多路复用,生产必备)
SQL> ALTER DATABASE ADD LOGFILE GROUP 4 ('/oradata/redo04a.log','/oradata2/redo04b.log') SIZE 512M;
SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oradata2/redo01b.log' TO GROUP 1;
-- 删除组(必须先 INACTIVE)
SQL> ALTER DATABASE DROP LOGFILE GROUP 4;
-- 手工切换与检查点
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> ALTER SYSTEM CHECKPOINT;
原则:至少 3 组、每组至少 2 个成员(放不同物理盘)。组太少会导致频繁 checkpoint,组太小会导致
checkpoint not complete等待。
11.3 日志切换频率检查
-- 每小时切换次数,超过 6 次/小时要考虑加大 redo
SELECT TO_CHAR(first_time,'YYYY-MM-DD HH24') AS hour, COUNT(*) AS switches
FROM v$log_history
WHERE first_time > SYSDATE - 7
GROUP BY TO_CHAR(first_time,'YYYY-MM-DD HH24')
ORDER BY 1;
12. RMAN 备份与恢复
12.1 准备工作
# 建备份目录与恢复目录(可选)
mkdir -p /backup/rman
-- 归档目标与保留策略
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/cf_%F';
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO COMPRESSED BACKUPSET;
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/rman/%U';
-- 快速恢复区大小
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=500G SCOPE=BOTH;
12.2 全备
rman target /
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE; -- 差异增量
RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE; -- 累积增量
RMAN> BACKUP DATAFILE 4;
RMAN> BACKUP TABLESPACE app_data;
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT; -- 备完删归档,释放空间
RMAN> BACKUP VALIDATE DATABASE; -- 只校验不写备份
-- 查看备份
RMAN> LIST BACKUP SUMMARY;
RMAN> LIST BACKUP OF DATABASE;
RMAN> REPORT OBSOLETE;
RMAN> REPORT NEED BACKUP;
-- 交叉校验与清理
RMAN> CROSSCHECK BACKUP;
RMAN> DELETE OBSOLETE;
RMAN> DELETE EXPIRED BACKUP;
12.3 恢复
-- 完全恢复(数据文件损坏,有归档)
RMAN> RESTORE DATAFILE 4;
RMAN> RECOVER DATAFILE 4;
RMAN> ALTER DATABASE OPEN;
-- 整库恢复
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;
-- 需要 resetlogs 时
RMAN> ALTER DATABASE OPEN RESETLOGS;
12.4 时间点恢复(PITR)
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
RMAN> RUN {
SET UNTIL TIME "TO_DATE('2026-11-05 10:15:00','YYYY-MM-DD HH24:MI:SS')";
RESTORE DATABASE;
RECOVER DATABASE;
}
RMAN> ALTER DATABASE OPEN RESETLOGS;
注意:
OPEN RESETLOGS之后原来的归档与备份链断裂,必须立即做一次全备。PITR 前建议先RESTORE ... PREVIEW确认所需备份都在。
12.5 控制文件与 SPFILE 恢复
-- 控制文件全丢的恢复流程
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;
RMAN> ALTER DATABASE MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;
-- SPFILE 丢失
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE SPFILE FROM AUTOBACKUP;
RMAN> STARTUP FORCE;
12.6 备份脚本模板
#!/usr/bin/env bash
# 每日 01:00 全备 + 归档,保留 14 天
export ORACLE_SID=ORCLCDB
export ORACLE_HOME=/opt/oracle/product/26ai/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
LOG=/backup/rman/full_$(date +%F).log
rman target / log=$LOG <<'EOF'
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG DELETE INPUT;
DELETE NOPROMPT OBSOLETE;
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
EOF
grep -i -E 'error|fail' $LOG && echo "BACKUP FAILED" || echo "BACKUP OK"
13. Data Pump 逻辑备份
13.1 目录对象
SQL> CREATE OR REPLACE DIRECTORY dpump_dir AS '/backup/dpump';
SQL> GRANT READ, WRITE ON DIRECTORY dpump_dir TO system;
SQL> SELECT * FROM dba_directories;
mkdir -p /backup/dpump && chown oracle:oinstall /backup/dpump
13.2 导出
# 整库(CDB 用 full=y 需在 CDB 内执行)
expdp system/pass@ORCLCDB DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp \
FULL=Y PARALLEL=4 COMPRESSION=ALL LOGFILE=full_exp.log
# 按 schema
expdp system/pass@ORCLPDB1 DIRECTORY=dpump_dir DUMPFILE=app_%U.dmp \
SCHEMAS=APP PARALLEL=4 COMPRESSION=ALL LOGFILE=app_exp.log
# 按表
expdp system/pass@ORCLPDB1 DIRECTORY=dpump_dir DUMPFILE=orders.dmp \
TABLES=APP.ORDERS LOGFILE=orders_exp.log
# 只导结构 / 只导数据
expdp ... CONTENT=METADATA_ONLY
expdp ... CONTENT=DATA_ONLY
# 按查询条件导出(11g+)
expdp ... TABLES=APP.ORDERS QUERY="WHERE created_at >= DATE '2026-01-01'"
13.3 导入
# 导入到目标 schema
impdp system/pass@ORCLPDB1 DIRECTORY=dpump_dir DUMPFILE=app_%U.dmp \
REMAP_SCHEMA=APP:APP_NEW REMAP_TABLESPACE=app_data:app_data_new \
PARALLEL=4 LOGFILE=app_imp.log
# 只导入元数据,先看 DDL
impdp ... CONTENT=METADATA_ONLY SQLFILE=ddl.sql
# 表已存在时追加数据
impdp ... TABLE_EXISTS_ACTION=APPEND
# 忽略错误继续
impdp ... IGNORE=Y
注意:
impdp默认TABLE_EXISTS_ACTION=SKIP,表已存在会静默跳过,看起来"导入了但没数据"。覆盖要用REPLACE(会 DROP 重建)。
13.4 监控与中断处理
SQL> SELECT job_name, operation, job_mode, state FROM dba_datapump_jobs;
SQL> SELECT * FROM dba_datapump_sessions;
# 交互模式(Ctrl+C 进入 export> 提示符)
Export> STATUS
Export> KILL_JOB
Export> CONTINUE_CLIENT
残留任务:Data Pump 任务异常终止会留下 master table(
SYS_IMPORT_*/SYS_EXPORT_*),需DROP TABLE ... PURGE清理,否则同名任务无法重建。
14. Data Guard 与 ADG
14.1 角色查询
SQL> SELECT database_role, open_mode, protection_mode, switchover_status FROM v$database;
-- 备库
SQL> SELECT process, status, sequence#, thread# FROM v$managed_standby;
SQL> SELECT * FROM v$dataguard_stats;
SQL> SELECT name, value, unit, time_computed FROM v$dataguard_stats WHERE name LIKE '%lag%';
14.2 日志传输
-- 主库
SQL> SELECT dest_id, status, destination, error FROM v$archive_dest WHERE status <> 'INACTIVE';
SQL> SELECT dest_id, sequence#, applied, error FROM v$archive_dest_status;
-- 备库应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
14.3 切换与故障转移
-- Switchover(计划内,无数据丢失)
-- 主库
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
-- 原备库
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
SQL> ALTER DATABASE OPEN;
-- Failover(主库不可用,可能丢数据)
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
SQL> ALTER DATABASE OPEN;
注意:Failover 后原主库不能直接回切,必须重建为备库(
RMAN DUPLICATE或dbms_rolling)。这是 DG 运维最容易低估的成本。
15. 日志体系与告警
15.1 诊断文件位置
SQL> SELECT * FROM v$diag_info;
| 名称 | 典型路径 |
|---|---|
| Diag Trace | $ORACLE_BASE/diag/rdbms/<db>/<sid>/trace |
| Diag Alert | 同上,alert_<sid>.log |
| Diag Incident | 同上,incident/ |
| Diag Cdump | 同上,cdump/ |
# alert log(11g 之后推荐用 adrci 或 XML 版)
tail -100 $ORACLE_BASE/diag/rdbms/orclcdb/ORCLCDB/trace/alert_ORCLCDB.log
# adrci 工具
adrci
adrci> SHOW HOMES
adrci> SET HOME diag/rdbms/orclcdb/ORCLCDB
adrci> SHOW ALERT -TAIL 50
adrci> SHOW INCIDENT
adrci> IPS GENERATE PACKAGE IN /tmp
15.2 关键日志项
grep -i -E 'ORA-|error|fail' alert_ORCLCDB.log | tail -40
grep -i 'ORA-01555' alert_ORCLCDB.log
grep -i 'ORA-00257' alert_ORCLCDB.log # 归档区满,最常见
grep -i 'checkpoint not complete' alert_ORCLCDB.log
grep -i 'Tablespace' alert_ORCLCDB.log | grep -i 'full'
15.3 监听日志
tail -100 $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log
lsnrctl status
lsnrctl services
15.4 清理日志
# 清理 trace 与 incident(保留 7 天)
adrci
adrci> SET HOME diag/rdbms/orclcdb/ORCLCDB
adrci> PURGE -AGE 10080 -TYPE TRACE
adrci> PURGE -AGE 10080 -TYPE INCIDENT
adrci> SHOW SPACEUSAGE
# 监听日志
adrci> SET HOME diag/tnslsnr/$(hostname -s)/listener
adrci> PURGE -AGE 10080 -TYPE TRACE
16. 性能诊断:AWR / ASH / 锁
16.1 一眼看现状
SQL> SELECT instance_name, status, startup_time FROM v$instance;
SQL> SELECT name, value FROM v$sysstat WHERE name IN
('session logical reads','physical reads','physical writes','user commits','user rollbacks','parse count (total)','parse count (hard)');
SQL> SELECT metric_name, value FROM v$sysmetric
WHERE metric_name IN ('Average Active Sessions','Database CPU Time Ratio','Executions Per Sec','User Transaction Per Sec')
AND group_id=2;
-- 当前会话
SQL> SELECT sid, serial#, username, status, machine, program, sql_id, event, wait_class, seconds_in_wait
FROM v$session WHERE type='USER' AND status='ACTIVE' ORDER BY seconds_in_wait DESC;
-- 会话数按用户
SQL> SELECT username, COUNT(*) FROM v$session WHERE type='USER' GROUP BY username ORDER BY 2 DESC;
16.2 AWR 报告
-- 快照设置(默认 1 小时一次,保留 8 天)
SQL> SELECT * FROM dba_hist_wr_control;
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 30, retention => 20160);
-- 手工快照
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
-- 生成报告(交互式)
SQL> @?/rdbms/admin/awrrpt.sql
-- 快照列表
SELECT snap_id, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 20 ROWS ONLY;
-- 直接生成指定区间报告(RAC 或脚本化更方便)
SELECT output FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(
(SELECT dbid FROM v$database), 1, 1001, 1002));
AWR 必看的五个部分:
- Load Profile:每秒逻辑读、事务数、硬解析比例(
Hard Parses / Executes> 2% 要查绑定变量)。 - Top 10 Foreground Events:等待事件占比,
DB CPU之外的第一名通常是瓶颈。 - SQL ordered by Elapsed Time:总耗时 TOP SQL。
- Instance Efficiency:
Buffer Hit %应 > 95%,Library Hit %应 > 99%。 - Segments by Physical Reads:热点表/索引。
16.3 ASH(会话级历史)
-- 最近 30 分钟活跃会话分布
SELECT session_state, event, COUNT(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSTIMESTAMP - INTERVAL '30' MINUTE
GROUP BY session_state, event
ORDER BY samples DESC FETCH FIRST 20 ROWS ONLY;
-- 按 SQL 聚合
SELECT sql_id, COUNT(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSTIMESTAMP - INTERVAL '30' MINUTE
GROUP BY sql_id ORDER BY samples DESC FETCH FIRST 10 ROWS ONLY;
16.4 SQL 诊断
-- 按 SQL_ID 查执行统计
SELECT sql_id, plan_hash_value, executions, elapsed_time/1e6 AS elapsed_s,
cpu_time/1e6 AS cpu_s, buffer_gets, disk_reads, rows_processed, sql_text
FROM v$sql WHERE sql_id='&sqlid';
-- 历史执行计划变化
SELECT sql_id, plan_hash_value, timestamp, executions, elapsed_time/1e6 AS sec
FROM dba_hist_sqlstat WHERE sql_id='&sqlid' ORDER BY timestamp DESC FETCH FIRST 20 ROWS ONLY;
-- 执行计划
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sqlid', 0, 'ALLSTATS LAST'));
-- 找高负载 SQL(按总耗时)
SELECT sql_id, executions, ROUND(elapsed_time/1e6,1) AS total_sec,
ROUND(elapsed_time/executions/1000,1) AS avg_ms, SUBSTR(sql_text,1,80) AS sql
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC FETCH FIRST 20 ROWS ONLY;
-- 找硬解析多的 SQL(未用绑定变量)
SELECT substr(sql_text,1,60) AS sql, COUNT(*) AS versions
FROM v$sql GROUP BY substr(sql_text,1,60) HAVING COUNT(*) > 20 ORDER BY 2 DESC;
-- 清共享池中的某条 SQL(谨慎)
SQL> EXEC DBMS_SHARED_POOL.PURGE('0000000A1B2C3D4E,1234567890', 'C');
16.5 锁与阻塞
-- 阻塞关系(10g+)
SELECT blocking_session, sid, serial#, username, event, seconds_in_wait, sql_id
FROM v$session
WHERE blocking_session IS NOT NULL
ORDER BY seconds_in_wait DESC;
-- 阻塞树
SELECT LEVEL, sid, serial#, username, event, blocking_session, sql_id
FROM v$session
WHERE blocking_session IS NOT NULL
START WITH blocking_session IS NULL AND sid IN (SELECT blocking_session FROM v$session WHERE blocking_session IS NOT NULL)
CONNECT BY PRIOR sid = blocking_session;
-- 锁明细
SELECT s.sid, s.serial#, s.username, s.osuser, l.type, l.lmode, l.request, l.id1, l.id2,
o.object_name, s.status
FROM v$lock l
JOIN v$session s ON s.sid = l.sid
LEFT JOIN dba_objects o ON o.object_id = l.id1
WHERE l.type IN ('TM','TX')
ORDER BY l.sid;
-- 被锁对象
SELECT object_name, object_type, session_id, oracle_username, locked_mode
FROM v$locked_object lo JOIN dba_objects o ON o.object_id = lo.object_id;
-- 终止会话(先查 serial#,RAC 需 INST_ID)
SQL> ALTER SYSTEM KILL SESSION '123,45678' IMMEDIATE;
SQL> ALTER SYSTEM DISCONNECT SESSION '123,45678' IMMEDIATE; -- 更彻底,释放资源
-- RAC
SQL> ALTER SYSTEM KILL SESSION '123,45678,@2' IMMEDIATE;
区别:
KILL SESSION只是标记,等会话自己回滚;DISCONNECT SESSION IMMEDIATE直接断开进程。大事务回滚可能持续数小时,v$session.status会显示KILLED。
16.6 等待事件
-- 当前等待 TOP
SELECT event, wait_class, COUNT(*) AS sessions, SUM(seconds_in_wait) AS total_wait
FROM v$session WHERE state='WAITING' AND type='USER'
GROUP BY event, wait_class ORDER BY sessions DESC;
-- 系统级等待
SELECT event, total_waits, time_waited/100 AS waited_sec, average_wait/100 AS avg_ms
FROM v$system_event
WHERE wait_class <> 'Idle'
ORDER BY time_waited DESC FETCH FIRST 15 ROWS ONLY;
常见等待事件对照:
| 事件 | 含义 | 方向 |
|---|---|---|
db file sequential read |
单块读(索引扫描) | 索引效率、磁盘 IO |
db file scattered read |
多块读(全表扫描) | 缺索引或 db_file_multiblock_read_count |
log file sync |
提交等 LGWR 写盘 | redo 盘性能、提交过于频繁 |
log file switch (checkpoint incomplete) |
redo 组太小或太少 | 加组/加大 redo |
enq: TX - row lock contention |
行锁等待 | 业务逻辑、未提交事务 |
library cache lock/pin |
共享池争用 | 硬解析、DDL 频繁 |
direct path read |
并行或直接路径读 | 并行度、全表扫 |
free buffer waits |
无空闲 buffer | DBWR 慢、buffer cache 不足 |
16.7 服务器层
top -H -p $(pgrep -f ora_pmon | cut -d' ' -f1)
iostat -x 1 5
vmstat 1 5
free -h
SQL> SELECT * FROM v$osstat;
SQL> SELECT * FROM v$sgastat ORDER BY bytes DESC FETCH FIRST 15 ROWS ONLY;
SQL> SELECT name, value/1024/1024 AS mb FROM v$pgastat WHERE name IN
('aggregate PGA target parameter','aggregate PGA auto target','total PGA allocated','over allocation count');
17. 空间与容量管理
17.1 快速盘点
-- 库总大小
SELECT ROUND(SUM(bytes)/1024/1024/1024, 2) AS total_gb FROM dba_data_files;
-- 按表空间
SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024,2) AS gb
FROM dba_data_files GROUP BY tablespace_name ORDER BY 2 DESC;
-- 按 schema
SELECT owner, ROUND(SUM(bytes)/1024/1024/1024,2) AS gb
FROM dba_segments GROUP BY owner ORDER BY 2 DESC FETCH FIRST 15 ROWS ONLY;
-- 按对象
SELECT owner, segment_name, segment_type, ROUND(bytes/1024/1024/1024,2) AS gb
FROM dba_segments ORDER BY bytes DESC FETCH FIRST 20 ROWS ONLY;
17.2 空间告警
-- 表空间 > 80%
SELECT tablespace_name, ROUND(used_percent,1) AS pct
FROM dba_tablespace_usage_metrics WHERE used_percent > 80 ORDER BY 2 DESC;
-- 临时表空间使用
SELECT tablespace_name,
ROUND(SUM(bytes_used)/1024/1024,1) AS used_mb,
ROUND(SUM(bytes_free)/1024/1024,1) AS free_mb
FROM v$temp_space_header GROUP BY tablespace_name;
-- UNDO 使用与最长查询
SELECT BEGIN_TIME, END_TIME, MAX_QUERY_LEN, MAX_CONCURRENCY
FROM v$undostat ORDER BY BEGIN_TIME DESC FETCH FIRST 10 ROWS ONLY;
-- 归档区使用
SELECT * FROM v$recovery_file_dest;
SELECT file_type, percent_space_used, percent_space_reclaimable FROM v$flash_recovery_area_usage;
17.3 空间回收
-- 1) 表收缩
SQL> ALTER TABLE app.big_logs ENABLE ROW MOVEMENT;
SQL> ALTER TABLE app.big_logs SHRINK SPACE COMPACT;
SQL> ALTER TABLE app.big_logs SHRINK SPACE;
-- 2) 索引重建
SQL> ALTER INDEX app.idx_big REBUILD ONLINE TABLESPACE app_idx;
-- 3) 数据文件缩小(必须先确认文件尾部无数据)
SQL> ALTER DATABASE DATAFILE '/oradata/app_data01.dbf' RESIZE 2G;
-- 4) 归档清理
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE EXPIRED ARCHIVELOG ALL;
-- 数据文件可缩小到的最小值
SELECT file_id, file_name,
ROUND((blocks*block_size)/1024/1024,2) AS size_mb,
ROUND((blocks*block_size - NVL(hwm,0)*block_size)/1024/1024,2) AS can_shrink_mb
FROM dba_data_files df
LEFT JOIN (SELECT file_id, MAX(block_id+blocks-1) hwm FROM dba_extents GROUP BY file_id) e
ON df.file_id = e.file_id;
注意:
RESIZE小于高水位会报ORA-03297。先按上面查询算安全值,或用SHRINK SPACE降低高水位后再缩文件。
18. 升级与迁移
18.1 升级路径
11.2 → 12.2 → 19c → 23ai/26ai
规则:
- 不能跨大版本直跳(11g 不能直接升 19c,需经 12.2 或使用
DBMS_PREUP+ 全库导出导入)。 - 升级前必须跑 预检查工具:
-- 19c 起内置
SQL> @?/rdbms/admin/preupgrade.sql
SQL> @?/rdbms/admin/preupgrade_fixups.sql
SQL> @?/rdbms/admin/utluppkg.sql
-- 12c 用 dbupgdiag.sql 或 MOS 的 preupgrade 脚本
# 自动升级工具(19c+)
$ORACLE_HOME/bin/dbupgrade -s ORCLCDB
18.2 就地升级(DBUA / 手工)
# 1) 全备(必须)
rman target / <<'EOF'
BACKUP DATABASE PLUS ARCHIVELOG;
EOF
# 2) 记录基线
sqlplus / as sysdba <<'SQL'
SPOOL /backup/pre_upgrade_info.txt
SELECT * FROM v$version;
SELECT name, value FROM v$parameter WHERE name IN ('compatible','optimizer_features_enable');
SELECT owner, object_type, COUNT(*) FROM dba_objects WHERE status='INVALID' GROUP BY owner, object_type;
SPOOL OFF
SQL
# 3) 停库、切到新 ORACLE_HOME
# 4) STARTUP UPGRADE,跑 catupgrd.sql(传统方式)
# 5) 或直接用 DBUA / dbupgrade 工具
版本差异:12c 起提供了
catupgrd.sql的一键式升级与dbupgrade包装脚本;19c 起推荐dbupgrade或 DBUA。升级后必须检查dba_registry中所有组件状态为VALID,并重编无效对象@?/rdbms/admin/utlrp.sql。
18.3 逻辑迁移(跨平台/跨云)
# 源库导出(全库,含元数据)
expdp system/pass@SRCDB DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp FULL=Y PARALLEL=8 COMPRESSION=ALL
# 目标库导入
impdp system/pass@DSTDB DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp FULL=Y PARALLEL=8
# 跨版本/跨 endian 平台用 Data Pump + 目标端重建,不要用可传输表空间
18.4 升级后检查
SQL> SELECT comp_name, version, status FROM dba_registry; -- 全 VALID
SQL> SELECT COUNT(*) FROM dba_objects WHERE status='INVALID'; -- 应为 0
SQL> SELECT * FROM utl_recomp_errors; -- 空
SQL> SELECT name, open_mode FROM v$database;
SQL> SELECT * FROM v$timezone_file; -- 时区版本
SQL> SELECT * FROM registry$history ORDER BY action_time DESC FETCH FIRST 5 ROWS ONLY;
# 无效对象重编译
sqlplus / as sysdba @?/rdbms/admin/utlrp.sql
19. 高频故障速查
19.1 连不上
| 错误 | 原因 | 处理 |
|---|---|---|
ORA-12541: TNS:no listener |
监听未起 / 端口不通 | lsnrctl start、查防火墙 |
ORA-12514: TNS:listener does not currently know of service |
服务名错或未注册 | lsnrctl status 看服务、ALTER SYSTEM REGISTER |
ORA-12154: TNS:could not resolve the connect identifier |
别名解析失败 | 查 TNS_ADMIN、tnsnames.ora |
ORA-12545: Connect failed because target host or object does not exist |
主机名解析失败 | 查 /etc/hosts、DNS |
ORA-01017: invalid username/password |
密码错 / 大小写 / 版本认证 | 确认密码、SEC_CASE_SENSITIVE_LOGON |
ORA-28000: the account is locked |
多次登录失败 | ALTER USER ... ACCOUNT UNLOCK |
ORA-28001: the password has expired |
PROFILE 到期 | 改密或改 PROFILE |
ORA-01034: ORACLE not available |
实例未启动 | STARTUP |
ORA-27101: shared memory realm does not exist |
SID 或 ORACLE_HOME 不对 | 检查环境变量 |
# 一分钟定位
echo $ORACLE_SID $ORACLE_HOME
lsnrctl status
ps -ef | grep -E 'pmon|tnslsnr' | grep -v grep
sqlplus -S / as sysdba <<< "SELECT status FROM v\$instance;"
19.2 表空间满
SQL> SELECT tablespace_name, ROUND(used_percent,1) FROM dba_tablespace_usage_metrics;
-- 急救:加数据文件或开自动扩展
SQL> ALTER TABLESPACE app_data ADD DATAFILE '/oradata/app_data03.dbf' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 32G;
SQL> ALTER DATABASE DATAFILE '/oradata/app_data01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 32G;
若报
ORA-01653: unable to extend table,说明表空间确实满了;若报ORA-01654: unable to extend index,是索引所在表空间满。
19.3 归档区满(ORA-00257)
SQL> SELECT * FROM v$recovery_file_dest;
SQL> SELECT * FROM v$flash_recovery_area_usage;
# 1) 先清过期归档(确认已备份)
rman target / <<'EOF'
CROSSCHECK ARCHIVELOG ALL;
DELETE EXPIRED ARCHIVELOG ALL;
DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';
EOF
# 2) 或扩大上限
sqlplus / as sysdba <<'SQL'
ALTER SYSTEM SET db_recovery_file_dest_size=800G SCOPE=BOTH;
SQL
注意:归档区满会导致数据库挂起,所有 DML 等待。恢复后要把
db_recovery_file_dest_size与磁盘余量一起规划,并配归档清理的定时任务。
19.4 会话数/进程数满
SQL> SHOW PARAMETER processes;
SQL> SELECT COUNT(*) FROM v$session;
SQL> SELECT COUNT(*) FROM v$process;
-- 临时清理空闲会话
SELECT sid, serial#, username, machine, last_call_et
FROM v$session WHERE status='INACTIVE' AND last_call_et > 3600 AND username IS NOT NULL;
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
-- 永久调整(需重启)
ALTER SYSTEM SET processes=2000 SCOPE=SPFILE;
-- sessions 会自动按 1.1*processes+5 推导
报错对应:
ORA-00020: maximum number of processes exceeded(进程满)、ORA-12516: TNS:listener could not find available handler(监听找不到可用服务进程,通常也是进程数满)。
19.5 表被锁 / DDL 卡住
SQL> SELECT blocking_session, sid, serial#, username, event, seconds_in_wait, sql_id
FROM v$session WHERE blocking_session IS NOT NULL ORDER BY seconds_in_wait DESC;
-- 找根源会话在做什么
SQL> SELECT sid, sql_id, sql_text FROM v$session s JOIN v$sql q USING (sql_id)
WHERE s.sid = &blocking_sid;
-- 处理根源(优先让它提交/回滚,不要直接杀)
SQL> ALTER SYSTEM KILL SESSION '&sid,&serial' IMMEDIATE;
19.6 数据库挂起(Hang)
SQL> SELECT event, COUNT(*) FROM v$session WHERE state='WAITING' GROUP BY event ORDER BY 2 DESC;
# 生成 hang analyze(MOS 标准动作)
sqlplus / as sysdba
SQL> ORADEBUG SETMYPID
SQL> ORADEBUG DUMP HANGANALYZE 3
# 输出在 trace 目录,或直接连跑三次做对比
-- 系统状态转储(重量级,非必要不用)
SQL> ORADEBUG DUMP SYSTEMSTATE 266
19.7 ORA-01555 快照过旧
SQL> SHOW PARAMETER undo_retention;
SQL> SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024,2) gb FROM dba_data_files
WHERE tablespace_name LIKE 'UNDO%' GROUP BY tablespace_name;
SQL> SELECT MAX(MAXQUERYLEN) FROM v$undostat WHERE BEGIN_TIME > SYSDATE-1;
处理方向:加大 UNDO 表空间、提高 undo_retention、优化跑得久的查询、避免在 UNDO 上开 RETENTION GUARANTEE 之外的不当设置。
19.8 监听异常
lsnrctl status
# TNS-12541 / TNS-12560 → 监听没起
lsnrctl start
# TNS-00511 → 端口被占
ss -lntp | grep 1521
# 监听日志
tail -100 $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log
20. 危险命令与避坑清单
| 命令 | 后果 | 防护 |
|---|---|---|
DROP USER ... CASCADE |
连带删除该用户所有对象 | 先 expdp 备份该 schema |
DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES |
表空间与文件一起消失 | 确认无业务对象、有备份 |
TRUNCATE TABLE |
不可回滚、不可闪回 | 先 CREATE TABLE bak AS SELECT |
DROP TABLE ... PURGE |
跳过回收站,无法 FLASHBACK |
不加 PURGE,留 24h 反悔窗口 |
SHUTDOWN ABORT |
需实例恢复 | 优先 IMMEDIATE |
ALTER SYSTEM KILL SESSION |
大事务回滚可能数小时 | 先查 v$transaction 大小 |
ALTER DATABASE OPEN RESETLOGS |
备份链断裂 | 立即全备 |
_ 开头的隐含参数 |
可能直接损坏数据库 | 除 Oracle Support 指示外不碰 |
ORADEBUG DUMP SYSTEMSTATE |
严重性能冲击、dump 巨大 | 只在 hang 分析时用,事后清理 |
db_recovery_file_dest_size 满 |
数据库挂起 | 监控 + 归档清理任务 |
DELETE FROM t;(无 WHERE) |
全表删、UNDO 暴涨 | 先 SELECT COUNT(*) 确认 |
用 SYS 跑业务 |
误操作影响面最大 | 业务用专属 schema |
20.1 变更前检查清单
# 1) 确认实例与容器
sqlplus -S / as sysdba <<'SQL'
SELECT instance_name, host_name, status FROM v$instance;
SELECT name, open_mode, cdb FROM v$database;
SELECT sys_context('USERENV','CON_NAME') FROM dual;
SQL
# 2) 备份
expdp system/pass@ORCLPDB1 DIRECTORY=dpump_dir DUMPFILE=pre_change.dmp SCHEMAS=APP
# 3) 看对象大小
sqlplus -S system/pass@ORCLPDB1 <<'SQL'
SELECT segment_name, ROUND(bytes/1024/1024) mb FROM dba_segments WHERE owner='APP' ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;
SQL
# 4) 看锁与长事务
sqlplus -S / as sysdba <<'SQL'
SELECT sid, status, event, seconds_in_wait FROM v$session WHERE status='ACTIVE' AND type='USER';
SELECT * FROM v$transaction WHERE used_ublk > 10000;
SQL
# 5) 观察 DG 延迟
sqlplus -S / as sysdba <<'SQL'
SELECT name, value, unit FROM v$dataguard_stats WHERE name LIKE '%lag%';
SQL
21. 附录:巡检脚本与视图速查
21.1 日常巡检脚本
#!/usr/bin/env bash
# Oracle 日常巡检,输出到 /tmp/oracle_health_$(date +%F).txt
export ORACLE_SID=${ORACLE_SID:-ORCLCDB}
export ORACLE_HOME=${ORACLE_HOME:-/opt/oracle/product/26ai/dbhome_1}
export PATH=$ORACLE_HOME/bin:$PATH
OUT=/tmp/oracle_health_$(date +%F).txt
sqlplus -S / as sysdba > $OUT <<'SQL'
SET LINESIZE 220 PAGESIZE 200 FEEDBACK OFF
COL name FOR a40
COL value FOR a50
PROMPT ========== 实例与数据库 ==========
SELECT instance_name, host_name, version, status, TO_CHAR(startup_time,'YYYY-MM-DD HH24:MI') AS startup
FROM v$instance;
SELECT name, dbid, open_mode, log_mode, database_role, cdb FROM v$database;
PROMPT ========== 表空间使用率 ==========
SELECT tablespace_name, ROUND(used_percent,2) AS pct
FROM dba_tablespace_usage_metrics ORDER BY used_percent DESC;
PROMPT ========== 归档区 ==========
SELECT name, ROUND(space_limit/1024/1024/1024,2) AS limit_gb,
ROUND(space_used/1024/1024/1024,2) AS used_gb,
ROUND(space_used/NULLIF(space_limit,0)*100,2) AS pct
FROM v$recovery_file_dest;
PROMPT ========== 会话与进程 ==========
SELECT COUNT(*) AS sessions, (SELECT COUNT(*) FROM v$process) AS processes,
(SELECT value FROM v$parameter WHERE name='processes') AS max_processes
FROM v$session;
PROMPT ========== 活跃会话 TOP ==========
SELECT sid, username, event, wait_class, seconds_in_wait, status
FROM v$session WHERE status='ACTIVE' AND type='USER'
ORDER BY seconds_in_wait DESC FETCH FIRST 10 ROWS ONLY;
PROMPT ========== 阻塞 ==========
SELECT blocking_session, sid, username, event, seconds_in_wait
FROM v$session WHERE blocking_session IS NOT NULL;
PROMPT ========== 无效对象 ==========
SELECT owner, object_type, COUNT(*) FROM dba_objects WHERE status='INVALID'
GROUP BY owner, object_type;
PROMPT ========== 高负载 SQL TOP5 ==========
SELECT sql_id, executions, ROUND(elapsed_time/1e6,1) AS total_sec,
ROUND(elapsed_time/NULLIF(executions,0)/1000,1) AS avg_ms
FROM v$sql WHERE executions > 0 ORDER BY elapsed_time DESC FETCH FIRST 5 ROWS ONLY;
PROMPT ========== 备份状态(近 3 天) ==========
SELECT session_key, input_type, status,
TO_CHAR(start_time,'YYYY-MM-DD HH24:MI') AS start_time,
ROUND(output_bytes/1024/1024/1024,2) AS out_gb
FROM v$rman_backup_job_details
WHERE start_time > SYSDATE - 3 ORDER BY start_time DESC;
PROMPT ========== DG 延迟 ==========
SELECT name, value, unit FROM v$dataguard_stats WHERE name LIKE '%lag%';
SQL
echo "报告已生成:$OUT"
grep -i -E 'ORA-|ERROR' $OUT && echo "存在错误,请检查" || echo "无 ORA- 错误"
21.2 常用视图速查
| 视图 | 用途 |
|---|---|
v$instance |
实例状态、启动时间、版本 |
v$database |
数据库名、打开模式、角色 |
v$session |
会话、等待、阻塞关系 |
v$process |
进程 |
v$sql / v$sqlarea |
共享池中的 SQL 统计 |
v$session_wait / v$system_event |
等待事件 |
v$lock / v$locked_object |
锁 |
v$transaction |
事务与 UNDO 使用 |
v$log / v$logfile / v$log_history |
redo 日志与切换历史 |
v$archive_dest_status |
归档目标状态 |
v$recovery_file_dest |
快速恢复区 |
v$tablespace / dba_data_files |
表空间与文件 |
dba_tablespace_usage_metrics |
表空间使用率 |
dba_segments |
段大小 |
dba_users / dba_profiles |
用户与密码策略 |
dba_registry |
组件版本与状态 |
v$pdbs |
PDB 状态 |
v$active_session_history |
ASH 采样 |
dba_hist_snapshot |
AWR 快照 |
v$rman_backup_job_details |
备份作业历史 |
v$diag_info |
诊断文件路径 |
21.3 关键路径与端口
| 项 | 值 |
|---|---|
| 默认监听端口 | 1521 |
| EM Express 端口 | 5500 |
ORACLE_BASE |
/opt/oracle |
ORACLE_HOME |
/opt/oracle/product/26ai/dbhome_1 |
| 诊断日志 | $ORACLE_BASE/diag/rdbms/<db>/<sid>/trace |
| 监听配置 | $ORACLE_HOME/network/admin/listener.ora |
| 告警日志 | alert_<SID>.log(trace 目录下) |
| 开机自启控制 | /etc/oratab |
| 补丁工具 | $ORACLE_HOME/OPatch/opatch |
附:与工作区其他手册的配合
- 操作系统层见
CentOS-7-10-常规运维指令手册.md/Ubuntu-常用运维指令手册.md - 放行端口:
firewall-cmd --add-port=1521/tcp --permanent - Oracle 对内核参数有硬要求(
shmmax、shmall、sem、nofile),预安装 RPM 会自动配置;手工安装需按官方文档调/etc/sysctl.conf与/etc/security/limits.conf - 与 MySQL/PG 的核心差异:多租户容器概念、必须开归档才能做在线备份与 PITR、RMAN 是唯一可靠的全备方式、
db_recovery_file_dest_size满会导致全库挂起