暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C一键巡检脚本分享



今日分享oracle 19c一键巡检脚本,脚本需要oracle用户权限,赋予执行权限,一键执行即可。大家可以根据自己的实际情况进行内容的增加和减少。

一、部分过程截图





二、脚本内容

  1. cat oracle_19c_check.sh

  2. #!/bin/bash

  3. # 设置Oracle环境变量

  4. export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1

  5. export ORACLE_SID=cdb19c

  6. export PATH=$PATH:$ORACLE_HOME/bin

  7. echo "=========================主机层面=================================="

  8. cat /etc/system-release

  9. cat /etc/redhat-release

  10. sqlplus -version

  11. opatch lspatches

  12. host_ip=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:")

  13. mkdir /home/$host_ip

  14. mkdir /home/$host_ip/$(date +'%Y%m%d')

  15. cur_time=$(date '+%Y-%m-%d %H:%M:%S')

  16. echo " 现在是时间:$cur_time,服务器ip: $host_ip,巡检记录情况!"

  17. echo "

  18. **系统负载信息以及系统运行时间等信息 "

  19. uptime

  20. echo "

  21. ************* *******************"

  22. echo "

  23. 磁盘使用情况

  24. *********** ******************* "

  25. df -h

  26. echo "

  27. *********** *******************"

  28. echo "

  29. 内存使用情况** "

  30. free -m

  31. free -h (可以这个)

  32. echo "

  33. 内存使用情况** "

  34. echo "

  35. CPU使用情况** "

  36. vmstat

  37. echo "

  38. ***********CPU使用情况*************"

  39. echo "

  40. 磁盘使用告警*

  41. ******************* ********************* "

  42. df -Ph | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5,$1 }' | while read output;

  43. do

  44. echo $output

  45. used=$(echo $output | awk '{print $1}' | sed s/%//g)

  46. partition=$(echo $output | awk '{print $2}')

  47. if [ $used -ge 40 ]; then #预警界限,使用的百分比

  48. echo " 警告!警告! $host_ip:上的分区:"$partition" 已使用 $used% $(date),请注意清理! "

  49. fi

  50. echo " 恭喜!$host_ip:磁盘空间正常!使用为$used "

  51. done

  52. crontab -l

  53. # 定义函数用于打印分隔线

  54. print_divider() {

  55. echo "=========================数据库层面=================================="

  56. }

  57. # 检查Oracle服务

  58. print_divider

  59. echo "===== Oracle Services ====="

  60. ps -ef | grep pmon | grep -v grep

  61. if [ $? -eq 0 ]; then

  62. echo "Oracle services are running."

  63. else

  64. echo "Oracle services are not running."

  65. fi

  66. echo ""

  67. print_divider

  68. # 检查监听状态

  69. echo "===== Listener Status ====="

  70. lsnrctl status

  71. echo ""

  72. print_divider

  73. # 登录数据库进行进一步检查

  74. sqlplus -s / as sysdba <<EOF

  75. SET PAGESIZE 1000

  76. SET LINESIZE 200

  77. SET FEEDBACK OFF

  78. SET ECHO OFF

  79. PROMPT ===== 检查版本信息 =====

  80. COL BANNER FORMAT A60 WORD_WRAP

  81. SELECT BANNER FROM V\$VERSION;

  82. PROMPT

  83. PROMPT ===== 检查实例状态 =====

  84. COL INSTANCE_NAME FORMAT A20

  85. COL STATUS FORMAT A10

  86. SELECT INSTANCE_NAME, STATUS FROM V\$INSTANCE;

  87. PROMPT

  88. PROMPT ===== 检查数据库状态 =====

  89. COL NAME FORMAT A20

  90. COL LOG_MODE FORMAT A10

  91. COL OPEN_MODE FORMAT A15

  92. COL DATABASE_ROLE FORMAT A15

  93. SELECT NAME, LOG_MODE, OPEN_MODE, DATABASE_ROLE FROM V\$DATABASE;

  94. PROMPT

  95. PROMPT ===== 检查连接数 =====

  96. COL ACTIVE_SESSIONS FORMAT A20

  97. SELECT COUNT(0) AS ACTIVE_SESSIONS

  98. FROM V\$SESSION

  99. WHERE USERNAME IS NOT NULL AND STATUS = 'ACTIVE';

  100. PROMPT

  101. PROMPT ===== 检查字符集 =====

  102. select userenv('language') from dual;

  103. PROMPT

  104. PROMPT ===== 检查归档打开状态 =====

  105. COL NAME FORMAT A30

  106. COL OPEN_MODE FORMAT A20

  107. COL LOG_MODE FORMAT A20

  108. SELECT NAME, OPEN_MODE, LOG_MODE FROM V\$DATABASE;

  109. ARCHIVE LOG LIST;

  110. PROMPT

  111. PROMPT ===== 查看归档是否有限制=====

  112. COL PARAMETER FORMAT A40

  113. COL VALUE FORMAT A10

  114. SELECT NAME AS PARAMETER, VALUE FROM V\$PARAMETER

  115. WHERE NAME IN ('log_archive_max_logfiles', 'log_archive_max_size');

  116. PROMPT

  117. PROMPT ===== 查看归档配额 =====

  118. COL PARAMETER FORMAT A40

  119. COL VALUE FORMAT A10

  120. SELECT NAME AS PARAMETER, VALUE FROM V\$SYSTEM_PARAMETER

  121. WHERE NAME LIKE 'db_recovery_file_dest%' OR NAME = 'log_archive_max_processes';

  122. PROMPT ===== 检查归档日志的大小 =====

  123. set lines 9999

  124. SELECT SUM(BLOCKS*BLOCK_SIZE)/1024/1024 AS "ARCHIVE LOG SIZE (MB)" FROM V\$ARCHIVED_LOG;

  125. PROMPT

  126. --当前的归档日志信息

  127. SELECT * FROM V\$ARCHIVED_LOG;

  128. PROMPT

  129. PROMPT ===== 归档日志监控=====

  130. set line 100

  131. select trunc(FIRST_TIME) datum,

  132. count(*) total,

  133. round(10 * sum(blocks * block_size) / 1024 / 1024 ) / 10 MB

  134. from v\$archived_log

  135. group by trunc(FIRST_TIME)

  136. order by 1;

  137. PROMPT


  138. PROMPT ===== 检查是否有锁表 =====

  139. select DISTINCT b.object_name,to_char(nvl(c.sql_exec_start,c.prev_exec_start),'yyyymmdd hh24:mi:ss') exec_time,C.STATUS,OSUSER,MACHINE,PROGRAM,NVL(SQL_ID,PREV_SQL_ID) SQL_ID,STATE,BLOCKING_SESSION_STATUS,EVENT,WAIT_CLASS_ID

  140. ,'alter system disconnect session '''||c.SID||','||SERIAL#||',@'||A.INST_ID||''' immediate;' disconnectSQL --执行解锁语句

  141. from GV\$LOCKED_OBJECT a,DBA_OBJECTS b,gv\$session c

  142. where a.object_id=b.object_id and a.inst_id=c.inst_id and a.session_id=c.sid

  143. --and OBJECT_NAME ='TB_TEST' --指定表

  144. --and nvl(c.sql_exec_start,c.prev_exec_start)<sysdate-1/24 --超过1小时

  145. order by 2;

  146. PROMPT

  147. PROMPT ===== 检查Oracle在线日志状态 =====

  148. select

  149. group#,status,type,member

  150. from v\$logfile;

  151. PROMPT

  152. PROMPT ===== 检查表空间是否自动扩展 =====

  153. SELECT

  154. TABLESPACE_NAME,

  155. FILE_NAME,

  156. AUTOEXTENSIBLE,

  157. INCREMENT_BY

  158. FROM

  159. DBA_DATA_FILES

  160. WHERE

  161. AUTOEXTENSIBLE = 'YES';

  162. PROMPT

  163. PROMPT ===== 检查一些扩展异常的对象 =====

  164. select Segment_Name,

  165. Segment_Type,

  166. TableSpace_Name,

  167. (Extents / Max_extents) * 100 Percent

  168. From sys.DBA_Segments

  169. Where Max_Extents != 0

  170. and (Extents / Max_extents) * 100 >= 95

  171. order By Percent;

  172. PROMPT

  173. PROMPT ===== 检查数据库的等待事件=====

  174. set pages 80

  175. set lines 120

  176. col event for a40

  177. select sid, event, p1, p2, p3, WAIT_TIME, SECONDS_IN_WAIT

  178. from v\$session_wait

  179. where event not like 'SQL%'

  180. and event not like 'rdbms%';

  181. PROMPT

  182. PROMPT ===== 检查Disk Read最高的SQL语句的获取=====

  183. SELECT SQL_TEXT

  184. FROM (SELECT * FROM V\$SQLAREA ORDER BY DISK_READS)

  185. WHERE ROWNUM <= 5;

  186. PROMPT


  187. PROMPT ===== 查找前十条性能差的sql=====

  188. set lines 9999

  189. SELECT *

  190. FROM (SELECT PARSING_USER_ID

  191. EXECUTIONS,

  192. SORTS,

  193. COMMAND_TYPE,

  194. DISK_READS,

  195. SQL_TEXT

  196. FROM V\$SQLAREA

  197. ORDER BY DISK_READS DESC)

  198. WHERE ROWNUM < 10;

  199. PROMPT

  200. PROMPT ===== 检查运行很久的SQL=====

  201. COLUMN USERNAME FORMAT A12

  202. COLUMN OPNAME FORMAT A16

  203. COLUMN PROGRESS FORMAT A8


  204. SELECT USERNAME,

  205. SID,

  206. OPNAME,

  207. ROUND(SOFAR * 100 / TOTALWORK, 0) || '%' AS PROGRESS,

  208. TIME_REMAINING,

  209. SQL_TEXT

  210. FROM V\$SESSION_LONGOPS, V\$SQL

  211. WHERE TIME_REMAINING <> 0

  212. AND SQL_ADDRESS = ADDRESS

  213. AND SQL_HASH_VALUE = HASH_VALUE;

  214. PROMPT

  215. PROMPT ===== 检查碎片程度高的表=====

  216. SELECT segment_name table_name, COUNT(*) extents

  217. FROM dba_segments

  218. WHERE owner NOT IN ('SYS', 'SYSTEM')

  219. GROUP BY segment_name

  220. HAVING COUNT(*) = (SELECT MAX(COUNT(*))

  221. FROM dba_segments

  222. GROUP BY segment_name);

  223. PROMPT

  224. -- 检查数据文件与空间类使用情况

  225. PROMPT ===== 检查数据文件与空间类使用情况 =====

  226. PROMPT ===== 各种文件数量 =====

  227. select count(*) from v\$tempfile;

  228. select count(*) from v\$datafile;

  229. PROMPT

  230. PROMPT ===== 数据文件状态 =====

  231. select t.online_status,count(*)

  232. from dba_data_files t

  233. group by t.online_status ;

  234. PROMPT

  235. PROMPT ===== 检查内存的命中率 =====

  236. select 1 - ((physical.value - direct.value - lobs.value) / logical.value)

  237. "Buffer Cache Hit Ratio"

  238. from v\$sysstat physical,v\$sysstat direct,v\$sysstat lobs,v\$sysstat logical

  239. where physical.name = 'physical reads'

  240. and direct.name='physical reads direct'

  241. and lobs.name='physical reads direct (lob)'

  242. and logical.name='session logical reads';

  243. select (1-(sum(getmisses)/sum(gets))) "Dictionary Hit Ratio"

  244. from v\$rowcache;

  245. PROMPT

  246. PROMPT ===== 检查共享池命中率 =====

  247. select sum(pinhits) / sum(pins) * 100 from v\$librarycache;

  248. PROMPT

  249. PROMPT ===== 查看表占用存储及表行数 =====

  250. set lines 9999

  251. SELECT /*+ PARALLEL(8) */ a.owner "用户",A.TABLE_NAME "表名",b.TABLESPACE_NAME "表空间名",B.UNITS/1024/1024/1024 "占用多少GB",A.NUM_ROWS "行数(非实时,可通过表分析更新)",A.PARTITIONED "是否为分区表"

  252. FROM all_TABLES A

  253. LEFT JOIN (SELECT SUM(BYTES) UNITS,OWNER,SEGMENT_NAME,max(TABLESPACE_NAME) TABLESPACE_NAME

  254. FROM dba_SEGMENTS GROUP BY SEGMENT_NAME,OWNER)B

  255. ON (a.TABLE_NAME=b.SEGMENT_NAME and a.owner=b.owner)

  256. WHERE UNITS is not null

  257. ORDER BY 4 DESC;

  258. PROMPT

  259. PROMPT ===== 查看表空间大小 =====

  260. set linesize 200;

  261. col TABLESPACE_NAME for a30;

  262. select a.TABLESPACE_NAME tbs_name,

  263. round(a.BYTES/1024/1024) Total_MB,

  264. round((a.BYTES-nvl(b.BYTES, 0)) /1024/1024) Used_MB,

  265. round((1-((a.BYTES-nvl(b.BYTES,0))/a.BYTES))*100,2) Pct_USED,

  266. nvl(round(b.BYTES/1024/1024), 0) Free_MB ,

  267. auto

  268. from (select TABLESPACE_NAME,

  269. sum(BYTES) BYTES,

  270. max(AUTOEXTENSIBLE) AUTO

  271. from sys.dba_data_files

  272. group by TABLESPACE_NAME) a,

  273. (select TABLESPACE_NAME,

  274. sum(BYTES) BYTES

  275. from sys.dba_free_space

  276. group by TABLESPACE_NAME) b

  277. where a.TABLESPACE_NAME = b.TABLESPACE_NAME (+)

  278. order by ((a.BYTES-b.BYTES)/a.BYTES) desc;

  279. PROMPT

  280. PROMPT ===== 查看表空间实际使用率 =====

  281. set linesize 200;

  282. col owner for a30;

  283. SELECT owner,TABLE_NAME,ROUND((BLOCKS*8192/1024/1024),2)"理论大小M",

  284. ROUND((NUM_ROWS*AVG_ROW_LEN/1024/1024),2)"实际大小M",

  285. ROUND( (BLOCKS * 8192 / 1024 / 1024) - (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024),2) "Data lower than HWM in MB" ,

  286. to_char(round((NUM_ROWS*AVG_ROW_LEN/1024/1024)/(BLOCKS*8192/1024/1024),3)*100,'fm999990.99999')||'%' "实际使用率%"

  287. FROM dba_TABLES where (NUM_ROWS*AVG_ROW_LEN/1024/1024)/(BLOCKS*8192/1024/1024)<0.6

  288. AND OWNER NOT IN ('SYS', 'SYSTEM', 'SYSMAN', 'DMSYS', 'OLAPSYS', 'XDB','EXFSYS', 'CTXSYS','WMSYS', 'DBSNMP', 'ORDSYS', 'OUTLN', 'TSMSYS', 'MDSYS','OGG')

  289. AND BLOCKS NOT IN ('0') ORDER BY 3 DESC;

  290. PROMPT

  291. -- 检查SGA

  292. PROMPT ===== SGA SIZE =====

  293. -- SGA 各部分大小

  294. show sga;

  295. SELECT * FROM V\$SGAINFO;

  296. -- SGA设置大小

  297. show parameter sga_target;

  298. -- SGA各个池大小

  299. COL name FORMAT a32;

  300. SELECT pool, name, bytes/1024/1024 M

  301. FROM v\$sgastat

  302. WHERE pool IS NULL

  303. OR pool != 'shared pool'

  304. OR (pool = 'shared pool' AND

  305. (name IN

  306. ('dictionary cache', 'enqueue', 'library

  307. cache', 'parameters', 'processes', 'sessions', 'free memory')))

  308. ORDER BY pool DESC NULLS FIRST, name;

  309. PROMPT

  310. -- 检查PGA

  311. PROMPT ===== 检查PGA =====

  312. show parameters area_size;

  313. PROMPT

  314. PROMPT ===== 查看buffer cache 命中率 =====

  315. select 1 - (sum(decode(name, 'physical reads', value, 0)) /

  316. (sum(decode(name, 'db block gets', value, 0)) +

  317. (sum(decode(name, 'consistent gets', value, 0))))) "Buffer Hit Ratio"

  318. from v\$sysstat;

  319. select name,

  320. physical_reads,

  321. (consistent_gets + db_block_gets) logic_reads,

  322. 1 - (physical_reads) / (consistent_gets + db_block_gets) hit_radio

  323. from v\$buffer_pool_statistics;

  324. PROMPT

  325. PROMPT ===== 查看cache =====

  326. show parameter cache;

  327. -- 各种读取的统计

  328. -- Database read buffer cache hit ratio =

  329. -- -1 (physical reads / (db block gets + consistent gets))

  330. SELECT to_char(value,'9999999999999'), name FROM V\$SYSSTAT WHERE name IN

  331. ('physical reads', 'db block gets', 'consistent gets');


  332. SELECT 'Database Buffer Cache Hit Ratio ' "Ratio"

  333. , ROUND((1-

  334. ((SELECT SUM(value) FROM V\$SYSSTAT WHERE name = 'physical reads')

  335. / ((SELECT SUM(value) FROM V\$SYSSTAT WHERE name = 'db block gets')

  336. + (SELECT SUM(value) FROM V\$SYSSTAT WHERE name = 'consistent gets')

  337. ))) * 100)||'%' "Percentage"

  338. FROM DUAL;

  339. PROMPT

  340. PROMPT ===== 查询解析比率 =====

  341. SELECT 'Soft Parses ' "Ratio",

  342. ROUND(((SELECT SUM(value)

  343. FROM V\$SYSSTAT

  344. WHERE name = 'parse count (total)') -

  345. (SELECT SUM(value)

  346. FROM V\$SYSSTAT

  347. WHERE name = 'parse count (hard)')) /

  348. (SELECT SUM(value) FROM V\$SYSSTAT WHERE name = 'execute count') * 100,

  349. 2) || '%' "Percentage"

  350. FROM DUAL

  351. UNION

  352. SELECT 'Hard Parses ' "Ratio",

  353. ROUND((SELECT SUM(value)

  354. FROM V\$SYSSTAT

  355. WHERE name = 'parse count (hard)') /

  356. (SELECT SUM(value) FROM V\$SYSSTAT WHERE name = 'execute count') * 100,

  357. 2) || '%' "Percentage"

  358. FROM DUAL

  359. UNION

  360. SELECT 'Parse Failures ' "Ratio",

  361. ROUND((SELECT SUM(value)

  362. FROM V\$SYSSTAT

  363. WHERE name = 'parse count (failures)') /

  364. (SELECT SUM(value)

  365. FROM V\$SYSSTAT

  366. WHERE name = 'parse count (total)') * 100,

  367. 5) || '%' "Percentage"

  368. FROM DUAL;

  369. PROMPT


  370. PROMPT ===== 检查日志的切换频率 =====

  371. select sequence#,

  372. to_char(first_time, 'yyyymmdd_hh24:mi:ss') firsttime,

  373. round((first_time - lag(first_time) over(order by first_time)) * 24 * 60,2) minutes

  374. from v\$log_history

  375. where 1=1

  376. order by first_time, minutes;

  377. PROMPT

  378. PROMPT ===== 检查redo大小 =====

  379. select max(lebsz) from x\$kccle;

  380. PROMPT

  381. PROMPT ===== 查看user commit次数 =====

  382. select to_number(value,99999999999) from v\$sysstat where name='user commits';

  383. PROMPT


  384. PROMPT ===== 检查数据文件状态 =====

  385. COLUMN FILE_NAME FORMAT A60 WORD_WRAPPED

  386. COLUMN STATUS FORMAT A10

  387. SELECT FILE_ID, FILE_NAME, STATUS FROM DBA_DATA_FILES;

  388. PROMPT

  389. PROMPT ===== 检查等待事件=====

  390. SELECT * FROM (

  391. SELECT EVENT, TOTAL_WAITS, TIME_WAITED

  392. FROM V\$SYSTEM_EVENT

  393. ORDER BY TIME_WAITED DESC)

  394. WHERE ROWNUM <= 5;

  395. PROMPT

  396. PROMPT ===== 检查无效对象 =====

  397. SELECT OBJECT_NAME, OBJECT_TYPE, STATUS

  398. FROM DBA_OBJECTS

  399. WHERE STATUS = 'INVALID';

  400. PROMPT

  401. PROMPT ===== 检查备份状态 =====

  402. col status for a10

  403. col input_type for a20

  404. col INPUT_BYTES_DISPLAY for a10

  405. col OUTPUT_BYTES_DISPLAY for a10

  406. col TIME_TAKEN_DISPLAY for a10

  407. select input_type,

  408. status,

  409. to_char(start_time,

  410. 'yyyy-mm-dd hh24:mi:ss'),

  411. to_char(end_time,

  412. 'yyyy-mm-dd hh24:mi:ss'),

  413. input_bytes_display,

  414. output_bytes_display,

  415. time_taken_display,

  416. COMPRESSION_RATIO

  417. from v\$rman_backup_job_details

  418. where start_time > date '2021-07-01'

  419. order by 3 desc;

  420. PROMPT

  421. EXIT;

  422. EOF

  423. rman target / <<EOF

  424. list backup of database;

  425. EXIT;

  426. EOF

  427. print_divider

  428. echo "================ End of Oracle 19c Health Check ================"

说明:脚本输出的格式还在继续优化。整个巡检内容比较长,大家可以输出txt或者html格式去分析。

参考链接:

https://blog.csdn.net/qq_45277554/article/details/134339683?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7ECtr-3-134339683-blog-140880226.235%5Ev43%5Epc_blog_bottom_relevance_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7ECtr-3-134339683-blog-140880226.235%5Ev43%5Epc_blog_bottom_relevance_base1&utm_relevant_index=4

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。


文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论