Oracle运维常用命令

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;