Skip to content

Oracle 常用命令参考

SQL*Plus 命令

连接命令

功能说明:用于连接到 Oracle 数据库实例,是最常用的数据库访问方式。

常用连接方式

sql
# 本地连接(使用操作系统认证)
sqlplus / as sysdba

# 远程连接(使用用户名密码认证)
sqlplus username/password@hostname:port/service_name

# 加密连接(使用 TCPS 协议)
sqlplus username/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=hostname)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=service_name)))

使用场景

  • 本地连接:适用于数据库服务器本地管理操作
  • 远程连接:适用于从客户端连接到数据库服务器
  • 加密连接:适用于对安全性要求较高的环境

会话管理

功能说明:管理当前 SQL*Plus 会话的设置和信息。

常用命令

sql
# 显示当前用户
show user

# 设置会话参数
alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';
alter session set nls_language = 'SIMPLIFIED CHINESE';

# 查看会话信息
select * from v$session where sid = (select sid from v$mystat where rownum = 1);

参数说明

  • nls_date_format:设置日期显示格式
  • nls_language:设置会话语言

数据库状态

功能说明:查看数据库实例和数据库的当前状态。

常用命令

sql
# 查看数据库实例状态
select status from v$instance;

# 查看数据库打开模式
select open_mode from v$database;

# 查看所有实例状态(RAC 环境)
select instance_name, status from gv$instance;

状态说明

  • INSTANCE 状态:STARTED, MOUNTED, OPEN, SHUTDOWN
  • DATABASE 打开模式:READ WRITE, READ ONLY, MOUNTED

性能监控

功能说明:监控数据库性能指标,识别性能瓶颈。

常用命令

sql
# 查看等待事件
select event, count(*) from v$session_wait group by event order by count(*) desc;

# 查看会话消耗资源
select sid, serial#, username, osuser, machine, program, cpu_time, logical_reads from v$session order by cpu_time desc;

# 查看SQL执行情况
select sql_id, sql_text, elapsed_time, executions from v$sql order by elapsed_time desc;

监控重点

  • 等待事件:识别系统瓶颈类型
  • 会话资源:发现消耗资源过多的会话
  • SQL执行:找出执行时间长的SQL语句

RMAN 命令

连接命令

功能说明:连接到 RMAN(Recovery Manager)进行备份恢复操作。

常用连接方式

bash
# 连接到目标数据库
rman target /

# 连接到目标数据库和恢复目录
rman target / catalog rman/rman@rcat

# 连接到辅助数据库(Data Guard 环境)
rman target / auxiliary sys/password@standby

连接说明

  • target /:使用操作系统认证连接到本地数据库
  • catalog:使用恢复目录存储备份元数据
  • auxiliary:连接到备用数据库

备份命令

功能说明:使用 RMAN 执行各种类型的数据库备份。

常用备份命令

bash
# 全库备份(包含归档日志)
backup database plus archivelog delete input;

# 表空间备份
backup tablespace users, sysaux;

# 数据文件备份
backup datafile 1, 2, 3;

# 控制文件备份
backup current controlfile;

# SPFILE备份
backup spfile;

备份选项说明

  • plus archivelog:备份数据库的同时备份归档日志
  • delete input:备份完成后删除输入的归档日志

恢复命令

功能说明:使用 RMAN 执行数据库恢复操作。

常用恢复命令

bash
# 全库恢复
restore database;
recover database;

# 表空间恢复
restore tablespace users;
recover tablespace users;

# 数据文件恢复
restore datafile 5;
recover datafile 5;

# 控制文件恢复
restore controlfile from autobackup;

恢复流程

  1. restore:从备份中还原数据文件
  2. recover:应用归档日志和重做日志进行恢复

RMAN 维护

功能说明:维护 RMAN 备份信息和配置。

常用维护命令

bash
# 列出所有备份集
list backup;

# 列出过期备份
list expired backup;

# 删除过期备份
delete expired backup;

# 交叉检查备份(验证备份是否存在)
crosscheck backup;

# 显示RMAN配置
show all;

维护说明

  • 过期备份:RMAN 元数据中存在但实际备份文件已不存在的备份
  • 交叉检查:验证备份文件的存在性,更新 RMAN 元数据

监听器命令

基本命令

功能说明:管理 Oracle 监听器,控制数据库连接的接收和处理。

常用命令

bash
# 启动监听器
lsnrctl start

# 停止监听器
lsnrctl stop

# 重启监听器(重新加载配置)
lsnrctl reload

# 查看监听器状态
lsnrctl status

# 查看监听器服务(已注册的数据库服务)
lsnrctl services

命令说明

  • start:启动监听器进程
  • stop:停止监听器进程
  • reload:重新加载监听器配置文件,无需停止监听器
  • status:显示监听器当前状态和已注册的服务
  • services:显示详细的服务注册信息

高级命令

功能说明:配置和管理监听器的高级参数。

常用高级命令

bash
# 设置监听器日志状态
lsnrctl set log_status on

# 设置跟踪级别
lsnrctl set trc_level admin

# 设置当前监听器
lsnrctl set current_listener LISTENER

# 查看监听器版本
lsnrctl version

# 保存监听器配置到文件
lsnrctl save_config

参数说明

  • log_status:控制监听器日志的开启和关闭
  • trc_level:设置跟踪级别(off, user, admin, support)
  • current_listener:指定要操作的监听器名称
  • save_config:将当前配置保存到 listener.ora 文件

数据库管理命令

实例管理

功能说明:管理 Oracle 数据库实例的启动和关闭。

常用命令

sql
# 启动数据库(完整启动)
startup

# 启动到挂载状态(不打开数据库)
startup mount

# 启动到只读模式
startup mount
alter database open read only;

# 正常关闭数据库
shutdown immediate

# 强制关闭数据库(紧急情况)
shutdown abort

启动模式说明

  • startup:正常启动,经历 nomount → mount → open 三个阶段
  • startup mount:仅启动到挂载状态,可用于执行某些维护操作
  • startup nomount:仅启动实例,不挂载数据库

关闭模式说明

  • shutdown immediate:立即关闭,回滚未提交事务
  • shutdown abort:强制终止实例,不回滚事务,下次启动需要恢复
  • shutdown normal:等待所有用户断开连接后关闭
  • shutdown transactional:等待当前事务完成后关闭

表空间管理

功能说明:创建、修改和管理数据库表空间。

常用命令

sql
# 创建表空间
create tablespace users datafile '/u01/app/oracle/oradata/ORCL/users01.dbf' size 100m autoextend on next 10m maxsize unlimited;

# 扩展表空间(添加数据文件)
alter tablespace users add datafile '/u01/app/oracle/oradata/ORCL/users02.dbf' size 100m;

# 调整数据文件大小
alter database datafile '/u01/app/oracle/oradata/ORCL/users01.dbf' resize 200m;

# 查看表空间使用情况
select tablespace_name, sum(bytes)/1024/1024 as mb, sum(maxbytes)/1024/1024 as max_mb from dba_data_files group by tablespace_name;

参数说明

  • datafile:指定数据文件路径
  • size:数据文件初始大小
  • autoextend:是否自动扩展
  • next:自动扩展的增量大小
  • maxsize:最大文件大小

用户管理

功能说明:创建、修改和管理数据库用户。

常用命令

sql
# 创建用户
create user test identified by password default tablespace users temporary tablespace temp;

# 授予权限
grant connect, resource to test;
grant create table, create view to test;

# 修改用户密码
alter user test identified by new_password;

# 锁定/解锁用户
alter user test account lock;
alter user test account unlock;

# 删除用户(级联删除用户对象)
drop user test cascade;

参数说明

  • identified by:设置用户密码
  • default tablespace:设置默认表空间
  • temporary tablespace:设置临时表空间
  • cascade:级联删除用户的所有对象

性能监控命令

AWR 报告

sql
-- 生成AWR报告
@?/rdbms/admin/awrrpt.sql

-- 生成AWR比较报告
@?/rdbms/admin/awrddrpt.sql

-- 生成ASH报告
@?/rdbms/admin/ashrpt.sql

系统监控

bash
# 查看Oracle进程
ps -ef | grep oracle

# 查看Oracle会话
ps -ef | grep LOCAL=NO

# 查看网络连接
netstat -tuln | grep 1521

# 查看磁盘I/O
iostat -x 2

# 查看内存使用
free -m

# 查看CPU使用
top

数据库监控视图

sql
# 查看表空间使用情况
select * from dba_tablespace_usage_metrics;

# 查看数据文件状态
select file_name, status, bytes/1024/1024 as mb from dba_data_files;

# 查看重做日志状态
select group#, status, bytes/1024/1024 as mb from v$log;

# 查看控制文件
select name from v$controlfile;

# 查看参数文件
show parameter spfile;

安全管理命令

权限管理

sql
# 创建角色
create role db_monitor;

# 授予角色权限
grant select on v_$session to db_monitor;
grant select on v_$sysstat to db_monitor;

# 授予用户角色
grant db_monitor to test;

# 查看用户权限
select * from dba_sys_privs where grantee = 'TEST';

# 查看用户角色
select * from dba_role_privs where grantee = 'TEST';

审计管理

sql
# 启用审计
alter system set audit_trail = db, extended scope = spfile;

# 审计用户登录/登出
audit session;

# 审计权限使用
audit create table, drop table by access;

# 查看审计记录
select * from dba_audit_session order by timestamp desc;

备份恢复命令

冷备份

bash
# 关闭数据库
shutdown immediate

# 复制数据文件、控制文件和重做日志文件
cp /u01/app/oracle/oradata/ORCL/*.dbf /backup/
cp /u01/app/oracle/oradata/ORCL/*.ctl /backup/
cp /u01/app/oracle/oradata/ORCL/*.log /backup/

# 启动数据库
startup

热备份

sql
-- 开始表空间热备份
alter tablespace users begin backup;
-- 复制数据文件
!cp /u01/app/oracle/oradata/ORCL/users01.dbf /backup/
-- 结束表空间热备份
alter tablespace users end backup;

-- 备份归档日志
alter system switch logfile;
alter system archive log current;
!cp /u01/app/oracle/arch/ORCL/* /backup/arch/

数据泵命令

bash
# 导出全库
expdp system/password full=y directory=DATA_PUMP_DIR dumpfile=full.dmp logfile=exp_full.log

# 导出模式
expdp system/password schemas=hr,scott directory=DATA_PUMP_DIR dumpfile=schemas.dmp logfile=exp_schemas.log

# 导出表
expdp system/password tables=hr.employees,hr.departments directory=DATA_PUMP_DIR dumpfile=tables.dmp logfile=exp_tables.log

# 导入数据
impdp system/password directory=DATA_PUMP_DIR dumpfile=full.dmp logfile=imp_full.log full=y

版本差异

Oracle 11g 命令

sql
-- Oracle 11g 特定命令
-- 查看自动内存管理配置
show parameter memory_target;

-- 启用自动内存管理
alter system set memory_target = 4G scope = spfile;

Oracle 12c 命令

sql
-- Oracle 12c 特定命令
-- 查看可插拔数据库
show pdbs;

-- 切换到可插拔数据库
alter session set container = pdb1;

-- 创建可插拔数据库
create pluggable database pdb2 admin user pdb_admin identified by password file_name = '/u01/app/oracle/oradata/ORCL/pdb2/pdb2.xml';

Oracle 19c 命令

sql
-- Oracle 19c 特定命令
-- 查看数据库版本详细信息
select * from v$version;

-- 启用增强的自动诊断
alter system set diagnostic_dest = '/u01/app/oracle' scope = spfile;

-- 使用新的SQL语句
select /*+ APPEND */ * from employees;

常见问题(FAQ)

Q1: 如何快速查看数据库当前状态?

A1: 使用以下命令:

sql
-- 查看实例状态
select status, instance_name from v$instance;

-- 查看数据库打开模式
select open_mode from v$database;

-- 查看表空间使用情况
select tablespace_name, sum(bytes)/1024/1024 as mb, sum(maxbytes)/1024/1024 as max_mb from dba_data_files group by tablespace_name;

-- 查看会话数
select count(*) from v$session;

Q2: 如何查找消耗资源最多的SQL语句?

A2: 使用以下SQL:

sql
-- 按执行时间排序
select sql_id, sql_text, elapsed_time/1000000 as elapsed_seconds, executions, elapsed_time/1000000/executions as avg_elapsed_seconds from v$sql where executions > 0 order by elapsed_time desc;

-- 按CPU时间排序
select sql_id, sql_text, cpu_time/1000000 as cpu_seconds, executions from v$sql order by cpu_time desc;

-- 按逻辑读排序
select sql_id, sql_text, buffer_gets, executions, buffer_gets/executions as avg_buffer_gets from v$sql order by buffer_gets desc;

Q3: 如何备份和恢复控制文件?

A3: 备份控制文件:

sql
-- 使用SQL命令备份
alter database backup controlfile to '/backup/controlfile.bak';

-- 备份到 trace 文件
alter database backup controlfile to trace;

-- 使用RMAN备份
rman target /
backup current controlfile;

恢复控制文件:

sql
-- 从备份恢复
startup nomount
restore controlfile from '/backup/controlfile.bak';
alter database mount;
recover database;
alter database open resetlogs;

Q4: 如何查看和修改数据库参数?

A4: 查看参数:

sql
-- 查看所有参数
show parameters;

-- 查看特定参数
show parameter sga;

-- 查看参数文件中的参数
select name, value, description from v$parameter where name like '%sga%';

修改参数:

sql
-- 动态参数(立即生效)
alter system set sga_target = 4G scope = both;

-- 静态参数(需要重启)
alter system set processes = 300 scope = spfile;

Q5: 如何监控数据库空间使用情况?

A5: 使用以下SQL:

sql
-- 表空间使用情况
select tablespace_name, 
       round(sum(bytes)/1024/1024, 2) as total_mb, 
       round(sum(bytes - free_bytes)/1024/1024, 2) as used_mb, 
       round(sum(free_bytes)/1024/1024, 2) as free_mb, 
       round((sum(bytes - free_bytes)/sum(bytes))*100, 2) as used_percent 
from (select tablespace_name, bytes, 
             case when maxbytes > bytes then maxbytes - bytes else 0 end as free_bytes 
      from dba_data_files) 
group by tablespace_name 
order by used_percent desc;

-- 数据文件使用情况
select file_name, tablespace_name, bytes/1024/1024 as mb, autoextensible, maxbytes/1024/1024 as max_mb from dba_data_files order by tablespace_name;

Q6: 如何管理归档日志?

A6: 管理归档日志:

sql
-- 查看归档日志模式
select log_mode from v$database;

-- 启用归档日志模式
shutdown immediate
startup mount
alter database archivelog;
alter database open;

-- 查看归档日志位置
show parameter log_archive_dest;

-- 清理归档日志
-- 使用RMAN删除
rman target /
delete archivelog all completed before 'sysdate-7';

-- 使用操作系统命令删除
rm /u01/app/oracle/arch/ORCL/*.arc

Q7: 如何处理数据库连接问题?

A7: 排查步骤:

bash
# 检查监听器状态
lsnrctl status

# 检查网络连接
telnet hostname 1521

# 检查tnsnames.ora配置
cat $ORACLE_HOME/network/admin/tnsnames.ora

# 测试连接
sqlplus username/password@tns_alias

# 查看连接数
select count(*) from v$session;

# 查看连接限制
show parameter processes;

Q8: 如何生成数据库性能报告?

A8: 生成AWR报告:

sql
-- 执行AWR报告脚本
@?/rdbms/admin/awrrpt.sql

-- 输入报告类型(html或txt)
-- 输入开始快照ID
-- 输入结束快照ID
-- 输入报告文件名

生成ASH报告:

sql
-- 执行ASH报告脚本
@?/rdbms/admin/ashrpt.sql

-- 输入报告类型
-- 输入开始时间
-- 输入结束时间
-- 输入报告文件名

Q9: 如何迁移数据库用户和数据?

A9: 使用数据泵迁移:

bash
# 导出用户
expdp system/password schemas=hr directory=DATA_PUMP_DIR dumpfile=hr.dmp logfile=exp_hr.log

# 导入用户
impdp system/password schemas=hr directory=DATA_PUMP_DIR dumpfile=hr.dmp logfile=imp_hr.log

# 导出表
expdp system/password tables=hr.employees,hr.departments directory=DATA_PUMP_DIR dumpfile=hr_tables.dmp logfile=exp_hr_tables.log

# 导入表
impdp system/password tables=hr.employees,hr.departments directory=DATA_PUMP_DIR dumpfile=hr_tables.dmp logfile=imp_hr_tables.log

Q10: 如何确保数据库安全?

A10: 安全措施:

sql
-- 启用密码复杂度验证
alter profile default limit password_verify_function verify_function_11g;

-- 启用密码过期
alter profile default limit password_life_time 90;

-- 启用账户锁定
alter profile default limit failed_login_attempts 5 password_lock_time 1;

-- 限制特权用户登录
alter system set remote_login_passwordfile = exclusive scope = spfile;

-- 启用网络加密
alter system set sqlnet.encryption_server = required scope = spfile;
alter system set sqlnet.encryption_types_server = '(AES256, AES192, AES128)' scope = spfile;

-- 定期审计
audit session;
audit all privileges;