以下の内容はhttps://htn20190109.hatenablog.com/entry/2026/03/07/205850より取得しました。


システム表領域枯渇時挙動

 


確認結果: 
Oracle → system表領域が枯渇してもDB使用は可能。影響としては新規テーブル追加ができなくなる。
MySQL, PostgreSQL, SQL Server → DB使用は可能。影響としては新規DB追加ができない。

  • MySQL

(8.0.45)

-- 1. mysql.ibdのディスク変更
mysql システムテーブルおよびデータディクショナリテーブルは、
MySQL データディレクトリの mysql.ibd という名前の単一の InnoDB テーブルスペースファイルに存在します

 

50MBのディスクを追加し/var/lib/mysql2にマウント

systemctl stop mysqld.service


fdisk /dev/sdb
mkfs.xfs /dev/sdb1
mkdir /var/lib/mysql2
mount -t xfs /dev/sdb1 /var/lib/mysql2
chmod 755 /var/lib/mysql2
chown mysql:mysql /var/lib/mysql2

cd /var/lib
mv mysql/mysql.ibd mysql2/
cd mysql
ln -s ../mysql2/mysql.ibd mysql.ibd


systemctl start mysqld.service
systemctl status mysqld.service


-- 2. データ追加

dd if=/dev/zero of=/var/lib/mysql2/hoge bs=1M count=30

use test
drop table tab1;
create table tab1(col1 varchar(1000) );
insert into tab1 values('A');
select * from tab1;

drop procedure proc1;

delimiter //
create procedure proc1(in x int)
begin
declare i int;
set i = 0;
while i < x do
set i = i + 1;
insert into tab1 values('A');
end while;
end
//
delimiter ;

call proc1(100000);
select count(*) from tab1;

 

-- 3. データベース追加

drop procedure proc2;

delimiter //
create procedure proc2(in x int)
begin
  declare vSQL varchar(100);
  declare vdbname varchar(100);
  declare i int;
  
  set i = 11;
  
while i < x do
    set i = i + 1;
    select concat('db_',i)  into vdbname;
    select concat('create database ',vdbname) into vSQL;
    
    set @q := vSQL;
    prepare stmt from @q;
    execute stmt;
    deallocate prepare stmt;
   
  end while;
end
//
delimiter ;


call proc2(100000);


ERROR 1114 (HY000): The table 'schemata' is full

DB再起動可能

既存データベースでの作業は可能
DB追加は不可能

 

  • Oracle


(19c)

 


-- 1. system表領域変更

select file_name,bytes/1024/1024,autoextensible from dba_data_files;

alter database datafile '/oradata/orcl/pdb11/system01.dbf' autoextend off;

select
d.tablespace_name,
d.gbytes "total[GB]",
NVL(f.gbytes,0) "free[GB]",
d.gbytes - NVL(f.gbytes,0) "used[GB]",
(1 - (NVL(f.gbytes,0)/d.gbytes))*100 "used_percent"
from
(SELECT tablespace_name, (SUM(bytes)/(1024*1024*1024)) gbytes
FROM dba_data_files GROUP BY tablespace_name) d
left outer join
(SELECT tablespace_name, (SUM(bytes)/(1024*1024*1024)) gbytes
FROM dba_free_space GROUP BY tablespace_name) f
on d.tablespace_name=f.tablespace_name
;


-- 2. データ追加

drop table tab1 purge;
create table tab1(col1 char(1000) ) tablespace system;
insert into tab1 values('A');
select * from tab1;
commit;

declare
begin
 while true loop
  insert into tab1 values('A');
  commit;
 end loop;
end;
/

→ ORA-01653: 表SYS.TAB1を128(表領域SYSTEM)で拡張できません

-- 3. テーブル追加

declare
vSQL varchar2(100);
vtabname varchar2(100);
i integer;

begin
 i := 110;
 while true loop
  i := i+1;

  --テーブル追加
  vtabname := 'T_'  || to_char(i);
  vSQL := 'create table ' || vtabname || ' (col1 int)';
  execute immediate vSQL;
  
 end loop;
end;
/

select table_name from user_tables where table_name like 'T_%';


→ ORA-01658: 表領域SYSTEMにセグメント用のINITIALエクステントを作成できません。

SYSTEM表領域の使用率が100%到達


alter pluggable database pdb11 close immediate;
alter pluggable database pdb11 open;

DB起動は可能

既存テーブルの参照更新は可能

create table test2 (col1 int) tablespace USERS;
create table test3 (col1 int) tablespace system;

ユーザ表領域へのテーブル追加はsystem表領域の使用済みセグメントに空きがある場合は可能の模様


declare
vSQL varchar2(100);
vtabname varchar2(100);
i integer;

begin
 i := 1;
 while true loop
  i := i+1;

  --テーブル追加
  vtabname := 'T2_'  || to_char(i);
  vSQL := 'create table ' || vtabname || ' (col1 int) tablespace USERS';
  execute immediate vSQL;
  
 end loop;
end;
/

select table_name from user_tables where table_name like 'T2_%';

create table test4 (col1 int) tablespace system;

-- 4. system表領域もどし

select file_name,bytes/1024/1024,autoextensible from dba_data_files;

alter database datafile '/oradata/orcl/pdb11/system01.dbf' autoextend on maxsize unlimited;

drop table tab1 purge;

 

 

  • PostgreSQL


(17)


-- 1. global変更
50MBのディスクを追加し、/var/lib/pgsql/17/data/globalにマウント

du -sh /var/lib/pgsql/17/data/global


fdisk /dev/sdb
mkfs.xfs /dev/sdb1


systemctl stop postgresql-17

cd /var/lib/pgsql/17/data
ls -l
mv global global2
mkdir global
ls -l 


mount -t xfs /dev/sdb1 /var/lib/pgsql/17/data/global
chown postgres:postgres /var/lib/pgsql/17/data/global
chmod 700 /var/lib/pgsql/17/data/global

cp -p global2/* global/
ls -l /var/lib/pgsql/17/data/global


systemctl start postgresql-17
systemctl status postgresql-17

df -h


select pg_size_pretty(pg_database_size('postgres') );

 


-- 2. データ追加

mkdir /var/lib/pgsql/17/data/global/tbs1

create tablespace tbs1 owner postgres location '/var/lib/pgsql/17/data/global/tbs1';

\db+

\c postgres
\conninfo

drop table tab1;
create table tab1(col1 varchar(1000)) tablespace tbs1;
\d tab1;


insert into tab1 values('A');
select * from tab1;

do $$
declare
i int;
begin
i = 0;
while TRUE loop
i = i + 1;
insert into tab1 values('A');
end loop;
end
$$
;


ERROR:  could not extend file "pg_tblspc/40970/PG_17_202406281/5/40971": No space left on device
HINT:  Check free disk space.
CONTEXT:  SQL statement "insert into tab1 values('A')"
PL/pgSQL function inline_code_block line 8 at SQL statement


select count(*) from tab1;

sudo systemctl stop postgresql-17
sudo systemctl start postgresql-17


-- 3. データベース追加

rm -rf a.sql

for i in `seq 1 10000000`; do
  echo "create database dbX_"$i";"
done >> a.sql

\i a.sql


psql:a.sql:1793: ERROR:  could not extend file "global/1262": No space left on device


\pset pager 0
\l


DB再起動可能
既存データベースでの作業は可能
DB追加は不可能


下記メッセージが出力される
2026-03-07 18:53:47.913 JST [3152] WARNING:  could not create relation-cache initialization file "global/pg_internal.init.3152": No space left on device
2026-03-07 18:53:47.913 JST [3152] DETAIL:  Continuing anyway, but there's something wrong.

 

 

  • SQL Server


(2022)


-- 1. masterデータベースのファイル自動拡張無効化
use master
go
alter database master modify file ( name = 'master', filegrowth = 0)
go

 

 

-- 2. データベースサイズ確認
use master
go

EXEC sp_spaceused;
go

sp_helpdb
go

sp_helpdb 'master'
go

 

-- 3. データ追加

use master

drop table tab1;
create table tab1(col1 char(1000) );
insert into tab1 values('A');
select * from tab1;

declare @i int;
set @i = 0;
while  1=1
begin
set @i = @i + 1
insert into tab1 values('A')
end

メッセージ 1105、レベル 17、状態 2、行 6
データベース 'master' にオブジェクト 'dbo.tab1' の領域を割り当てられませんでした。'PRIMARY' ファイル グループがいっぱいです。不要なファイルの削除、ファイル グループ内のオブジェクトの削除、ファイル グループへの新しいファイルの追加、またはファイル グループの既存のファイルの自動拡張の設定のいずれかを行ってディスク領域を作成してください。

select count(*) from tab1;

 

-- 4. データベース追加

use master

declare @i int;
declare @db_name varchar(30);
declare @sql_text varchar(1000);

set @i = 1;
while  1=1
begin
  -- テーブル名生成
  set @db_name = 'db1_'+cast(@i as varchar);

  -- create database 文作成、実行
  set @sql_text ='create database ' + @db_name ;
  execute (@sql_text)

  set @i = @i + 1;
end

メッセージ 945、レベル 14、状態 2、行 1
ファイルにアクセスできないか、メモリまたはディスク領域が不足しているので、データベース 'db1_32' を開けません。詳細については、SQL Server エラー ログを参照してください。
メッセージ 1105、レベル 17、状態 2、行 1
データベース 'master' にオブジェクト 'sys.sysbrickfiles'.'clst' の領域を割り当てられませんでした。'PRIMARY' ファイル グループがいっぱいです。不要なファイルの削除、ファイル グループ内のオブジェクトの削除、ファイル グループへの新しいファイルの追加、またはファイル グループの既存のファイルの自動拡張の設定のいずれかを行ってディスク領域を作成してください。


DB再起動可能

既存データベースでの作業は可能
DB追加は不可能

 

-- 5. masterデータベースのファイル自動拡張戻し
use master
go
alter database master modify file ( name = 'master', filegrowth = 102400KB )
go

 

 

 

 

 

 

 

 

 




以上の内容はhttps://htn20190109.hatenablog.com/entry/2026/03/07/205850より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14