Oracle 数据库巡检命令手册

时间:2022-02-19 21:27:48

Oracle 数据库巡检命令手册

前言

如果给你一个全新的Oracle单机数据库环境,作为DBA,您需要关注哪些点?本文仅讨论 Linux 主机~

注意:首先申明本文所述并非标准答案,只是个人的一些见解,欢迎大家补充完善~

一、 主机层面

1、 主机版本和Oracle版本

「主机版本:」

  1. cat /etc/system-release
  2. cat /etc/redhat-release

Oracle 数据库巡检命令手册

「Oracle版本和补丁版本:」

  1. sqlplus -version
  2. opatch lspatches

Oracle 数据库巡检命令手册

2、 主机硬件资源

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

「CPU负载和内存:」

  1. top
  2. free -m

Oracle 数据库巡检命令手册

Oracle 数据库巡检命令手册

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

「磁盘使用情况:」

  1. lsblk
  2. fdisk -l
  3. df -Th

Oracle 数据库巡检命令手册

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

3、 计划任务 crontab

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

  1. crontab -l

Oracle 数据库巡检命令手册

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

  1. cat /etc/hosts
  2. ip addr
  3. nmcli connection show

Oracle 数据库巡检命令手册

Oracle 数据库巡检命令手册

5、 检查系统参数文件

  1. cat /etc/sysctl.conf

Oracle 数据库巡检命令手册

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

6、 检查 rc.local 文件

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

  1. cat /etc/rc.local

Oracle 数据库巡检命令手册

7、环境变量配置

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

  1. cat ~/.bash_profile
  2. cat /home/oracle/.bash_profile

Oracle 数据库巡检命令手册

Oracle 数据库巡检命令手册

8、 检查系统服务

  1. systemctl status firewalld.service
  2. getenforce
  3. cat /proc/cmdline
  4. cat /etc/sysconfig/network

Oracle 数据库巡检命令手册

二、数据库层面

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

  1. ps -ef|grep smon
  2. su - oracle
  3. lsnrctl status

Oracle 数据库巡检命令手册

Oracle 数据库巡检命令手册

2、 数据库表空间使用

  1. sqlplus / as sysdba
  2. col TABLESPACE_NAME for a20
  3. select tbs_used_info.tablespace_name,
  4. tbs_used_info.alloc_mb,
  5. tbs_used_info.used_mb,
  6. tbs_used_info.max_mb,
  7. tbs_used_info.free_of_max_mb,
  8. tbs_used_info.used_of_max || '%' used_of_max_pct
  9. from (select a.tablespace_name,
  10. round(a.bytes_alloc / 1024 / 1024) alloc_mb,
  11. round((a.bytes_alloc - nvl(b.bytes_free,
  12. 0)) / 1024 / 1024) used_mb,
  13. round((a.bytes_alloc - nvl(b.bytes_free,
  14. 0)) * 100 / a.maxbytes) used_of_max,
  15. round((a.maxbytes - a.bytes_alloc + nvl(b.bytes_free,
  16. 0)) / 1048576) free_of_max_mb,
  17. round(a.maxbytes / 1048576) max_mb
  18. from (select f.tablespace_name,
  19. sum(f.bytes) bytes_alloc,
  20. sum(decode(f.autoextensible,
  21. 'YES',
  22. f.maxbytes,
  23. 'NO',
  24. f.bytes)) maxbytes
  25. from dba_data_files f
  26. group by tablespace_name) a,
  27. (select f.tablespace_name,
  28. sum(f.bytes) bytes_free
  29. from dba_free_space f
  30. group by tablespace_name) b
  31. where a.tablespace_name = b.tablespace_name(+)) tbs_used_info
  32. order by tbs_used_info.used_of_max desc;

Oracle 数据库巡检命令手册

3、检查RMAN备份情况

  1. rman target /
  2. list backup;
  3.  
  4. sqlplus / as sysdba
  5. col status for a10
  6. col input_type for a20
  7. col INPUT_BYTES_DISPLAY for a10
  8. col OUTPUT_BYTES_DISPLAY for a10
  9. col TIME_TAKEN_DISPLAY for a10
  10.  
  11. select input_type,
  12. status,
  13. to_char(start_time,
  14. 'yyyy-mm-dd hh24:mi:ss'),
  15. to_char(end_time,
  16. 'yyyy-mm-dd hh24:mi:ss'),
  17. input_bytes_display,
  18. output_bytes_display,
  19. time_taken_display,
  20. COMPRESSION_RATIO
  21. from v$rman_backup_job_details
  22. where start_time > date '2021-07-01'
  23. order by 3 desc;

Oracle 数据库巡检命令手册

4、 检查控制文件冗余

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

  1. sqlplus / as sysdba
  2. show parameter control_files
  3. select name from v$controlfile;

Oracle 数据库巡检命令手册

Oracle 数据库巡检命令手册

5、 检查参数文件

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

  1. sqlplus / as sysdba
  2. show parameter spfile
  3. create pfile='/home/oracle/pfile.ora' from spfile;
  4.  
  5. strings /home/oracle/pfile.ora

Oracle 数据库巡检命令手册

Oracle 数据库巡检命令手册

6、 归档和闪回是否开启

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

Oracle 数据库巡检命令手册

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

「查看在线日志大小:」

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

Oracle 数据库巡检命令手册

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

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

8、 查看数据库字符集

  1. select * from nls_database_parameters;

Oracle 数据库巡检命令手册

9、 检查无效对象

  1. SELECT owner,object_name,object_type,status
  2. FROM dba_objects
  3. WHERE status <> 'VALID'
  4. ORDER BY owner,object_name;

Oracle 数据库巡检命令手册

10、 检查分区表对象

  1. set line222
  2. col high_value for a100
  3. select t2.TABLE_OWNER,t1.table_name, t1.max_partition_name, t2.high_value
  4. from (select table_name, max(partition_name) as max_partition_name
  5. from dba_tab_partitions
  6. group by table_name) t1,
  7. (select TABLE_OWNER,table_name, partition_name, high_value
  8. from dba_tab_partitions
  9. where tablespace_name not in ('SYSAUX', 'SYSTEM')) t2
  10. where t1.table_name = t2.table_name
  11. and t1.max_partition_name = t2.partition_name
  12. order by 1,2;

Oracle 数据库巡检命令手册

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

三、报告层面

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

1、awr 报告

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

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

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

2.ash 报告

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

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

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

3、 awrsqrpt 报告

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

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

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

4、 sqltrpt 报告

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

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

只需要 SQL_ID 即可。

5、 addmrpt 报告

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

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

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

6、健康检查报告

此类健康检查报告,一般为个人编写脚本执行产生的报告,检查结果根据个人自行定义,通常会包含以上所需信息。当然 Oracle 官方也提供了完整数据库的报告生成方式,这里不做过多介绍,需要的朋友可以联系我获取。

写在最后

通过以上这些检查,相信对你新接触的这个数据库系统已经有了一个大概的了解,接来下,只需要再慢慢的深入分析,然后制订出一套符合实际情况的运维规范来。

原文链接:https://mp.weixin.qq.com/s/vLtJ2zH_TnyQxKyVddzMRg