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.sql | CDB/PDBの全表領域の使用率を出力 |
run_tablespace_report.sh | 環境変数を設定しSQL*Plusを自動実行する |
| cron設定 | スクリプトを毎日定期実行する設定 |
| ORACLE_SID | V19M(CDBインスタンス) |
[参考]
13 表領域の管理




コメント