运维管理30 分钟阅读
Oracle 运维命令 100 条
Oracle DBA 的日常工作并不是简单地执行几条 SQL。数据库启动失败、会话阻塞、表空间告警、UNDO 异常、SQL 性能下降、归档堆积、备份失效、Data Guard 延迟,这些问题最终都需要通过命令和动态性能视图定位。
2026年7月21日阅读—点赞—收藏—
dba100oracle墨力计划
在知识库中专注阅读,并随时返回相关工具与课程
Oracle DBA 的日常工作并不是简单地执行几条 SQL。数据库启动失败、会话阻塞、表空间告警、UNDO 异常、SQL 性能下降、归档堆积、备份失效、Data Guard 延迟,这些问题最终都需要通过命令和动态性能视图定位。
Oracle DBA 的日常工作并不是简单地执行几条 SQL。数据库启动失败、会话阻塞、表空间告警、UNDO 异常、SQL 性能下降、归档堆积、备份失效、Data Guard 延迟,这些问题最终都需要通过命令和动态性能视图定位。
本文整理了 Oracle DBA 工作中使用频率较高的 100 条命令,覆盖实例管理、参数配置、会话排查、锁分析、SQL 性能、表空间、用户权限、UNDO、临时表空间、RMAN、Data Guard、RAC、Data Pump 和操作系统诊断等场景。

文中的用户名、路径、SID、SQL_ID、表空间名称和数据文件编号均为示例,执行时需要根据实际环境替换。涉及删除、恢复、强制终止会话等操作时,应先确认影响范围,避免直接在生产环境中照搬执行。
1sqlplus / as sysdba远程登录可以使用:
1sqlplus sys@orcl as sysdba1STARTUP;该命令依次完成实例启动、控制文件加载和数据库打开。
1STARTUP MOUNT;MOUNT 状态通常用于数据库恢复、启用归档模式、修改数据文件路径等操作。
1STARTUP NOMOUNT;NOMOUNT 状态通常用于创建数据库、重建控制文件或恢复控制文件。
1ALTER DATABASE OPEN;如果需要以只读方式打开:
1ALTER DATABASE OPEN READ ONLY;1SHUTDOWN IMMEDIATE;生产环境通常优先使用 IMMEDIATE,它会回滚未提交事务并断开用户连接,不需要等待所有会话主动退出。
1SELECT instance_name,2 host_name,3 version,4 status,5 database_status,6 startup_time7FROM v$instance;1SELECT name,2 open_mode,3 database_role,4 log_mode,5 protection_mode,6 switchover_status7FROM v$database;1ARCHIVE LOG LIST;也可以执行:
1SELECT log_mode2FROM v$database;1SELECT ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS datafile_gb2FROM dba_data_files;该结果只统计永久数据文件,不包括临时文件、控制文件、联机重做日志和归档日志。
1SHOW PARAMETER processes;也可以查询动态性能视图:
1SELECT name,2 value,3 isdefault,4 issys_modifiable5FROM v$parameter6WHERE name = 'processes';1ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH SID='*';常用的 SCOPE 取值:
MEMORY:只修改当前实例,重启后失效SPFILE:只修改参数文件,重启后生效BOTH:同时修改内存和 SPFILE1ALTER SYSTEM RESET open_cursors SCOPE=SPFILE SID='*';删除静态参数后通常需要重启实例。
1CREATE PFILE='/tmp/initorcl.ora' FROM SPFILE;该命令常用于备份当前实例参数或修改无法正常启动的 SPFILE。
1CREATE SPFILE FROM PFILE='/tmp/initorcl.ora';RAC 环境应确认 SPFILE 是否位于 ASM 或共享存储中,不能直接覆盖正在使用的错误位置。
1SHOW PARAMETER control_files;也可以执行:
1SELECT name2FROM v$controlfile;1SELECT l.group#,2 l.thread#,3 l.sequence#,4 l.bytes / 1024 / 1024 AS size_mb,5 l.status,6 l.archived,7 f.member8FROM v$log l9JOIN v$logfile f10 ON l.group# = f.group#11ORDER BY l.thread#, l.group#, f.member;1ALTER SYSTEM SWITCH LOGFILE;该操作会结束当前日志组的写入,并切换到下一个可用日志组。
1ALTER SYSTEM CHECKPOINT;检查点会推进控制文件和数据文件头中的检查点信息,但不等于将所有脏块立即写完。
1ALTER SYSTEM ARCHIVE LOG CURRENT;与 SWITCH LOGFILE 相比,该命令会等待当前日志完成归档,在备份和 Data Guard 运维中使用较多。
1SELECT sid,2 serial#,3 username,4 status,5 machine,6 program,7 event,8 sql_id,9 last_call_et10FROM v$session11WHERE type = 'USER'12 AND status = 'ACTIVE'13ORDER BY last_call_et DESC;1SELECT sid,2 serial#,3 username,4 osuser,5 machine,6 program,7 module,8 action,9 status,10 event,11 wait_class,12 sql_id,13 prev_sql_id,14 logon_time15FROM v$session16WHERE sid = 123;1SELECT username,2 machine,3 program,4 status,5 COUNT(*) AS session_count6FROM v$session7WHERE type = 'USER'8GROUP BY username, machine, program, status9ORDER BY session_count DESC;该命令适合排查连接池连接泄漏、异常程序连接增长和数据库进程数不足。
1SELECT sid,2 serial#,3 opname,4 target,5 sofar,6 totalwork,7 units,8 ROUND(sofar / NULLIF(totalwork, 0) * 100, 2) AS progress_pct,9 elapsed_seconds,10 time_remaining11FROM v$session_longops12WHERE sofar <> totalwork13ORDER BY start_time;并不是所有 SQL 都会出现在 v$session_longops 中,通常大表扫描、备份恢复、统计信息收集等操作更容易被记录。
1SELECT sid,2 serial#,3 username,4 blocking_session,5 event,6 seconds_in_wait,7 sql_id8FROM v$session9WHERE blocking_session IS NOT NULL10ORDER BY seconds_in_wait DESC;1SELECT a.sid AS blocker_sid,2 b.sid AS waiter_sid,3 a.id1,4 a.id2,5 b.request,6 b.lmode7FROM v$lock a8JOIN v$lock b9 ON a.id1 = b.id110 AND a.id2 = b.id211WHERE a.block = 112 AND b.request > 0;该查询可以快速找到持锁会话和等待会话之间的关系。
1SELECT s.sid,2 s.serial#,3 s.username,4 o.owner,5 o.object_name,6 o.object_type,7 l.locked_mode8FROM v$locked_object l9JOIN dba_objects o10 ON l.object_id = o.object_id11JOIN v$session s12 ON l.session_id = s.sid13ORDER BY s.sid;1ALTER SYSTEM KILL SESSION '123,4567' IMMEDIATE;其中:
123 是 SID4567 是 SERIAL#RAC 环境中可以指定实例:
1ALTER SYSTEM KILL SESSION '123,4567,@2' IMMEDIATE;1ALTER SYSTEM DISCONNECT SESSION '123,4567' IMMEDIATE;如果希望等待当前事务完成后再断开:
1ALTER SYSTEM DISCONNECT SESSION '123,4567' POST_TRANSACTION;1SELECT s.sid,2 s.serial#,3 s.username,4 t.start_time,5 t.used_ublk,6 t.used_urec,7 ROUND(8 t.used_ublk *9 TO_NUMBER((SELECT value10 FROM v$parameter11 WHERE name = 'db_block_size'))12 / 1024 / 1024,13 214 ) AS undo_mb15FROM v$transaction t16JOIN v$session s17 ON t.ses_addr = s.saddr18ORDER BY t.used_ublk DESC;1SELECT s.sid,2 s.serial#,3 s.sql_id,4 q.sql_text5FROM v$session s6LEFT JOIN v$sql q7 ON s.sql_id = q.sql_id8 AND s.sql_child_number = q.child_number9WHERE s.sid = 123;1SELECT sql_text2FROM v$sqltext_with_newlines3WHERE sql_id = '&sql_id'4ORDER BY piece;1SELECT *2FROM (3 SELECT sql_id,4 executions,5 ROUND(elapsed_time / 1000000, 2) AS elapsed_seconds,6 ROUND(7 elapsed_time / NULLIF(executions, 0) / 1000000,8 49 ) AS avg_elapsed_seconds,10 sql_text11 FROM v$sql12 WHERE executions > 013 ORDER BY elapsed_time DESC14)15WHERE ROWNUM <= 20;1SELECT *2FROM (3 SELECT sql_id,4 executions,5 ROUND(cpu_time / 1000000, 2) AS cpu_seconds,6 ROUND(7 cpu_time / NULLIF(executions, 0) / 1000000,8 49 ) AS avg_cpu_seconds,10 sql_text11 FROM v$sql12 WHERE executions > 013 ORDER BY cpu_time DESC14)15WHERE ROWNUM <= 20;1SELECT *2FROM (3 SELECT sql_id,4 executions,5 buffer_gets,6 ROUND(7 buffer_gets / NULLIF(executions, 0),8 29 ) AS gets_per_exec,10 sql_text11 FROM v$sql12 WHERE executions > 013 ORDER BY buffer_gets DESC14)15WHERE ROWNUM <= 20;1SELECT *2FROM (3 SELECT sql_id,4 executions,5 disk_reads,6 ROUND(7 disk_reads / NULLIF(executions, 0),8 29 ) AS reads_per_exec,10 sql_text11 FROM v$sql12 WHERE executions > 013 ORDER BY disk_reads DESC14)15WHERE ROWNUM <= 20;1EXPLAIN PLAN FOR2SELECT *3FROM app_user.orders4WHERE order_id = 10001;56SELECT *7FROM TABLE(DBMS_XPLAN.DISPLAY);EXPLAIN PLAN 展示的是优化器预估执行计划,不一定等于 SQL 实际运行时使用的计划。
1SELECT *2FROM TABLE(3 DBMS_XPLAN.DISPLAY_CURSOR(4 sql_id => '&sql_id',5 cursor_child_no => NULL,6 format => 'ALLSTATS LAST +PEEKED_BINDS +OUTLINE'7 )8);要查看准确的每一步实际行数,SQL 执行时需要开启行源统计,例如使用:
1SELECT /*+ GATHER_PLAN_STATISTICS */ ...1SELECT sql_id,2 child_number,3 name,4 position,5 datatype_string,6 value_string,7 last_captured8FROM v$sql_bind_capture9WHERE sql_id = '&sql_id'10ORDER BY child_number, position;绑定变量不会在每次执行时都被捕获,因此该视图中的值可能为空或不是最新值。
1SELECT *2FROM (3 SELECT event,4 total_waits,5 time_waited,6 average_wait,7 max_wait8 FROM v$session_event9 WHERE sid = 12310 ORDER BY time_waited DESC11)12WHERE ROWNUM <= 20;该结果是会话生命周期内的累计等待情况,不只是当前 SQL 的等待数据。
1SELECT d.tablespace_name,2 ROUND(d.bytes / 1024 / 1024 / 1024, 2) AS current_gb,3 ROUND(4 (d.bytes - NVL(f.bytes, 0)) / 1024 / 1024 / 1024,5 26 ) AS used_gb,7 ROUND(NVL(f.bytes, 0) / 1024 / 1024 / 1024, 2) AS free_gb,8 ROUND(9 (d.bytes - NVL(f.bytes, 0)) / d.bytes * 100,10 211 ) AS current_used_pct,12 ROUND(d.maxbytes / 1024 / 1024 / 1024, 2) AS max_gb,13 ROUND(14 (d.maxbytes - d.bytes + NVL(f.bytes, 0))15 / 1024 / 1024 / 1024,16 217 ) AS remaining_to_max_gb18FROM (19 SELECT tablespace_name,20 SUM(bytes) AS bytes,21 SUM(22 CASE23 WHEN autoextensible = 'YES' THEN maxbytes24 ELSE bytes25 END26 ) AS maxbytes27 FROM dba_data_files28 GROUP BY tablespace_name29) d30LEFT JOIN (31 SELECT tablespace_name,32 SUM(bytes) AS bytes33 FROM dba_free_space34 GROUP BY tablespace_name35) f36 ON d.tablespace_name = f.tablespace_name37ORDER BY current_used_pct DESC;1SELECT file_id,2 tablespace_name,3 file_name,4 ROUND(bytes / 1024 / 1024 / 1024, 2) AS current_gb,5 autoextensible,6 ROUND(maxbytes / 1024 / 1024 / 1024, 2) AS max_gb,7 status8FROM dba_data_files9ORDER BY tablespace_name, file_id;1SELECT file_id,2 tablespace_name,3 file_name,4 ROUND(bytes / 1024 / 1024 / 1024, 2) AS current_gb,5 autoextensible,6 ROUND(maxbytes / 1024 / 1024 / 1024, 2) AS max_gb,7 status8FROM dba_temp_files9ORDER BY tablespace_name, file_id;1ALTER TABLESPACE USERS2ADD DATAFILE '/u01/oradata/ORCL/users02.dbf'3SIZE 10G4AUTOEXTEND ON NEXT 1G5MAXSIZE 40G;执行前应确认文件系统剩余空间、Oracle 用户权限、数据库块大小和数据文件最大块数限制。
1ALTER DATABASE DATAFILE2'/u01/oradata/ORCL/users02.dbf'3RESIZE 20G;缩小数据文件时,如果目标位置之后仍存在已使用数据块,会返回 ORA-03297。
1ALTER DATABASE DATAFILE2'/u01/oradata/ORCL/users02.dbf'3AUTOEXTEND ON NEXT 1G MAXSIZE 40G;不建议无规划地设置为 MAXSIZE UNLIMITED,尤其是在文件系统空间有限的环境中。
1ALTER TABLESPACE ARCHIVE_DATA READ ONLY;恢复读写状态:
1ALTER TABLESPACE ARCHIVE_DATA READ WRITE;1ALTER TABLESPACE APP_DATA OFFLINE IMMEDIATE;恢复联机:
1ALTER TABLESPACE APP_DATA ONLINE;不要随意对 SYSTEM、SYSAUX、当前 UNDO 和当前默认临时表空间执行脱机操作。
1CREATE TABLESPACE APP_DATA2DATAFILE '/u01/oradata/ORCL/app_data01.dbf'3SIZE 20G4AUTOEXTEND ON NEXT 1G5MAXSIZE 100G6EXTENT MANAGEMENT LOCAL7SEGMENT SPACE MANAGEMENT AUTO;1DROP TABLESPACE APP_DATA2INCLUDING CONTENTS3AND DATAFILES;这是不可逆的高风险操作。执行前必须确认对象归属、备份状态和业务影响。
1SELECT *2FROM (3 SELECT owner,4 segment_name,5 partition_name,6 segment_type,7 tablespace_name,8 ROUND(bytes / 1024 / 1024 / 1024, 2) AS size_gb9 FROM dba_segments10 ORDER BY bytes DESC11)12WHERE ROWNUM <= 30;1SELECT owner,2 ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS size_gb3FROM dba_segments4GROUP BY owner5ORDER BY size_gb DESC;1SELECT owner,2 segment_name,3 segment_type,4 ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS size_gb5FROM dba_segments6WHERE owner = 'APP_USER'7 AND segment_name = 'ORDERS'8GROUP BY owner, segment_name, segment_type;该查询只统计指定名称的段。如果表包含 LOB、分区和索引,还需要分别统计相关段。
1SELECT owner,2 index_name,3 table_name,4 index_type,5 status,6 visibility,7 tablespace_name,8 last_analyzed9FROM dba_indexes10WHERE owner = 'APP_USER'11ORDER BY table_name, index_name;Oracle 11g 中如果视图不存在 VISIBILITY 列,可以从查询中删除该列。
1SELECT owner,2 object_type,3 object_name,4 status5FROM dba_objects6WHERE status = 'INVALID'7ORDER BY owner, object_type, object_name;1EXEC DBMS_UTILITY.COMPILE_SCHEMA(2 schema => 'APP_USER',3 compile_all => FALSE4);数据库升级或批量变更后,也可以执行 Oracle 自带脚本:
1@?/rdbms/admin/utlrp.sql1CREATE USER app_user2IDENTIFIED BY "StrongPassword_2026"3DEFAULT TABLESPACE app_data4TEMPORARY TABLESPACE temp5PROFILE default;在 Oracle 12c 及以上 CDB 环境中,应先确认当前容器,避免在 CDB 根容器中错误创建本地用户。
1GRANT CREATE SESSION TO app_user;根据业务需要再授予对象创建权限,不建议直接授予 DBA 角色。
例如:
1GRANT CREATE TABLE,2 CREATE VIEW,3 CREATE PROCEDURE,4 CREATE SEQUENCE5TO app_user;1ALTER USER app_user2QUOTA 20G ON app_data;授予无限配额:
1ALTER USER app_user2QUOTA UNLIMITED ON app_data;锁定用户:
1ALTER USER app_user ACCOUNT LOCK;解锁用户:
1ALTER USER app_user ACCOUNT UNLOCK;强制下次登录修改密码:
1ALTER USER app_user PASSWORD EXPIRE;修改密码并解锁:
1ALTER USER app_user2IDENTIFIED BY "NewPassword_2026"3ACCOUNT UNLOCK;1SELECT tablespace_name,2 ROUND(SUM(bytes_used) / 1024 / 1024 / 1024, 2) AS used_gb,3 ROUND(SUM(bytes_free) / 1024 / 1024 / 1024, 2) AS free_gb,4 ROUND(5 SUM(bytes_used) /6 NULLIF(SUM(bytes_used) + SUM(bytes_free), 0) * 100,7 28 ) AS used_pct9FROM v$temp_space_header10GROUP BY tablespace_name;1SELECT s.sid,2 s.serial#,3 s.username,4 s.sql_id,5 u.tablespace,6 u.segtype,7 ROUND(8 u.blocks * t.block_size / 1024 / 1024,9 210 ) AS temp_mb11FROM v$tempseg_usage u12JOIN v$session s13 ON u.session_addr = s.saddr14JOIN dba_tablespaces t15 ON u.tablespace = t.tablespace_name16ORDER BY temp_mb DESC;1SELECT tablespace_name,2 current_users,3 used_blocks,4 free_blocks,5 ROUND(used_blocks * block_size / 1024 / 1024, 2) AS used_mb,6 ROUND(free_blocks * block_size / 1024 / 1024, 2) AS free_mb7FROM v$sort_segment;1ALTER TABLESPACE TEMP2ADD TEMPFILE '/u01/oradata/ORCL/temp02.dbf'3SIZE 20G4AUTOEXTEND ON NEXT 1G5MAXSIZE 50G;1ALTER DATABASE TEMPFILE2'/u01/oradata/ORCL/temp02.dbf'3RESIZE 30G;缩小临时文件前,应确认当前临时段高水位和正在使用临时空间的会话。
1SELECT tablespace_name,2 status,3 ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS size_gb4FROM dba_undo_extents5GROUP BY tablespace_name, status6ORDER BY tablespace_name, status;UNDO 区间常见状态:
ACTIVE:正在被事务使用UNEXPIRED:事务已结束,但仍在保留期内EXPIRED:可以被重新使用1SELECT s.sid,2 s.serial#,3 s.username,4 s.sql_id,5 t.start_time,6 t.used_ublk,7 t.used_urec,8 ROUND(9 t.used_ublk *10 TO_NUMBER((SELECT value11 FROM v$parameter12 WHERE name = 'db_block_size'))13 / 1024 / 1024,14 215 ) AS undo_mb16FROM v$transaction t17JOIN v$session s18 ON t.ses_addr = s.saddr19ORDER BY undo_mb DESC;1SHOW PARAMETER undo_retention;修改保留时间为 3600 秒:
1ALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH;UNDO_RETENTION 并不意味着所有 UNDO 一定会保留指定时间。当 UNDO 空间不足且未启用 RETENTION GUARANTEE 时,未过期区间仍可能被覆盖。
1BEGIN2 DBMS_STATS.GATHER_SCHEMA_STATS(3 ownname => 'APP_USER',4 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,5 method_opt => 'FOR ALL COLUMNS SIZE AUTO',6 degree => DBMS_STATS.AUTO_DEGREE,7 cascade => TRUE8 );9END;10/1BEGIN2 DBMS_STATS.GATHER_TABLE_STATS(3 ownname => 'APP_USER',4 tabname => 'ORDERS',5 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,6 method_opt => 'FOR ALL COLUMNS SIZE AUTO',7 degree => DBMS_STATS.AUTO_DEGREE,8 cascade => TRUE,9 no_invalidate => FALSE10 );11END;12/生产环境收集大表统计信息时,需要评估并行度、采样比例、执行窗口和执行计划变化风险。
以下命令在 RMAN 中执行。
1rman target /远程连接示例:
1rman target sys@orcl1SHOW ALL;重点检查:
1REPORT SCHEMA;该命令可以查看数据文件编号、数据文件大小和所属表空间,恢复单个数据文件时经常使用。
1LIST BACKUP SUMMARY;查看更详细的数据库备份:
1LIST BACKUP OF DATABASE;1CROSSCHECK BACKUP;2DELETE NOPROMPT EXPIRED BACKUP;EXPIRED 表示 RMAN 仓库中有记录,但实际备份文件无法找到,不等于备份已经超过保留策略。
1BACKUP AS COMPRESSED BACKUPSET2DATABASE3PLUS ARCHIVELOG;是否使用压缩备份集,应根据 CPU 资源、备份窗口和存储空间综合判断。
1BACKUP ARCHIVELOG ALL DELETE INPUT;Data Guard 环境中必须结合归档日志删除策略,避免归档日志尚未传输或应用就被删除。
1REPORT OBSOLETE;2DELETE NOPROMPT OBSOLETE;执行删除前,建议先运行 REPORT OBSOLETE 检查即将删除的备份范围。
1BACKUP VALIDATE CHECK LOGICAL2DATABASE3ARCHIVELOG ALL;也可以验证现有备份是否能够被读取:
1RESTORE DATABASE VALIDATE;VALIDATE 不会真正恢复数据文件,但可以检查备份片可读性和部分物理、逻辑损坏。
假设需要恢复 7 号数据文件:
1RUN {2 SQL 'ALTER DATABASE DATAFILE 7 OFFLINE';3 RESTORE DATAFILE 7;4 RECOVER DATAFILE 7;5 SQL 'ALTER DATABASE DATAFILE 7 ONLINE';6}SYSTEM、当前 UNDO、控制文件和数据库非归档模式下的数据文件恢复,处理流程可能不同,不能直接套用该命令。
1SELECT name,2 database_role,3 open_mode,4 protection_mode,5 protection_level,6 switchover_status7FROM v$database;1SELECT dest_id,2 status,3 destination,4 target,5 archiver,6 process,7 transmit_mode,8 error9FROM v$archive_dest_status10WHERE status <> 'INACTIVE'11ORDER BY dest_id;如果 ERROR 列有内容,应进一步检查网络、服务名、归档路径、密码文件和备库状态。
1SELECT thread#,2 low_sequence#,3 high_sequence#4FROM v$archive_gap;该视图通常一次只显示当前需要处理的一个日志缺口,修复后可能还会显示后续缺口。
1SELECT process,2 status,3 thread#,4 sequence#,5 block#,6 blocks7FROM v$managed_standby8ORDER BY process;常见进程包括:
RFS:接收主库日志MRP0:日志应用协调进程ARCH:归档进程1ALTER DATABASE RECOVER MANAGED STANDBY DATABASE2USING CURRENT LOGFILE3DISCONNECT FROM SESSION;较新版本中,即使不显式指定 USING CURRENT LOGFILE,也可能默认使用实时应用,但在不同版本环境中应以实际行为为准。
1ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;进行备库维护、切换或恢复操作前,经常需要先停止 MRP。
1SELECT thread#,2 MAX(sequence#) AS last_received,3 MAX(4 CASE5 WHEN applied = 'YES' THEN sequence#6 END7 ) AS last_applied8FROM v$archived_log9GROUP BY thread#10ORDER BY thread#;仅比较日志序列号不能完整反映延迟时间,还应结合归档日志时间、v$dataguard_stats 和业务恢复点综合判断。
1SELECT inst_id,2 instance_name,3 host_name,4 version,5 status,6 database_status,7 startup_time8FROM gv$instance9ORDER BY inst_id;1SELECT inst_id,2 username,3 status,4 COUNT(*) AS session_count5FROM gv$session6WHERE type = 'USER'7GROUP BY inst_id, username, status8ORDER BY inst_id, session_count DESC;该命令可以检查业务连接是否均衡分布在 RAC 各节点。
Oracle 12c 及以上版本可以执行:
1SHOW PDBS;打开全部 PDB:
1ALTER PLUGGABLE DATABASE ALL OPEN;保存 PDB 打开状态:
1ALTER PLUGGABLE DATABASE ALL SAVE STATE;查看当前容器:
1SHOW CON_NAME;1SELECT owner,2 job_name,3 enabled,4 state,5 last_start_date,6 last_run_duration,7 next_run_date,8 failure_count9FROM dba_scheduler_jobs10ORDER BY owner, job_name;1BEGIN2 DBMS_SCHEDULER.RUN_JOB(3 job_name => 'APP_USER.JOB_SYNC_DATA',4 use_current_session => FALSE5 );6END;7/设置为 FALSE 时,作业在后台运行;设置为 TRUE 时,当前会话会等待作业执行完成。
1BEGIN2 DBMS_SCHEDULER.STOP_JOB(3 job_name => 'APP_USER.JOB_SYNC_DATA',4 force => TRUE5 );6END;7/强制停止作业可能导致业务事务中断,应先确认作业当前正在执行的内容。
首先在操作系统中创建目录:
1mkdir -p /backup/dump2chown oracle:oinstall /backup/dump3chmod 750 /backup/dump然后在数据库中创建目录对象:
1CREATE OR REPLACE DIRECTORY DUMP_DIR AS '/backup/dump';23GRANT READ, WRITE ON DIRECTORY DUMP_DIR TO app_user;Oracle 数据库不会自动创建操作系统目录。
1expdp system@orcl \2schemas=APP_USER \3directory=DUMP_DIR \4dumpfile=app_user_%U.dmp \5logfile=app_user_exp.log \6parallel=4 \7filesize=20G \8compression=all多文件并行导出时,DUMPFILE 中应包含 %U。
1impdp system@orcl \2directory=DUMP_DIR \3dumpfile=app_user_%U.dmp \4logfile=app_user_imp.log \5remap_schema=APP_USER:APP_USER_TEST \6remap_tablespace=APP_DATA:APP_DATA_TEST \7parallel=4如果目标用户不存在,应根据导出内容和导入方式确认是否需要提前创建用户、表空间和配额。
1lsnrctl status查看监听支持的服务:
1lsnrctl services启动和停止监听:
1lsnrctl start2lsnrctl stop1tnsping orcltnsping 只能验证客户端能否解析服务名并访问监听地址,不能证明数据库用户一定可以成功登录。
真正测试数据库连接应使用:
1sqlplus app_user@orcl查看诊断目录:
1adrci exec="show homes"查看最近 100 行告警日志:
1adrci exec="set homepath diag/rdbms/orcl/orcl; show alert -tail 100 -term"持续跟踪告警日志:
1adrci exec="set homepath diag/rdbms/orcl/orcl; show alert -tail -f"其中 homepath 需要根据 show homes 的实际结果修改。
查看服务器上的 Oracle 实例:
1ps -ef | grep '[o]ra_pmon'查看 CPU 使用率最高的 Oracle 进程:
1ps -eo pid,ppid,%cpu,%mem,etime,args \2--sort=-%cpu | grep '[o]ra_' | head -20拿到操作系统进程号后,可以在数据库中反查会话:
1SELECT p.spid,2 s.sid,3 s.serial#,4 s.username,5 s.status,6 s.event,7 s.sql_id,8 s.machine,9 s.program10FROM v$process p11JOIN v$session s12 ON p.addr = s.paddr13WHERE p.spid = '&os_pid';Oracle DBA 真正需要掌握的并不是“记住多少条命令”,而是知道每条命令应该在什么场景下执行、查询结果说明了什么、下一步应该验证什么。
看到 CPU 高,不能只查高 CPU SQL,还要判断是 SQL 计算量大、解析频繁、并行失控,还是大量会话被唤醒后争抢 CPU;看到表空间使用率高,也不能立即增加数据文件,而应先区分真实业务增长、异常段膨胀、回收站占用、LOB 增长还是数据文件自动扩展配置不合理。
命令只是入口,判断路径才是 DBA 的核心能力。
更多 Oracle、MySQL、PostgreSQL、SQL Server 数据库实战内容,可以访问 DBA 学习平台:ora100.com