Oracle 表領域使用率をSQLスクリプトで出力し、cronで自動実行する方法

オラクルデータベースの基本

Oracle 19c以降のCDB環境では、CDB$ROOTだけでなくすべてのPDBの表領域も監視対象とする必要があります。
本記事では、CDB構成に対応した表領域使用率スクリプトと、それをcronで毎日自動実行する手順を解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


■ 実現できること

項目内容
出力対象CDB$ROOT + PDBの表領域すべて
出力内容容量(MB)、使用済、空き、使用率(%)
実行形式SQL*Plus経由のスクリプト実行
自動化cronによる毎日自動出力

■ 1. SQLスクリプトの作成

以下を /home/oracle/scripts/tablespace_usage_report.sql に保存してください。

-- tablespace_usage_report.sql(CDB/PDB対応)
SET LINESIZE 150
SET PAGESIZE 100
COLUMN container_name FORMAT A20
COLUMN tablespace_name FORMAT A25
COLUMN total_mb FORMAT 999,999.99
COLUMN used_mb FORMAT 999,999.99
COLUMN free_mb FORMAT 999,999.99
COLUMN pct_used FORMAT 999.99

SELECT
c.name AS container_name,
df.tablespace_name,
ROUND(SUM(df.bytes)/1024/1024, 2) AS total_mb,
ROUND(SUM(df.bytes - NVL(fs.bytes, 0))/1024/1024, 2) AS used_mb,
ROUND(SUM(NVL(fs.bytes, 0))/1024/1024, 2) AS free_mb,
ROUND((SUM(df.bytes - NVL(fs.bytes, 0))/SUM(df.bytes)) * 100, 2) AS pct_used
FROM
cdb_data_files df
JOIN
v$containers c ON df.con_id = c.con_id
LEFT OUTER JOIN
(SELECT con_id, tablespace_name, SUM(bytes) AS bytes
FROM cdb_free_space
GROUP BY con_id, tablespace_name) fs
ON df.con_id = fs.con_id AND df.tablespace_name = fs.tablespace_name
GROUP BY c.name, df.tablespace_name
ORDER BY container_name, pct_used DESC;

EXIT;

■ 2. 実行結果例(SQL*Plus)

CONTAINER_NAME       TABLESPACE_NAME              TOTAL_MB     USED_MB     FREE_MB PCT_USED
-------------------- ------------------------- ----------- ----------- ----------- --------
CDB$ROOT SYSTEM 1,170.00 1,163.81 6.19 99.47
CDB$ROOT SYSAUX 700.00 662.94 37.06 94.71
CDB$ROOT UNDOTBS1 685.00 441.69 243.31 64.48
CDB$ROOT USERS 5.00 2.69 2.31 53.75
PDB01 SYSTEM 420.00 415.81 4.19 99.00
PDB01 SYSAUX 470.00 441.50 28.50 93.94
PDB01 UNDOTBS1 260.00 240.13 19.88 92.36
PDB01 USERS 5.00 1.00 4.00 20.00
PDB02 SYSTEM 420.00 415.81 4.19 99.00
PDB02 SYSAUX 470.00 441.50 28.50 93.94
PDB02 UNDOTBS1 260.00 240.13 19.88 92.36
PDB02 USERS 5.00 1.00 4.00 20.00

12行が選択されました。

■ 3. シェルスクリプトの作成

以下のスクリプト /home/oracle/scripts/run_tablespace_report.sh を作成します。

#!/bin/bash

# Oracle環境変数設定
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=V19M
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LOG_DIR=/home/oracle/logs

mkdir -p $LOG_DIR
DATE=$(date +%Y%m%d)
LOG_FILE=$LOG_DIR/tablespace_report_${DATE}.log

echo "実行開始: $(date)" > $LOG_FILE
echo "ORACLE_HOME=$ORACLE_HOME" >> $LOG_FILE
echo "ORACLE_SID=$ORACLE_SID" >> $LOG_FILE

sqlplus -s / as sysdba @/home/oracle/scripts/tablespace_usage_report.sql >> $LOG_FILE 2>&1

echo "実行終了: $(date)" >> $LOG_FILE

権限付与:

chmod +x /home/oracle/scripts/run_tablespace_report.sh

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


■ 4. cron で定期実行設定

crontab -e

以下を追加(例:毎日8:00実行):

0 8 * * * /home/oracle/scripts/run_tablespace_report.sh

🔰 cronとは?

cronはLinuxの標準スケジューラで、決まった時間に自動で処理を実行する仕組みです。
crontab -e でスケジュールを設定できます。
たとえば 0 8 * * * は「毎日朝8時に実行」という意味です。


■ まとめ

ファイル内容
tablespace_usage_report.sqlCDB/PDBの全表領域の使用率を出力
run_tablespace_report.sh環境変数を設定しSQL*Plusを自動実行する
cron設定スクリプトを毎日定期実行する設定
ORACLE_SIDV19M(CDBインスタンス)


[参考]
13 表領域の管理

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました