Oracle 19c 常用运维命令大全
Oracle 19c(长期支持版本 LTS)默认采用 多租户架构(Multitenant):一个 CDB(Container Database,容器数据库)内可挂载多个 PDB(Pluggable Database,可插拔数据库)。日常运维中大量命令需要区分「操作 CDB 根容器」还是「操作某个 PDB」,这是与 11g 最大的差异。
本文按日常运维场景整理 19c 常用命令:环境变量与登录、监听器、实例启停、CDB/PDB 管理、表空间、用户权限、会话排查、数据泵、RMAN 备份等,适合作为案头速查手册。
一、环境变量与登录
Oracle 用户(一般为 oracle)常用环境变量:
bash
# 通常在 ~/.bash_profile 或 /etc/profile 中配置
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
export ORACLE_SID=orcl # CDB 的实例名
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
查看当前环境变量:
bash
echo $ORACLE_HOME
echo $ORACLE_SID
env | grep -i ora
登录方式:
bash
# 以 sysdba 身份本地登录(免密,操作系统认证)
sqlplus / as sysdba
# 先启动空会话再连接
sqlplus /nolog
SQL> conn / as sysdba
# 用户名密码登录本地实例
sqlplus system/password
# 通过网络服务名登录
sqlplus system/password@orclpdb
# 直连 PDB(easy connect 语法:主机:端口/服务名)
sqlplus system/password@//192.168.1.10:1521/orclpdb
二、监听器管理(lsnrctl)
监听器负责接收客户端连接请求,是数据库对外服务的入口,与数据库实例是独立进程,需单独启停。
bash
lsnrctl status # 查看监听器状态、已注册的服务
lsnrctl start # 启动监听器
lsnrctl stop # 停止监听器
lsnrctl reload # 重新加载 listener.ora 配置(不中断现有连接)
lsnrctl services # 查看详细服务注册信息
lsnrctl version # 查看监听器版本
配置文件位置:
bash
$ORACLE_HOME/network/admin/listener.ora # 监听器配置
$ORACLE_HOME/network/admin/tnsnames.ora # 客户端网络服务名配置
测试网络服务名连通性:
bash
tnsping orclpdb
排查「监听正常但连不上库」时,先看
lsnrctl status中服务是否为READY状态;若为BLOCKED说明实例还在 mount 阶段未 open。
三、实例启动与停止
需以 sysdba 身份操作。启动分三个阶段:NOMOUNT(读参数文件、启动实例)→ MOUNT(读控制文件)→ OPEN(打开数据文件,可对外服务)。
sql
-- 完整启动(一步到 OPEN)
startup;
-- 分阶段启动
startup nomount; -- 仅启动实例(用于创建数据库、重建控制文件)
alter database mount; -- 挂载数据库(用于恢复、改归档模式)
alter database open; -- 打开数据库
-- 以只读模式打开
startup mount;
alter database open read only;
-- 强制启动(上次异常关闭后)
startup force;
-- 用指定参数文件启动
startup pfile=/tmp/initorcl.ora;
关闭方式(4 种):
sql
shutdown immediate; -- 【推荐】回滚未提交事务,断开会话,干净关闭
shutdown transactional; -- 等待当前事务完成后关闭
shutdown normal; -- 等待所有会话主动断开(生产慎用,可能挂很久)
shutdown abort; -- 强制立即终止,下次启动需实例恢复(应急才用)
生产环境标准重启:
shutdown immediate;然后startup;。只有immediate挂住无响应时才考虑abort。
四、多租户 CDB / PDB 管理(19c 核心)
查看容器信息
sql
-- 当前所在容器
show con_name;
SELECT SYS_CONTEXT('USERENV','CON_NAME') FROM dual;
-- 查看所有 PDB 及其状态
show pdbs;
SELECT con_id, name, open_mode, restricted FROM v$pdbs;
SELECT pdb_name, status FROM cdb_pdbs;
open_mode 常见值:MOUNTED(未打开)、READ WRITE(正常可用)、READ ONLY、MIGRATE。
容器间切换
sql
-- 从 CDB 根切换到指定 PDB
alter session set container = orclpdb;
-- 切换回根容器 CDB$ROOT
alter session set container = CDB$ROOT;
PDB 启动与关闭
sql
-- 打开单个 PDB
alter pluggable database orclpdb open;
alter pluggable database orclpdb open read only;
-- 打开全部 PDB
alter pluggable database all open;
-- 关闭 PDB
alter pluggable database orclpdb close immediate;
-- 关闭全部
alter pluggable database all close immediate;
-- 在指定 PDB 内部操作时(已 set container 或直连 PDB)
startup; -- 等价于 open
shutdown immediate;
重要 :CDB 重启后 PDB 默认处于
MOUNTED状态,不会自动打开。需配置保存状态,否则每次重启后要手动 open:
sql
-- 保存 PDB 当前打开状态,CDB 重启后自动恢复
alter pluggable database orclpdb save state;
-- 查看已保存的状态
SELECT con_name, state FROM dba_pdb_saved_states;
PDB 创建 / 删除(了解)
sql
-- 从种子 PDB 克隆创建
create pluggable database newpdb admin user pdbadmin identified by password;
-- 删除 PDB(含数据文件)
alter pluggable database newpdb close immediate;
drop pluggable database newpdb including datafiles;
五、数据库状态与信息查询
sql
-- 数据库版本
SELECT * FROM v$version;
SELECT banner_full FROM v$version;
-- 实例状态(status 应为 OPEN,database_status 应为 ACTIVE)
SELECT instance_name, host_name, version, status, database_status,
startup_time FROM v$instance;
-- 数据库基本信息(名称、创建时间、归档模式、open 模式)
SELECT name, dbid, created, log_mode, open_mode, cdb FROM v$database;
-- 是否为多租户 CDB
SELECT name, cdb, con_id FROM v$database;
-- 数据库启动时长
SELECT to_char(startup_time,'YYYY-MM-DD HH24:MI:SS') FROM v$instance;
-- 当前连接的用户与容器
SELECT USER, SYS_CONTEXT('USERENV','CON_NAME') AS container FROM dual;
-- 字符集
SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%';
六、表空间管理
sql
-- 查看所有表空间
SELECT tablespace_name, status, contents FROM dba_tablespaces;
-- 表空间使用率(含使用/剩余/百分比)
SELECT d.tablespace_name,
ROUND(d.total_mb, 2) AS total_mb,
ROUND(d.total_mb - f.free_mb, 2) AS used_mb,
ROUND(f.free_mb, 2) AS free_mb,
ROUND((d.total_mb - f.free_mb) / d.total_mb * 100, 2) AS used_pct
FROM (SELECT tablespace_name, SUM(bytes)/1024/1024 total_mb
FROM dba_data_files GROUP BY tablespace_name) d,
(SELECT tablespace_name, SUM(bytes)/1024/1024 free_mb
FROM dba_free_space GROUP BY tablespace_name) f
WHERE d.tablespace_name = f.tablespace_name
ORDER BY used_pct DESC;
-- 数据文件列表与自动扩展设置
SELECT tablespace_name, file_name, bytes/1024/1024 AS mb,
autoextensible, maxbytes/1024/1024 AS max_mb
FROM dba_data_files;
-- 新增数据文件
ALTER TABLESPACE users
ADD DATAFILE '/u01/app/oracle/oradata/ORCL/users02.dbf'
SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
-- 扩大现有数据文件
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' RESIZE 5G;
-- 创建表空间
CREATE TABLESPACE app_data
DATAFILE '/u01/app/oracle/oradata/ORCL/app_data01.dbf'
SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 20G;
-- 临时表空间使用情况
SELECT tablespace_name, bytes_used/1024/1024 AS used_mb,
bytes_free/1024/1024 AS free_mb
FROM v$temp_space_header;
PDB 有独立的表空间,查询表空间前务必先
alter session set container切到目标 PDB。
七、用户与权限管理
在 19c 多租户下,用户分为:公共用户 C##(在 CDB 全局) 与 本地用户(仅在某个 PDB 内,推荐)。日常业务用户应在 PDB 内创建。
sql
-- 先切到目标 PDB
alter session set container = orclpdb;
-- 创建本地用户
CREATE USER appuser IDENTIFIED BY "your_password"
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON app_data;
-- 授权
GRANT CONNECT, RESOURCE TO appuser;
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO appuser;
GRANT SELECT ON hr.employees TO appuser; -- 单表查询权限
-- 修改密码
ALTER USER appuser IDENTIFIED BY "your_new_password";
-- 锁定 / 解锁
ALTER USER appuser ACCOUNT LOCK;
ALTER USER appuser ACCOUNT UNLOCK;
-- 删除用户(含其所有对象)
DROP USER appuser CASCADE;
-- 密码永不过期(针对 profile)
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
-- 在 CDB 根创建公共用户(用户名必须 C## 开头)
CREATE USER c##dba IDENTIFIED BY password CONTAINER=ALL;
查询用户与权限:
sql
-- 所有用户及状态、创建时间
SELECT username, account_status, created, default_tablespace,
expiry_date FROM dba_users ORDER BY created DESC;
-- 被锁定的账户
SELECT username, account_status FROM dba_users
WHERE account_status != 'OPEN';
-- 某用户拥有的系统权限
SELECT privilege FROM dba_sys_privs WHERE grantee='APPUSER';
-- 某用户拥有的对象权限
SELECT owner, table_name, privilege
FROM dba_tab_privs WHERE grantee='APPUSER';
-- 某用户拥有的角色
SELECT granted_role FROM dba_role_privs WHERE grantee='APPUSER';
八、会话与进程管理
sql
-- 当前会话数与最大会话数
SELECT COUNT(*) AS current_sessions FROM v$session WHERE type='USER';
SELECT resource_name, current_utilization, max_utilization, limit_value
FROM v$resource_limit WHERE resource_name IN ('sessions','processes');
-- 活动会话概览(用户、机器、程序、状态、执行的 SQL)
SELECT s.sid, s.serial#, s.username, s.status, s.machine,
s.program, s.sql_id, s.event
FROM v$session s
WHERE s.type='USER' AND s.username IS NOT NULL
ORDER BY s.status;
-- 查看某会话正在执行的 SQL 全文
SELECT sql_fulltext FROM v$sql
WHERE sql_id = (SELECT sql_id FROM v$session WHERE sid=&sid);
-- 查找长时间运行的 SQL(执行超过 60 秒)
SELECT sid, serial#, opname, target,
ROUND(elapsed_seconds) AS elapsed_s,
ROUND(time_remaining) AS remain_s,
ROUND(sofar/totalwork*100,1) AS pct
FROM v$session_longops
WHERE totalwork > 0 AND sofar != totalwork;
-- 查找阻塞的会话(blocker 阻塞了 waiter)
SELECT blocking_session AS blocker, sid AS waiter, username,
event, seconds_in_wait
FROM v$session WHERE blocking_session IS NOT NULL;
-- 杀会话(先 immediate,杀不掉再 kill -9 对应 OS 进程)
ALTER SYSTEM KILL SESSION '145,28763' IMMEDIATE;
-- 找出会话对应的操作系统进程号(spid),用于 OS 层 kill
SELECT s.sid, s.serial#, p.spid, s.username, s.program
FROM v$session s JOIN v$process p ON s.paddr = p.addr
WHERE s.sid = &sid;
九、数据查询与常用数据字典
Oracle 数据字典视图分三个层级,普通业务用户日常只用前两类,DBA_* 需要 DBA 权限:
| 前缀 | 范围 | 是否需特权 |
|---|---|---|
USER_* |
当前用户自己拥有的对象 | 否 |
ALL_* |
当前用户有权访问的对象(自己的 + 被授权的) | 否 |
DBA_* |
全库所有对象 | 需 DBA / SELECT ANY DICTIONARY |
普通用户登录后查看自己的业务表
以业务用户(非 sysdba)身份登录,最常见的操作就是「看看自己名下有哪些表、表里有多少数据」。
bash
# 直连 PDB 登录(业务用户通常建在某个 PDB 内)
sqlplus appuser/your_password@//192.168.1.10:1521/orclpdb
# 或先配好 tnsnames.ora 后用服务名登录
sqlplus appuser/your_password@orclpdb
sql
-- 我是谁、连在哪个容器
SELECT USER AS current_user,
SYS_CONTEXT('USERENV','CON_NAME') AS container FROM dual;
-- 【核心】查看当前用户拥有的所有业务表
SELECT table_name, num_rows, last_analyzed
FROM user_tables ORDER BY table_name;
-- 只看表名(最简)
SELECT table_name FROM user_tables ORDER BY table_name;
-- 统计自己名下共有多少张表
SELECT COUNT(*) FROM user_tables;
-- 查看某张表的结构
DESC employees;
-- 或用数据字典查字段明细
SELECT column_name, data_type, data_length, nullable
FROM user_tab_columns WHERE table_name='EMPLOYEES'
ORDER BY column_id;
-- 查询表数据(表名默认大写,除非建表时用了双引号)
SELECT * FROM employees WHERE ROWNUM <= 10;
-- 精确统计某表行数
SELECT COUNT(*) FROM employees;
-- 查看自己拥有的索引 / 视图 / 序列
SELECT index_name, table_name, uniqueness FROM user_indexes;
SELECT view_name FROM user_views;
SELECT sequence_name, last_number FROM user_sequences;
-- 查看自己各表占用空间(MB,按大小排序)
SELECT segment_name, segment_type, bytes/1024/1024 AS mb
FROM user_segments WHERE segment_type='TABLE'
ORDER BY bytes DESC;
user_tables.num_rows是上次统计信息收集时 的估算值,可能不准;要精确行数用COUNT(*)。若为空可让 DBA 收集统计:EXEC DBMS_STATS.GATHER_SCHEMA_STATS('APPUSER');
查看被授权访问的其他用户的表
业务用户常需访问其他 schema(如公共维表)授予的表,用 ALL_* 视图:
sql
-- 我能访问的、不属于自己的表(含被别人授权的)
SELECT owner, table_name FROM all_tables
WHERE owner != USER ORDER BY owner, table_name;
-- 我被授予了哪些对象权限(谁的什么表、什么权限)
SELECT owner, table_name, privilege
FROM user_tab_privs_recd ORDER BY owner, table_name;
-- 查询别的 schema 的表(需带 owner 前缀,且已被授权)
SELECT * FROM hr.departments WHERE ROWNUM <= 10;
DBA 视角(需 DBA 权限)
sql
-- 查看某 schema 的表
SELECT owner, table_name, num_rows, last_analyzed
FROM dba_tables WHERE owner='HR';
-- 表结构(字段、类型、是否可空)
SELECT column_name, data_type, data_length, nullable
FROM dba_tab_columns WHERE owner='HR' AND table_name='EMPLOYEES'
ORDER BY column_id;
-- 或直接用 SQL*Plus 命令
DESC hr.employees;
-- 表的记录数(精确)
SELECT COUNT(*) FROM hr.employees;
-- 查看索引
SELECT index_name, table_name, uniqueness, status
FROM dba_indexes WHERE owner='HR' AND table_name='EMPLOYEES';
-- 查看视图、序列、约束
SELECT view_name FROM dba_views WHERE owner='HR';
SELECT sequence_name, last_number FROM dba_sequences WHERE sequence_owner='HR';
SELECT constraint_name, constraint_type, status
FROM dba_constraints WHERE owner='HR' AND table_name='EMPLOYEES';
-- 查表占用空间(段大小 MB)
SELECT segment_name, segment_type, bytes/1024/1024 AS mb
FROM dba_segments WHERE owner='HR'
ORDER BY bytes DESC;
-- 全库最大的 20 个对象
SELECT * FROM (
SELECT owner, segment_name, segment_type, ROUND(bytes/1024/1024) AS mb
FROM dba_segments ORDER BY bytes DESC
) WHERE ROWNUM <= 20;
-- 分页查询(19c 支持 OFFSET FETCH 语法)
SELECT * FROM hr.employees ORDER BY employee_id
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
SQL*Plus 输出格式化(避免结果错乱):
sql
SET LINESIZE 200
SET PAGESIZE 100
SET LONG 10000
COLUMN column_name FORMAT A30
十、参数查询与修改
sql
-- 查看参数(模糊匹配)
SHOW PARAMETER memory;
SHOW PARAMETER processes;
SELECT name, value, isdefault FROM v$parameter WHERE name LIKE '%sga%';
-- 修改参数
-- scope=memory 仅当前生效,重启失效
-- scope=spfile 仅写入参数文件,重启后生效
-- scope=both 立即生效且持久(默认)
ALTER SYSTEM SET processes=1000 SCOPE=SPFILE; -- processes 需重启
ALTER SYSTEM SET sga_target=4G SCOPE=BOTH;
-- 内存相关
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;
SELECT component, current_size/1024/1024 AS mb FROM v$sga_dynamic_components;
-- 查看隐含参数需用 sysdba
SELECT ksppinm, ksppstvl FROM x$ksppi a, x$ksppcv b
WHERE a.indx = b.indx AND ksppinm LIKE '\_%' ESCAPE '\';
十一、归档与日志
sql
-- 查看归档模式
ARCHIVE LOG LIST;
SELECT log_mode FROM v$database;
-- 开启归档(需在 mount 状态)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 手动切换日志、归档当前日志
ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM ARCHIVE LOG CURRENT;
-- 查看重做日志组
SELECT group#, thread#, bytes/1024/1024 AS mb, members, status
FROM v$log;
SELECT group#, member FROM v$logfile;
-- 查看归档日志空间使用(FRA 快速恢复区)
SELECT * FROM v$recovery_file_dest;
SELECT file_type, percent_space_used, percent_space_reclaimable
FROM v$recovery_area_usage;
日志文件(排障必看):
bash
# 告警日志 alert log(ADR 目录下)
$ORACLE_BASE/diag/rdbms/<db_name>/<sid>/trace/alert_<sid>.log
# 用 adrci 工具查看
adrci
adrci> show alert -tail 50 # 查看最近 50 行告警日志
adrci> show problem # 查看严重问题
十二、数据泵导入导出(expdp / impdp)
19c 推荐用数据泵替代旧版 exp/imp。需先在数据库中创建 directory 对象。
sql
-- 创建目录对象(指向 OS 路径),并授权
CREATE OR REPLACE DIRECTORY dpdir AS '/u01/dump';
GRANT READ, WRITE ON DIRECTORY dpdir TO system;
bash
# 导出整个 schema
expdp system/password@orclpdb schemas=HR \
directory=dpdir dumpfile=hr_%U.dmp logfile=hr_exp.log \
parallel=4 compression=all
# 导出单张表
expdp system/password@orclpdb tables=HR.EMPLOYEES \
directory=dpdir dumpfile=emp.dmp logfile=emp_exp.log
# 全库导出
expdp system/password@orclpdb full=y \
directory=dpdir dumpfile=full_%U.dmp logfile=full_exp.log parallel=4
# 导入 schema(并做重映射:换 schema、换表空间)
impdp system/password@orclpdb \
directory=dpdir dumpfile=hr_%U.dmp logfile=hr_imp.log \
remap_schema=HR:HR_NEW remap_tablespace=USERS:APP_DATA
# 只查看 dmp 内容不导入(生成 SQL 脚本)
impdp system/password@orclpdb directory=dpdir dumpfile=hr.dmp \
sqlfile=hr_ddl.sql
查看正在运行的数据泵作业:
sql
SELECT job_name, operation, job_mode, state
FROM dba_datapump_jobs;
十三、RMAN 备份常用
bash
# 连接目标库
rman target /
# 或连接目标库 + 恢复目录
rman target / catalog rman/password@rmancat
sql
-- 全库备份(含归档日志)
BACKUP DATABASE PLUS ARCHIVELOG;
-- 备份并压缩
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;
-- 增量备份(level 0 全量基线,level 1 增量)
BACKUP INCREMENTAL LEVEL 0 DATABASE;
BACKUP INCREMENTAL LEVEL 1 DATABASE;
-- 仅备份归档日志
BACKUP ARCHIVELOG ALL;
-- 备份单个 PDB
BACKUP PLUGGABLE DATABASE orclpdb;
-- 查看备份信息
LIST BACKUP SUMMARY;
LIST BACKUP OF DATABASE;
-- 校验备份可用性与检查坏块
RESTORE DATABASE VALIDATE;
BACKUP VALIDATE CHECK LOGICAL DATABASE;
-- 删除过期备份、清理已删归档
CROSSCHECK BACKUP;
DELETE EXPIRED BACKUP;
DELETE OBSOLETE;
-- 查看/设置保留策略
SHOW RETENTION POLICY;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
十四、常用故障排查速查
| 现象 | 排查方向 |
|---|---|
| 客户端连不上 | 先 lsnrctl status 看服务是否 READY;tnsping 测通;防火墙 1521 端口 |
| ORA-01034 数据库未启动 | sqlplus / as sysdba 后 startup |
| ORA-12514 服务名未注册 | PDB 未 open,或 alter system register 重新注册监听 |
| ORA-01555 快照过旧 | 增大 undo 表空间 / undo_retention 参数 |
| ORA-00257 归档满 | 清理 FRA 归档日志,或扩大 db_recovery_file_dest_size |
| ORA-01652 临时段无法扩展 | 临时表空间不足,扩容 temp |
| ORA-28001 密码过期 | ALTER USER ... IDENTIFIED BY ... 改密并调整 profile |
| 会话被阻塞/锁 | 查 v$session.blocking_session 定位 blocker 后 kill |
| 性能变慢 | 查 v$session_longops、v$sql(按 elapsed 排序)、生成 AWR 报告 |
生成 AWR 性能报告:
sql
-- 查看可用快照
SELECT snap_id, begin_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC;
-- 交互式生成 AWR 报告(选择起止 snap_id)
@?/rdbms/admin/awrrpt.sql
排障时告警日志 alert log 是第一手资料,任何 ORA- 报错先去 ADR trace 目录看上下文。
总结
Oracle 19c 运维可以归纳为三条主线:
- 多租户 :时刻清楚自己在 CDB 还是 PDB(
show con_name),PDB 记得save state避免重启后不自动打开 - 容量:定期检查表空间使用率、归档空间(FRA),提前扩容
- 备份:日常数据泵(expdp/impdp)做逻辑备份,RMAN 做物理备份与恢复验证
配合告警日志 alert log,绝大部分日常问题都能快速定位。