Oracle运维常用命令
一、Linux 操作系统操作 Oracle 环境命令
# 1. 切换至oracle操作系统用户
su - oracle
# 2. 查看当前生效数据库实例SID,一台服务器多实例时用来确认当前操作库
echo $ORACLE_SID
# 3. 手动指定要操作的数据库实例(多实例服务器必执行,否则会连错库)
# 替换*******为真实实例名
export ORACLE_SID=*******
# 查看监听运行状态、监听端口、注册的数据库实例
lsnrctl status
# 启动监听,数据库无法远程连接时执行
lsnrctl start
# 停止监听,停止后所有远程应用无法连接数据库,业务中断,禁止业务高峰期执行
lsnrctl stop
# 1. 进行SQL命令模式
sqlplus / as sysdba
create directory dump_dir as '/data1/oracle/dump';
grant read,write on directory dump_dir to xxxOMI;
二、数据库实例 & 数据库基础状态查询 SQL
-- 查询实例启动状态、数据库读写模式(mount/readonly/read write)
-- v$instance:实例信息视图;
--v$database:数据库整体信息视图
select status, open_mode from v$instance, v$database;
-- 验证SQL连接是否正常,生产极少使用
select 1 from dual;
-- 查看ASM磁盘组总容量、剩余容量、使用率(仅ASM存储架构使用,文件系统库无需执行)
SELECT
name 磁盘组名称,
total_mb 总容量MB,
free_mb 空闲容量MB,
ROUND((total_mb - free_mb)/total_mb*100,2) AS pct_used 磁盘组使用率%
FROM v$asm_diskgroup;
-- 查询数据库归档模式、数据库名称
-- log_mode字段值:ARCHIVELOG=归档模式;NOARCHIVELOG=非归档模式
SELECT name 数据库名, log_mode 归档模式 FROM v$database;
-- 查询归档日志存放目标路径、状态,过滤异常失效/报错的归档路径
-- dest_id:归档路径编号;destination:归档存储路径;target:主/备库归档
SELECT
dest_id 归档路径编号,
destination 归档存储路径,
status 路径状态,
target 归档目标类型
FROM v$archive_dest
WHERE status != 'DEFERRED' AND status != 'ERROR';
-- 列出所有已生成的归档日志文件、序列号、状态、生成时间,按时间倒序(最新在前)
SELECT
name 归档文件完整路径,
sequence# 归档序列号,
status 归档状态,
first_time 归档起始时间
FROM v$archived_log
ORDER BY first_time DESC;
-- 查看闪回恢复区空间使用(归档/备份存放在FRA时使用,判断归档是否占满FRA)
select * from v$FLASH_RECOVERY_AREA_USAGE;
-- 查看数据库是否开启归档(RMAN备份、数据恢复必须开启归档模式)
archive log list;
三、表空间空间使用率查询脚本
方案 1:基础表空间统计(只统计已分配数据文件空间,不包含自动扩展上限)
/*
用途:统计所有表空间总分配容量、已使用、剩余、使用率
关联逻辑:
a:dba_data_files汇总每个表空间已分配文件总字节
b:dba_free_space汇总每个表空间空闲碎片字节
*/
select a.tablespace_name "表空间名",round(a.bytes/(1024*1024*1024),2) "表空间G",round((a.bytes-b.bytes)/(1024*1024*1024),2) "已使用G",
round(b.bytes/(1024*1024*1024),2) "剩余空间 G",round(((a.bytes-b.bytes)/a.bytes)*100,2) "使用率%"
from
(select tablespace_name,sum(bytes) bytes from dba_data_files group by
tablespace_name) a,
(select tablespace_name,sum(bytes) bytes,max(bytes) largest from dba_free_space
group by tablespace_name) b
where a.tablespace_name=b.tablespace_name
order by ((a.bytes-b.bytes)/a.bytes) desc;
-- 使用率从高到低排序,快速定位满表空间
-- 1. 查询xxx表空间下所有数据文件,按文件ID排序,用于查看文件路径、大小、自动扩展属性
select * from dba_data_files where tablespace_name = 'xxx' order by file_id;
-- 2.表空间新增数据文件扩容语句
/*
参数说明:
/data1/u01/oradata/bigdata/xxx.bdf :数据文件物理路径
SIZE 30G :文件初始大小30GB
AUTOEXTEND ON NEXT 1G :自动扩容,每次扩容1GB
MAXSIZE unlimited :无扩容上限
注意:路径必须存在,oracle用户拥有读写权限;文件名不能重复
*/
ALTER TABLESPACE xxx ADD DATAFILE '/.../xxx.bdf' SIZE 30G AUTOEXTEND ON NEXT 1G MAXSIZE unlimited;
-- 【补充扩容方式】已有文件扩容(无需新增文件,直接扩大现有文件)
-- alter database datafile '/.../xxx.bdf' resize 80G;
方案 2:完整版表空间统计(支持自动扩展数据文件,计算真实最大可扩容容量)
/*
优势:区分自动扩展文件的最大容量,统计【真实总上限】【已分配】【已使用】【真实空闲】
alloc:当前所有数据文件已占用物理磁盘大小
total:如果文件支持自动扩展,取MAXBYTES最大上限;不支持则等于alloc
free:表空间内空闲碎片
total_free:还能写入的总空间(空闲碎片 + 数据文件可自动扩容空间)
*/
-- 设置输出格式:行宽200、每页2000行,避免字段折行,所有查询前推荐执行
set lines 200 pages 2000
select
tablespace_name 表空间名称,
round((alloc - free) / total * 100) as "真实使用率%",
round(free + (total - alloc),2) as "可扩容总空闲(G)",
round(total,2) as "最大扩容上限(G)",
round(alloc,2) as "当前已分配磁盘(G)",
round(alloc - free,2) as "表空间已使用(G)",
round(free,2) as "表空间碎片空闲(G)"
from (
select
tablespace_name,
-- 计算表空间理论最大容量:自动扩展取maxbytes,固定大小取当前bytes
sum(decode(autoextensible,'YES',maxbytes / 1024 / 1024/1024,'NO',bytes / 1024 / 1024/1024)) total,
sum(bytes / 1024 / 1024 / 1024) alloc -- 当前文件占用磁盘大小
from dba_data_files
group by tablespace_name
) a,
(
select tablespace_name, sum(bytes / 1024 / 1024 / 1024) free -- 空闲碎片总和
from dba_free_space
group by tablespace_name
) b
where a.tablespace_name = b.tablespace_name
order by "真实使用率%" desc;
四、库元数据导出(表注释、字段注释,用于数据字典)
/*
作用:导出xxx各业务用户下带中文注释的业务表,生成数据字典
过滤规则:
1. 过滤无中文注释、注释含乱码?的表
2. 过滤系统内部表(带$后缀)
关联视图:
DBA_TABLES:表基础信息(行数、表名、归属用户)
DBA_TAB_COMMENTS:表中文注释
*/
SELECT
'' 系统编码,
'xxx数据库' 系统名称,
A.OWNER 用户名,
A.TABLE_NAME 表名_英文,
B.COMMENTS 表名_中文,
'' 业务表单名称,
'' 一级分类,
'' 二级分类,
A.NUM_ROWS 记录条数 -- 统计分析后的表行数,未分析会显示NULL
FROM DBA_TABLES A, DBA_TAB_COMMENTS B
where
B.comments is not null
and B.comments not like '%?%' -- 过滤乱码注释
and A.TABLE_NAME not like '%$%' -- 过滤系统临时表/内部表
and A.OWNER = B.OWNER
AND A.TABLE_NAME = B.TABLE_NAME
ORDER BY 1, 2, 3, 4;
/*
作用:导出表所有字段、中文注释、字段类型、是否主键、是否允许为空
关联视图:
DBA_TAB_COLUMNS:字段基础信息(类型、可空)
DBA_COL_COMMENTS:字段中文注释
子查询逻辑:匹配主键约束,标记主键字段
*/
select
'xxx应用数据库' 系统名称,
A.OWNER 用户名,
A.TABLE_NAME 表名_英文,
A.COLUMN_NAME 字段名_英文,
B.COMMENTS 字段名_中文,
A.DATA_TYPE 字段数据类型,
'' 对应代码表名称_英文,
-- 子查询判断当前字段是否为主键约束字段,是则输出"主键"
DECODE((SELECT COUNT(*)
FROM DBA_CONS_COLUMNS P, DBA_CONSTRAINTS T
WHERE T.OWNER = A.OWNER
AND T.OWNER = P.OWNER
AND T.TABLE_NAME = P.TABLE_NAME
AND T.CONSTRAINT_NAME = P.CONSTRAINT_NAME
AND T.TABLE_NAME = A.TABLE_NAME
AND P.COLUMN_NAME = A.COLUMN_NAME
AND T.CONSTRAINT_TYPE = 'P'), -- CONSTRAINT_TYPE='P'代表主键
'1','主键','0','') 主键标识,
-- DECODE转换:N=不允许为空,标记"非空";Y允许为空,空输出
DECODE(A.NULLABLE, 'N', '非空', '') 可空标识
from DBA_TAB_COLUMNS A ,DBA_COL_COMMENTS B
where
B.comments is not null
and B.comments not like '%?%'
and A.TABLE_NAME not like '%$%'
and A.OWNER = B.OWNER
AND A.TABLE_NAME = B.TABLE_NAME
AND A.COLUMN_NAME = B.COLUMN_NAME;
五、段对象大小统计(xxx 表空间内大表 / 大索引排查)
/*
用途:统计xxx表空间下所有段(表、索引、分区表、回滚段等)占用空间,快速定位超大对象
SEGMENT_TYPE:TABLE表 / INDEX索引 / PARTITION分区 / LOBSEGMENT大字段段
注释:注释AND SEGMENT_TYPE = 'TABLE' 可只查询表,取消注释过滤索引
*/
SELECT
OWNER 对象归属用户,
SEGMENT_NAME 对象名称,
SEGMENT_TYPE 对象类型,
TABLESPACE_NAME 所属表空间,
ROUND(SUM(BYTES)/1024/1024/1024, 2) AS SIZE_GB 对象占用GB
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME = 'xxx'
--AND SEGMENT_TYPE = 'TABLE' -- 取消注释只查询表,排除索引
GROUP BY OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME
ORDER BY SIZE_GB DESC; -- 从大到小排序,优先清理/优化大对象
六、分区表信息查询
/*
用途:查询分区表每个分区的上限值、数据行数、最后统计时间,用于分区清理、分区扩容
PARTITION_POSITION:分区顺序,按顺序展示分区
HIGH_VALUE:分区上限值,分区范围分区核心字段
NUM_ROWS:分区内数据量,判断冷热分区
*/
SELECT
table_owner 分区表归属用户,
PARTITION_NAME 分区名称,
HIGH_VALUE 分区上限值,
NUM_ROWS 分区记录行数,
LAST_ANALYZED 最后统计分析时间
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME = 'xxx'
--AND table_owner = 'xxxPROFILE' -- 取消注释限定指定用户分区表
ORDER BY PARTITION_POSITION; -- 按分区创建顺序排序
七、数据库锁阻塞会话排查
/*
原理:
v$lock l1.block=1:持有锁、阻塞其他会话的会话
v$lock l2.request>0:正在等待锁、被阻塞的会话
关联v$session获取会话用户名、机器、SID、执行SQL_ID
适用场景:页面卡住、数据库响应缓慢、ORA-00060死锁报错
*/
SELECT
s1.username || '@' || s1.machine || ' (SID=' || s1.sid || ') 阻塞了 ' ||
s2.username || '@' || s2.machine || ' (SID=' || s2.sid || ')' AS 阻塞关系,
s1.sql_id AS 阻塞会话SQL_ID,
s2.sql_id AS 被阻塞会话SQL_ID
FROM v$lock l1, v$session s1, v$lock l2, v$session s2
WHERE
l1.block = 1 -- 当前会话持有锁,阻塞他人
AND l2.request > 0 -- 其他会话正在等待锁资源
AND l1.id1 = l2.id1 AND l1.id2 = l2.id2 -- 锁定同一资源(表/行)
AND l1.sid = s1.sid AND l2.sid = s2.sid;
-- 【补充:杀掉阻塞会话】查到SID后执行,谨慎操作,业务高峰期禁止
-- alter system kill session 'SID,序列号';
-- 查询会话序列号:select sid,serial# from v$session where sid=xxx;
八、RMAN 归档日志清理全套操作
# 1. 指定目标实例,登录RMAN(必须oracle用户执行)
export ORACLE_SID=*******
rman target /
# 2. 校验所有归档日志物理文件是否存在,标记丢失归档为expired过期
crosscheck archivelog all;
# 3. 自动删除7天前归档,noprompt无需手动确认,高危!提前确认备份策略
# 注意:归档删除前必须确认全量备份已完成,删除后无法恢复7天前数据
delete noprompt archivelog all completed before 'sysdate-7';
# 保留3天归档(根据业务恢复策略二选一执行,不要同时执行)
delete noprompt archivelog all completed before 'sysdate-3';
# 4. 删除crosscheck标记为丢失、过期的归档文件
delete noprompt expired archivelog all;
# 5. 删除超出RMAN备份保留策略的备份集、镜像副本
delete noprompt obsolete;
# 退出RMAN命令
exit;