Oracle 數(shù)據(jù)庫巡檢命令手冊
前言
如果給你一個全新的Oracle單機數(shù)據(jù)庫環(huán)境,作為DBA,您需要關注哪些點?本文僅討論 Linux 主機~
注意:首先申明本文所述并非標準答案,只是個人的一些見解,歡迎👏🏻大家補充完善~
一、 主機層面
1、 主機版本和Oracle版本
「主機版本:」
- cat /etc/system-release
- cat /etc/redhat-release
「Oracle版本和補丁版本:」
- sqlplus -version
- opatch lspatches
2、 主機硬件資源
包括CPU負載,物理內(nèi)存和磁盤使用。
「CPU負載和內(nèi)存:」
- top
- free -m
⚠️ 需要注意主機的CPU負載和物理內(nèi)存使用是否異常,Swap是否被過多使用。
「磁盤使用情況:」
- lsblk
- fdisk -l
- df -Th
⚠️ 顯而易見,需要關注磁盤使用情況,是否存在使用率過高。
3、 計劃任務 crontab
一般計劃任務會布置一些備份策略或者歸檔刪除的策略,我們可以通過crontab來查看:
- crontab -l
4、 檢查 Hosts 文件和網(wǎng)絡配置
- cat /etc/hosts
- ip addr
- nmcli connection show
5、 檢查系統(tǒng)參數(shù)文件
- cat /etc/sysctl.conf
⚠️ 需注意是否有設置非常規(guī)參數(shù)。
6、 檢查 rc.local 文件
rc.local文件用于配置開機自啟動腳本,一般會設置關閉透明大頁或者Oracle數(shù)據(jù)庫開機自啟。
- cat /etc/rc.local
7、環(huán)境變量配置
查看環(huán)境變量配置,進一步熟悉環(huán)境。
- cat ~/.bash_profile
- cat /home/oracle/.bash_profile
8、 檢查系統(tǒng)服務
- systemctl status firewalld.service
- getenforce
- cat /proc/cmdline
- cat /etc/sysconfig/network
二、數(shù)據(jù)庫層面
1、查看數(shù)據(jù)庫實例和監(jiān)聽
- ps -ef|grep smon
- su - oracle
- lsnrctl status
2、 數(shù)據(jù)庫表空間使用
- 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;
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;
4、 檢查控制文件冗余
查看控制文件數(shù)量和位置,是否處于多份冗余狀態(tài)。
- sqlplus / as sysdba
- show parameter control_files
- select name from v$controlfile;
5、 檢查參數(shù)文件
查看數(shù)據(jù)庫參數(shù)文件,檢查參數(shù)使用是否正常。
- sqlplus / as sysdba
- show parameter spfile
- create pfile='/home/oracle/pfile.ora' from spfile;
- strings /home/oracle/pfile.ora
6、 歸檔和閃回是否開啟
- sqlplus / as sysdba
- archive log list
- select open_mode,log_mode,flashback_on,force_logging from v$database;
7、 檢查在線日志和切換頻率
「查看在線日志大?。骸?/p>
- 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;
「查看在線日志切換頻率:」
- 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;
8、 查看數(shù)據(jù)庫字符集
- select * from nls_database_parameters;
9、 檢查無效對象
- SELECT owner,object_name,object_type,status
- FROM dba_objects
- WHERE status <> 'VALID'
- ORDER BY owner,object_name;
10、 檢查分區(qū)表對象
- 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;
需要注意分區(qū)的最大擴展分區(qū),是否需要擴展,建議提前進行擴展,避免拆分。
三、報告層面
通過 Oracle 自帶的 awr、ash、awrsqrpt等等報告可以清晰了解當前數(shù)據(jù)庫的情況。
1、awr 報告
AWR 包含了數(shù)據(jù)庫運行情況的詳細信息收集,常用于分析收集性能問題。
- sqlplus / as sysdba @?/rdbms/admin/awrrpt.sql
通過以上命令可以生成 AWR 報告,過程中需要填寫 生成報告類型,抓取時間段!
2.ash 報告
ash 能抓取到比 AWR 報告更細節(jié)的信息,可以精確到分鐘,也較為常用。
- sqlplus / as sysdba @?/rdbms/admin/ashrpt.sql
如上為生成方式,可選時間段,默認為獲取當前時間到15分鐘前的報告。
3、 awrsqrpt 報告
用于分析單條 SQL 出現(xiàn)性能問題時的報告,需要知道 SQL_ID。
- sqlplus / as sysdba @?/rdbms/admin/awrsqrpt.sql
需要填寫時間段和sql_id來獲取相關sql的報告。
4、 sqltrpt 報告
通常與 awrsqrpt 報告一起使用,可獲取 Oracle 提供的關于 SQL 的優(yōu)化建議,一般來說推薦創(chuàng)建索引和profile較多,適合新手來優(yōu)化sql使用。
- sqlplus / as sysdba @?/rdbms/admin/sqltrpt.sql
只需要 SQL_ID 即可。
5、 addmrpt 報告
addmrpt 是 oracle 通過對 awr 報告進行自動診斷生成的報告。
- sqlplus / as sysdba @?/rdbms/admin/addmrpt.sql
僅作參考作用,真實幫助的意義并不大。過程需要輸入時間段。
6、健康檢查報告
此類健康檢查報告,一般為個人編寫腳本執(zhí)行產(chǎn)生的報告,檢查結果根據(jù)個人自行定義,通常會包含以上所需信息。當然 Oracle 官方也提供了完整數(shù)據(jù)庫的報告生成方式,這里不做過多介紹,需要的朋友可以聯(lián)系我獲取。
寫在最后
通過以上這些檢查,相信對你新接觸的這個數(shù)據(jù)庫系統(tǒng)已經(jīng)有了一個大概的了解,接來下,只需要再慢慢的深入分析,然后制訂出一套符合實際情況的運維規(guī)范來。