Oracle 数据库巡检命令手册

137 阅读3分钟

一、 主机层面

1、 主机版本和Oracle版本

「主机版本:」

复制

cat /etc/system-release 
cat /etc/redhat-release 
1.2.

「Oracle版本和补丁版本:」

复制

sqlplus -version 
opatch lspatches 
1.2.

2、 主机硬件资源

包括CPU负载,物理内存和磁盘使用。

「CPU负载和内存:」

复制

top 
free -m 
1.2.

⚠️ 需要注意主机的CPU负载和物理内存使用是否异常,Swap是否被过多使用。

「磁盘使用情况:」

复制

lsblk 
fdisk -l 
df -Th 
1.2.3.

⚠️ 显而易见,需要关注磁盘使用情况,是否存在使用率过高。

3、 计划任务 crontab

一般计划任务会布置一些备份策略或者归档删除的策略,我们可以通过crontab来查看:

复制

crontab -l 
1.

4、 检查 Hosts 文件和网络配置

复制

cat /etc/hosts 
ip addr 
nmcli connection show 
1.2.3.

5、 检查系统参数文件

复制

cat /etc/sysctl.conf 
1.

⚠️ 需注意是否有设置非常规参数。

6、 检查 rc.local 文件

rc.local文件用于配置开机自启动脚本,一般会设置关闭透明大页或者Oracle数据库开机自启。

复制

cat /etc/rc.local 
1.

7、环境变量配置

查看环境变量配置,进一步熟悉环境。

复制

cat ~/.bash_profile 
cat /home/oracle/.bash_profile 
1.2.

8、 检查系统服务

复制

systemctl status firewalld.service 
getenforce 
cat /proc/cmdline 
cat /etc/sysconfig/network 
1.2.3.4.

二、数据库层面

1、查看数据库实例和监听

复制

ps -ef|grep smon 
su - oracle 
lsnrctl status 
1.2.3.

2、 数据库表空间使用

复制

sqlplus / as sysdba 
col TABLESPACE_NAME for a20 
select tbs_used_info.tablespace_name, 
       tbs_used_info.alloc_mb, 
       tbs_used_info.used_mb, 
       tbs_used_info.max_mb, 
       tbs_used_info.free_of_max_mb, 
       tbs_used_info.used_of_max || '%' used_of_max_pct 
  from (select a.tablespace_name, 
               round(a.bytes_alloc / 1024 / 1024) alloc_mb, 
               round((a.bytes_alloc - nvl(b.bytes_free, 
                                          0)) / 1024 / 1024) used_mb, 
               round((a.bytes_alloc - nvl(b.bytes_free, 
                                          0)) * 100 / a.maxbytes) used_of_max, 
               round((a.maxbytes - a.bytes_alloc + nvl(b.bytes_free, 
                                                       0)) / 1048576) free_of_max_mb, 
               round(a.maxbytes / 1048576) max_mb 
          from (select f.tablespace_name, 
                       sum(f.bytes) bytes_alloc, 
                       sum(decode(f.autoextensible, 
                                  'YES', 
                                  f.maxbytes, 
                                  'NO', 
                                  f.bytes)) maxbytes 
                  from dba_data_files f 
                 group by tablespace_name) a, 
               (select f.tablespace_name, 
                       sum(f.bytes) bytes_free 
                  from dba_free_space f 
                 group by tablespace_name) b 
         where a.tablespace_name = b.tablespace_name(+)) tbs_used_info 
 order by tbs_used_info.used_of_max desc; 
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.

3、检查RMAN备份情况

复制

rman target / 
list backup; 
 
sqlplus / as sysdba 
col status for a10 
col input_type for a20 
col INPUT_BYTES_DISPLAY for a10 
col OUTPUT_BYTES_DISPLAY for a10 
col TIME_TAKEN_DISPLAY for a10 
 
select input_type, 
       status, 
       to_char(start_time, 
               'yyyy-mm-dd hh24:mi:ss'), 
       to_char(end_time, 
               'yyyy-mm-dd hh24:mi:ss'), 
       input_bytes_display, 
       output_bytes_display, 
       time_taken_display, 
       COMPRESSION_RATIO 
  from v$rman_backup_job_details 
 where start_time > date '2021-07-01' 
 order by 3 desc; 
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.

4、 检查控制文件冗余

查看控制文件数量和位置,是否处于多份冗余状态。

复制

sqlplus / as sysdba 
show parameter control_files 
select name from v$controlfile; 
1.2.3.

5、 检查参数文件

查看数据库参数文件,检查参数使用是否正常。

复制

sqlplus / as sysdba 
show parameter spfile 
create pfile='/home/oracle/pfile.ora' from spfile; 
 
strings /home/oracle/pfile.ora 
1.2.3.4.5.

6、 归档和闪回是否开启

复制

sqlplus / as sysdba 
archive log list 
select open_mode,log_mode,flashback_on,force_logging from v$database; 
1.2.3.

7、 检查在线日志和切换频率

「查看在线日志大小:」

复制

set line222 
col member for a100 
select f.group#,f.member,l.sequence#,l.bytes/1024/1024,l.archived,l.status,l.first_time  
from v$logfile f,v$log l  
where f.group# = l.group#  
order by f.group#,f.member; 
1.2.3.4.5.6.

「查看在线日志切换频率:」

复制

col day for a30 
SELECT 
  SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH:MI:SS'),1,5)  DAY, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'00',1,0)) H00, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'01',1,0)) H01, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'02',1,0)) H02, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'03',1,0)) H03, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'04',1,0)) H04, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'05',1,0)) H05, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'06',1,0)) H06, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'07',1,0)) H07, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'08',1,0)) H08, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'09',1,0)) H09, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'10',1,0)) H10, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'11',1,0)) H11, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'12',1,0)) H12, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'13',1,0)) H13, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'14',1,0)) H14, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'15',1,0)) H15, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'16',1,0)) H16, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'17',1,0)) H17, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'18',1,0)) H18, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'19',1,0)) H19, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'20',1,0)) H20, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'21',1,0)) H21, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'22',1,0)) H22, 
  SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'23',1,0)) H23, 
  COUNT(*)                                                                      TOTAL 
FROM 
  v$log_history  a where SYSDATE - first_time < 35 
GROUP BY SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH:MI:SS'),1,5) order by 1; 
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.

8、 查看数据库字符集

复制

select * from nls_database_parameters; 
1.

9、 检查无效对象

复制

SELECT owner,object_name,object_type,status 
FROM dba_objects 
WHERE status <> 'VALID' 
ORDER BY owner,object_name; 
1.2.3.4.

10、 检查分区表对象

复制

set line222 
col high_value for a100 
select t2.TABLE_OWNER,t1.table_name, t1.max_partition_name, t2.high_value 
  from (select table_name, max(partition_name) as max_partition_name 
          from dba_tab_partitions 
         group by table_name) t1, 
       (select TABLE_OWNER,table_name, partition_name, high_value 
          from dba_tab_partitions 
         where tablespace_name not in ('SYSAUX', 'SYSTEM')) t2 
 where t1.table_name = t2.table_name 
   and t1.max_partition_name = t2.partition_name 
   order by 1,2; 
1.2.3.4.5.6.7.8.9.10.11.12.

需要注意分区的最大扩展分区,是否需要扩展,建议提前进行扩展,避免拆分。

三、报告层面

通过 Oracle 自带的 awr、ash、awrsqrpt等等报告可以清晰了解当前数据库的情况。

1、awr 报告

AWR 包含了数据库运行情况的详细信息收集,常用于分析收集性能问题。

复制

sqlplus / as sysdba @?/rdbms/admin/awrrpt.sql 
1.

通过以上命令可以生成 AWR 报告,过程中需要填写 生成报告类型,抓取时间段!

2.ash 报告

ash 能抓取到比 AWR 报告更细节的信息,可以精确到分钟,也较为常用。

复制

sqlplus / as sysdba @?/rdbms/admin/ashrpt.sql 
1.

如上为生成方式,可选时间段,默认为获取当前时间到15分钟前的报告。

3、 awrsqrpt 报告

用于分析单条 SQL 出现性能问题时的报告,需要知道 SQL_ID。

复制

sqlplus / as sysdba @?/rdbms/admin/awrsqrpt.sql 
1.

需要填写时间段和sql_id来获取相关sql的报告。

4、 sqltrpt 报告

通常与 awrsqrpt 报告一起使用,可获取 Oracle 提供的关于 SQL 的优化建议,一般来说推荐创建索引和profile较多,适合新手来优化sql使用。

复制

sqlplus / as sysdba @?/rdbms/admin/sqltrpt.sql 
1.

只需要 SQL_ID 即可。

5、 addmrpt 报告

addmrpt 是 oracle 通过对 awr 报告进行自动诊断生成的报告。

复制

sqlplus / as sysdba @?/rdbms/admin/addmrpt.sql 
1.

仅作参考作用,真实帮助的意义并不大。过程需要输入时间段。

6、健康检查报告

此类健康检查报告,一般为个人编写脚本执行产生的报告,检查结果根据个人自行定义,通常会包含以上所需信息。