大家好,這里是公眾號 DBA學習之路,分享一些學習數據庫路上的知識和經驗。

目錄
- ?? 前言 ??
- 一、?? 主機層面 ??
- 1、?? 主機版本和Oracle版本
- 2、?? 主機硬件資源
- 3、?? 計劃任務 crontab
- 4、?? 檢查 Hosts 文件和網絡配置
- 5、?? 檢查系統參數文件
- 6、?? 檢查 rc.local 文件
- 7、?? 環境變量配置
- 8、?? 檢查系統服務
- 二、?? 數據庫層面 ??
- 1、?? 查看數據庫實例和監聽
- 2、?? 數據庫表空間使用
- 3、?? 檢查RMAN備份情況
- 4、?? 檢查控制文件冗余
- 5、?? 檢查參數文件
- 6、?? 歸檔和閃回是否開啟
- 7、?? 檢查在線日志和切換頻率
- 8、?? 查看數據庫字符集
- 9、?? 檢查無效對象
- 10、?? 檢查分區表對象
- 三、?? 報告層面 ??
- ?? 寫在最后 ??
- 往期精彩文章
?? 前言 ??
如果給你一個全新的Oracle單機數據庫環境,作為DBA,您需要關注哪些點?本文僅討論 Linux 主機~
?? 首先申明本文所述并非標準答案,只是個人的一些見解,歡迎????大家補充完善~
首先,當然是確認是單機還是集群模式的數據庫!本文主要講解單機數據庫。
一、?? 主機層面 ??
1、?? 主機版本和Oracle版本
主機版本:
cat /etc/system-release cat /etc/redhat-release

Oracle版本和補丁版本:
sqlplus -version opatch lspatches

2、?? 主機硬件資源
包括CPU負載,物理內存和磁盤使用。
CPU負載和內存:
top free -m


?? 需要注意主機的CPU負載和物理內存使用是否異常,Swap是否被過多使用。
磁盤使用情況:
lsblk fdisk -l df -Th

?? 顯而易見,需要關注磁盤使用情況,是否存在使用率過高。
3、?? 計劃任務 crontab
一般計劃任務會布置一些備份策略或者歸檔刪除的策略,我們可以通過crontab來查看:
crontab -l

4、?? 檢查 Hosts 文件和網絡配置
cat /etc/hosts ip addr nmcli connection show


5、?? 檢查系統參數文件
cat /etc/sysctl.conf

?? 需注意是否有設置非常規參數。
6、?? 檢查 rc.local 文件
rc.local文件用于配置開機自啟動腳本,一般會設置關閉透明大頁或者Oracle數據庫開機自啟。
cat /etc/rc.local

7、?? 環境變量配置
查看環境變量配置,進一步熟悉環境。
cat ~/.bash_profile cat /home/oracle/.bash_profile


8、?? 檢查系統服務
systemctl status firewalld.service getenforce cat /proc/cmdline cat /etc/sysconfig/network

二、?? 數據庫層面 ??
1、?? 查看數據庫實例和監聽
ps -ef|grep smon su - oracle lsnrctl status


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;

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、?? 檢查控制文件冗余
查看控制文件數量和位置,是否處于多份冗余狀態。
sqlplus / as sysdba
show parameter control_files
select name from v$controlfile;


5、?? 檢查參數文件
查看數據庫參數文件,檢查參數使用是否正常。
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、?? 檢查在線日志和切換頻率
查看在線日志大小:
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、?? 查看數據庫字符集
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、?? 檢查分區表對象
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;

需要注意分區的最大擴展分區,是否需要擴展,建議提前進行擴展,避免拆分。
三、?? 報告層面 ??
通過 Oracle 自帶的 awr、ash、awrsqrpt等等報告可以清晰了解當前數據庫的情況。
?? 1、awr 報告
AWR 包含了數據庫運行情況的詳細信息收集,常用于分析收集性能問題。
sqlplus / as sysdba @?/rdbms/admin/awrrpt.sql
通過以上命令可以生成 AWR 報告,過程中需要填寫 生成報告類型,抓取時間段,具體如何使用請自行查詢,也可關注我公眾號免費獲取 awr 鷹眼調優視頻教程。

?? 2、ash 報告
ash 能抓取到比 AWR 報告更細節的信息,可以精確到分鐘,也較為常用。
sqlplus / as sysdba @?/rdbms/admin/ashrpt.sql
如上為生成方式,可選時間段,默認為獲取當前時間到15分鐘前的報告。
?? 3、awrsqrpt 報告
用于分析單條 SQL 出現性能問題時的報告,需要知道 SQL_ID。
sqlplus / as sysdba @?/rdbms/admin/awrsqrpt.sql
需要填寫時間段和sql_id來獲取相關sql的報告。
?? 4、sqltrpt 報告
通常與 awrsqrpt 報告一起使用,可獲取 Oracle 提供的關于 SQL 的優化建議,一般來說推薦創建索引和profile較多,適合新手來優化sql使用。
sqlplus / as sysdba @?/rdbms/admin/sqltrpt.sql
只需要 SQL_ID 即可。
?? 5、addmrpt 報告
addmrpt 是 oracle 通過對 awr 報告進行自動診斷生成的報告。
sqlplus / as sysdba @?/rdbms/admin/addmrpt.sql
僅作參考作用,真實幫助的意義并不大。過程需要輸入時間段。
?? 6、健康檢查報告
此類健康檢查報告,一般為個人編寫腳本執行產生的報告,檢查結果根據個人自行定義,通常會包含以上所需信息。當然 Oracle 官方也提供了完整數據庫的報告生成方式,這里不做過多介紹,需要的朋友可以聯系我獲取。
?? 寫在最后 ??
通過以上這些檢查,相信對你新接觸的這個數據庫系統已經有了一個大概的了解,接來下,只需要再慢慢的深入分析,然后制訂出一套符合實際情況的運維規范來。
ヾ(?°?°?)??
往期精彩文章
Oracle 一鍵巡檢自動生成 Word 報告
Oracle 一鍵安裝合集
Oracle一鍵安裝腳本的 21 個疑問與解答
Oracle一鍵巡檢腳本的 21 個疑問與解答
全網首發:Oracle 23ai 一鍵安裝腳本(非 RPM)
Oracle 19C 最新 RU 補丁 19.24 ,一鍵安裝!
Oracle Linux 7.9 一鍵安裝 Oracle 19C
RedHat 9.4(aarch64) 一鍵安裝 Oracle 19C
openEuler 22.03 LTS SP4 一鍵安裝 Oracle 19C RAC
RHEL 7.9 一鍵安裝 Oracle 19C 19.23 RAC
Oracle DataGuard GAP 修復手冊
優化 Oracle:最佳實踐與開發規范
DBA 必備:Linux 軟件源配置全攻略
Linux 一鍵配置時鐘同步全攻略





