DBAtlas · データベース運用アトラス

ディスク / 表領域が満杯

症状

'unable to extend'、'disk full'、'log file full' エラー。書き込みが停止しつつある。

1. 慌てず、まず何が満杯かを特定する

データファイル、トランザクションログ、アーカイブ/redo 領域、temp、OS ディスクのどれか。誤った場所をクリーンアップしても効果はない。OS レベルでは df -h でディスクを、DB 内では領域ビューを確認する。

2. 使用量を測定する

どの表領域/ファイル/ディレクトリが、何パーセント満杯か。

Oracle

SELECT d.tablespace_name, ROUND((1-(d.alloc-NVL(f.free,0))/d.maxb)*100,1) pct_free FROM (SELECT tablespace_name, SUM(bytes) alloc, SUM(GREATEST(bytes,maxbytes)) maxb FROM dba_data_files GROUP BY tablespace_name) d LEFT JOIN (SELECT tablespace_name, SUM(bytes) free FROM dba_free_space GROUP BY tablespace_name) f ON f.tablespace_name = d.tablespace_name;

PostgreSQL

SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database ORDER BY 2 DESC; -- use OS df for the disk

MySQL

SELECT table_schema, ROUND(SUM(data_length+index_length)/1048576,1) mb FROM information_schema.tables GROUP BY table_schema ORDER BY mb DESC;

SQL Server

SELECT name, size/128.0 size_mb, size/128.0 - CAST(FILEPROPERTY(name,'SpaceUsed') AS int)/128.0 free_mb FROM sys.database_files;

Redis

INFO memory  # used_memory vs maxmemory

3. 最大の消費元を見つける

最大のテーブル/セグメント、最大のログ/アーカイブファイル、不要な古いバックアップを特定する。ほとんどの場合、単一の暴走テーブルか蓄積したアーカイブログが原因である。

Oracle

SELECT segment_name, bytes/1048576 mb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;

PostgreSQL

SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC LIMIT 10;

SQL Server

SELECT TOP 10 OBJECT_NAME(object_id), SUM(reserved_page_count)*8/1024 mb FROM sys.dm_db_partition_stats GROUP BY object_id ORDER BY mb DESC;

4. 領域を安全に回収する (応急)

ログ/アーカイブの場合: バックアップしてから古いアーカイブログ/バックアップを削除する (Oracle: RMAN delete archivelog、MSSQL: ログバックアップを取ってログを圧縮)。Redis では maxmemory-policy とエビクション。稼働中のデータファイルを決して手動で削除しないこと。バックアップなしにアーカイブログを決して削除しないこと。

5. 容量を恒久的に増やす

データファイルに領域を追加するか autoextend を有効にし (Oracle: ALTER DATABASE DATAFILE ... AUTOEXTEND ON MAXSIZE)、ディスクを拡張し、表領域を追加する。根本原因を修正する: ログローテーション、アーカイブクリーンアップジョブ、保持ポリシー。

6. 再発を防止する

ディスク使用量のアラート (80%/90% のしきい値) を設定し、アーカイブ/ログのクリーンアップを自動化し、保持ポリシーを明確に定義する。このプレイブックを再び開く必要がないようにする。

DBAtlas で開く →