結論

シュリンク(shrink)とは「縮むこと・縮小すること」です。ビジネスでは市場や売上の規模が縮むこと、ITではディスクの領域やデータベースのファイルを小さくする操作を指します。ITのシュリンクは「データを消す」と「ファイルが縮む」が別の動きである点が要です。

この記事でわかること

  • 分野別の意味の表と、例文・言い換え・対義語
  • SQLiteとPostgreSQLで測った「消しても縮まない」数字
  • 縮める前の判断表と、エラー原文つきのつまずき表

2026年11月11日更新|SQLite 3.53.1・PostgreSQL 16.15・resize2fs 1.47.0・terser 5.51.2 で実際に動かして確認

「シュリンク」は、何が縮むのかで意味が決まる言葉です。会議で聞いたのか、設計書やコマンドで見たのか、商品の説明で見たのかで、次のように読み分けます。この記事で実際に動かしたものは、SQLite と PostgreSQL のファイルサイズの計測、開いたままのファイルを消したときの空き容量、resize2fs でのファイルシステムの縮小、JavaScript と画像の縮小です。

flowchart TD
    A[シュリンクと聞いた] --> B{何が縮むか}
    B --> C[市場<br>売上]
    B --> D[ファイル<br>DB・領域]
    B --> E[フィルム]
    C --> F[規模の縮小]
    D --> G[容量の縮小]
    E --> H[包装]

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
シュリンクとは 英語 shrink 由来。縮むこと・縮小すること シュリンクとは(意味と語源)
シュリンク ビジネスでの意味 市場・売上・予算などの規模が小さくなること ビジネスでのシュリンク
シュリンク ITでの意味 ボリューム・DBファイル・ログ・コードを小さくする操作 ITでのシュリンクの意味
シュリンクの言い換え 縮小・減少・圧縮・スケールダウン(指すものが違う) 例文と言い換え
シュリンクの対義語 拡大・成長・拡張(英語は expand・grow) 例文と言い換え
消してもDBが縮まない 空いた場所は再利用のために残る。別の操作で縮める SQLite・PostgreSQL の節
ファイルを消しても空きが増えない 開いているプロセスがある間は領域が残る ディスクの空きが増えない理由
DBのシュリンクは定期的にやるか Microsoft は通常の保守作業としない方針を示している DBCC SHRINKDATABASE
シュリンク包装・シュリンクフレーション 熱で縮むフィルムの包装/価格そのままで内容量を減らすこと 包装・契約・物価の言葉

確認環境:Ubuntu 24.04.5 LTS の上で、Python 3.13.18 に同梱の SQLite 3.53.1、PostgreSQL 16.15(127.0.0.1 だけで待ち受け、autovacuum は計測のため off)、e2fsprogs 1.47.0 の mke2fs・resize2fs・e2fsck(マウントせず、通常のファイルをイメージとして使用)、Node.js v22.23.4 と terser 5.51.2、Pillow 12.3.0 を動かし、ファイルサイズと出力を記録しました。ディスクの空きの確認は tmpfs(/dev/shm)で行っています。SQL Server の DBCC SHRINKDATABASE と Windows の「ボリュームの縮小」は手元で動かしておらず、Microsoft Learn の記載の範囲で書いています。言葉の意味はデジタル大辞泉、プログレッシブ英和中辞典、Merriam-Webster で確かめました(確認日 2026年11月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「シュリンクとは|ビジネス・ITでの意味とDBが縮まない理由を実測」

シュリンクとは(意味と語源)

この節では、シュリンクという言葉のもとの意味と、英語 shrink の語源・活用が分かります。

シュリンクは、英語の shrink をカタカナにした言葉で、「縮むこと・縮小すること」を表します。 デジタル大辞泉は「縮むこと。萎縮すること。」と説明しています。日本語では「市場がシュリンクする」「ボリュームをシュリンクする」のように「する」を付けて動詞として使うことが多く、縮む(自動詞)にも縮める(他動詞)にも使われます。

項目 内容
つづり・読み shrink(シュリンク)。語末は k なので「シュリング」ではない
動詞の意味 布などが縮む/規模が縮小・減少する/縮ませる・小さくする/ひるむ・しりごみする
名詞の意味 収縮、しりごみ。略式では精神科医を指す用法もある
活用 shrink - shrank(shrunk とも)- shrunk(shrunken とも)
名詞形 shrinkage(収縮・目減り)
語源 古英語 scrincan。中期オランダ語の schrinken(後ろへ引く)と同じ系統

語義と活用はプログレッシブ英和中辞典(第5版)、語源は Merriam-Webster の記載です。Merriam-Webster は動詞の最初の用例を「12世紀より前」としており、もともとは体を縮こまらせる意味でした。「小さくなる」「量や価値が減る」という意味はそこから広がったものです。

カタカナの「シュリンク」が使われる場面

日本語の文章では、ふつうは「縮小」「減少」と書けば通じます。カタカナのシュリンクがよく出てくるのは、次の3つの場面です。

1事業・市場の話

「市場がシュリンクしている」のように、需要や規模が小さくなる流れを指す。

2ITの操作や機能の名前

Shrink Volume、DBCC SHRINKDATABASE のように、製品のメニューやコマンドの名前になっている。

3包装・商品の話

シュリンク包装、シュリンクフィルムのように、熱で縮むフィルムを指す。

分野別のシュリンクの意味(一覧表)

この節では、分野ごとに「何が縮むのか」を1つの表で見比べられます。

シュリンクの意味を取り違えないための問いは、「何が縮むのか」の1つだけです。 ふだんの意味と、ビジネス・IT・包装などでの意味を並べます。

分野 縮むもの 意味 よくある言い方
ふだんの英語 布・体・物 洗濯で縮む、身を縮める The sweater shrank.
ビジネス 市場・売上・予算・サービスの規模 規模が小さくなる、需要が減る 市場がシュリンクする
IT(ディスク) パーティション・ボリューム・ファイルシステム 領域を小さくして未割り当ての領域を作る ボリュームの縮小、resize2fs
IT(データベース) データファイル・ログファイル 使っていない場所をOSへ返してファイルを小さくする DBCC SHRINKDATABASE、VACUUM
IT(ログ) ログファイル・WAL 不要になった部分を切り詰める truncate、チェックポイント
IT(Web) JavaScript・CSS・画像 動きを変えずに配信するサイズを小さくする minify(ミニファイ)、リサイズ
包装 フィルム 熱で縮むフィルムを商品に密着させる シュリンク包装、シュリンクフィルム
契約 (包装のフィルムに由来) 包装を開けた時点で使用許諾に合意したとみなす方式の名前 シュリンクラップ契約
物価 内容量 価格を変えずに内容量を減らすこと シュリンクフレーション

ビジネスのシュリンク

外から起きる変化を言うことが多い(市場・需要)

数字は金額・件数・数量

対になる言葉は「拡大」「成長」

ITのシュリンク

人が実行する操作を言う(コマンド・メニュー)

数字はバイト数・ブロック数・ページ数

対になる言葉は「拡張」(extend・grow)

ビジネスでのシュリンクの意味と使い方(市場・売上・予算)

この節では、ビジネスの会話で使うシュリンクの意味と、数字で話すときの計算が分かります。

ビジネスでのシュリンクは、市場・売上・予算・サービスの規模が小さくなることです。 「減った」という1回の結果より、「縮んでいく流れ」を言うときに使われます。たとえば「紙のカタログの市場はシュリンクしている」は、需要の総量が年々小さくなっているという意味です。

市場のシュリンクと、自社のシェアは別の話

市場が縮むことと、自社の売上が減ることは同じではありません。市場規模 × シェア = 売上 と分けると、どちらが原因かを話しやすくなります。市場規模を 1,000(単位は億円でも件数でも同じ)として、年率で縮む場合を計算しました。

年 年率 −3% 年率 −5%
0年目1,000.01,000.0
1年後970.0950.0
2年後940.9902.5
3年後912.7857.4
4年後885.3814.5
5年後858.7(−14.1%)773.8(−22.6%)
22.8年年率 −3% で半分になるまで−5% は13.5年、−10% は6.6年
23.3%売上を保つのに要るシェアシェア20%・市場が5年で858.7に縮んだ場合
42.9%30%縮んだあと元へ戻す拡大率1 ÷ 0.7 − 1。縮小率と同じ数字では戻らない

シェアが20%のまま、市場が年率3%で5年縮むと、売上は 200 から 171.7 になります。売上 200 を保つには、シェアを 23.3% まで上げる計算です。「売上が落ちた」という報告に対して、市場がシュリンクしたのか、シェアが下がったのかを分けて見る、というのがこの言葉の使いどころです。

予算・サービスのシュリンク

自分たちで規模を小さくする場合にも使います。「来期は広告の予算をシュリンクする」「利用の少ない機能をシュリンクして保守の手間を減らす」のような言い方です。この場合は意図して縮めているので、「縮小する」「絞り込む」と書いたほうが、理由と範囲が伝わります。

  • 何が:市場全体か、自社の売上か、予算か、提供する範囲か
  • どれだけ:金額・件数・割合と、いつからいつまでの比較か
  • なぜ:外の要因(需要の変化)か、自分たちの判断か

この3点を添えると、「シュリンク」という1語で済ませたときの行き違いを防げます。

シュリンクの例文と言い換え(縮小・減少・圧縮・スケールダウンとの違い)

この節では、シュリンクの使い方の例文と、言い換えの言葉との違い、対義語が分かります。

社外向けの文書や議事録では、「縮小」「減少」と日本語で書くほうが誤解されにくくなります。 カタカナのまま使うなら、主語(何が縮むのか)を必ず書きます。

例文

場面 例文 言い換えた文
市場 国内の紙の手帳の市場はシュリンクしている。 国内の紙の手帳の市場は縮小している。
売上 主力商品の売上がシュリンク傾向にある。 主力商品の売上が3期続けて減少している。
予算 展示会の予算をシュリンクして、Web の施策に回す。 展示会の予算を減らして、Web の施策に回す。
サービス 問い合わせの少ない窓口をシュリンクする。 問い合わせの少ない窓口を統合して数を減らす。
IT(ディスク) C ドライブをシュリンクして、空いた領域に D ドライブを作る。 C ドライブのボリュームを縮小して、空いた領域に D ドライブを作る。
IT(DB) 大量に削除したあと、データファイルをシュリンクした。 大量に削除したあと、データファイルの空き領域を解放した。

言い換えの言葉との違い

言葉 指すもの ITでの使われ方
シュリンク・縮小 大きさ・規模・枠が小さくなること ボリュームやファイルの「枠」を小さくする
減少 数量が減ること 行数・件数・アクセス数が減る
圧縮(compress) 同じ中身を、より少ない量で表すこと gzip・zip。元に戻す(展開する)操作がある
スケールダウン 性能や台数の規模を下げること サーバーの CPU・メモリを小さい構成にする
切り詰め(truncate) 末尾や中身を切り捨てて短くすること ログファイルを 0 バイトにする、TRUNCATE 文
ミニファイ(minify) 動きを変えずに、書き方を短くすること JavaScript・CSS の空白や名前を短くする

シュリンクと圧縮の違いは、「枠を小さくする」か「中身の表し方を変える」かです。 100GB のボリュームを 60GB にシュリンクしても、中のファイルの内容は変わりません。zip で圧縮すると、中身の表し方が変わり、使う前に展開が要ります。サーバーの規模を下げる話は、関連記事「スケールアップとスケールアウトの違い|負荷分散方式の一覧と選び方」で扱っています。

対義語

シュリンクの反対は、ビジネスでは「拡大」「成長」、ITの操作では「拡張」です。英語では expand(広げる)、grow(育つ・増える)、extend(延ばす)が対になります。Windows の「ボリュームの縮小」の反対の操作は「ボリュームの拡張」です。

ITでのシュリンクの意味(何を縮めるかの一覧)

この節では、ITでシュリンクと呼ばれる操作の種類と、共通する考え方が分かります。

ITのシュリンクは、「確保してある枠」を小さくして、空いた分をほかで使えるようにする操作です。 対象は大きく4つあります。

1

ボリューム・パーティション

ディスクの区画を末尾から縮めて、未割り当ての領域を作る。

Windows の「ボリュームの縮小」、Linux の resize2fs

2

データベースのファイル

削除で空いたページを詰め、ファイルの末尾を OS へ返す。

DBCC SHRINKDATABASE、VACUUM、VACUUM FULL

3

ログ

書き終わって不要になった部分を切り詰める。

truncate、WAL のチェックポイント

4

コード・画像

配信するファイルのバイト数を減らす。

minify、リサイズ

1〜3に共通するのは、「中身を消すこと」と「枠が小さくなること」が別々に起きるという点です。データを消しても、枠(ファイルや区画の大きさ)はそのまま残ります。枠を小さくするには、別の操作(シュリンク)を実行します。次の節から、この動きを実際に測った数字で確かめます。

  1. 1データを書く → 枠が広がるファイルは必要に応じて自動で大きくなる
  2. 2データを消す → 枠はそのまま空いた場所は「再利用できる」という印が付くだけ
  3. 3また書く → 空いた場所が先に使われる枠は広がらない
  4. 4シュリンクする → 枠が小さくなる中身を前へ詰め、末尾を OS へ返す。時間とロックがかかる

ファイルを消してもディスクの空きが増えない理由(実測)

この節では、ファイルを削除したのに空き容量が戻らないときの仕組みと、戻し方が分かります。

Linux では、ファイルを rm で消しても、そのファイルを開いているプロセスが残っている間は、領域が解放されません。 rm が消すのは名前(ディレクトリの中の項目)で、中身は「名前が0個・開いているプロセスも0個」になった時点で初めて消えます。100MB のファイルで確かめました。

0 作る前                 :   0 MB used
1 100MB のファイルを作成  : 100 MB used
2 rm(プロセスが開いたまま): 100 MB used   ← 消したのに減らない
  $ ls app.log
  ls: cannot access '/dev/shm/t347/app.log': No such file or directory
  $ ls -l /proc/<PID>/fd
  3 -> /dev/shm/t347/app.log (deleted)
3 : > /proc/<PID>/fd/3    :   0 MB used   ← 開いたまま中身だけ空にした
4 プロセスを終了          :   0 MB used

2の時点で、ls ではファイルが見えないのに、df の使用量は 100MB のままでした。/proc/<PID>/fd には (deleted) と付いた項目が残っています。プロセスを終了するか、3のように中身を空にすると、使用量は 0MB に戻りました。

動いているアプリのログが大きくなったとき

rm app.log名前は消えるが、アプリが開いたままなので領域は残る。手元では 100MB のまま変わらなかった
→
truncate -s 0 app.logファイルは残したまま、中身を 0 バイトに切り詰める。手元では使用量が 100MB から 0MB になった

見分ける問い:「そのファイルを開いているプロセスがまだ動いているか」

原因の探し方と対処の手順は、関連記事「Linuxでrmしても容量が減らない原因と対処法」で、df と du の読み方は関連記事「Linuxメモリ・ディスク確認|free・df・du・vmstat・iostat見方」で扱っています。

データベースのシュリンク:SQLiteのVACUUMでファイルサイズを測る

この節では、行を削除してもデータベースのファイルが縮まないことと、VACUUM で縮むことを、SQLite の数字で確かめられます。

SQLite は、行を削除してもファイルを小さくしません。空いたページは「フリーリスト」に入り、次の INSERT で再利用されます。ファイルを小さくするのは VACUUM です。 公式ドキュメントは、auto_vacuum が無効のとき「the database file remains the same size」「the database file does not shrink」と説明しています。10万行(1行あたり100文字)で測りました。

操作 行数 ファイルサイズ 空きページ
1. 10万行を INSERT100,00011,108,352 バイト0
2. 90% を DELETE10,00011,108,352 バイト2,378
3. 3万行を INSERT40,00011,108,352 バイト1,564
4. その3万行を DELETE10,00011,108,352 バイト2,378
5. VACUUM10,0001,118,208 バイト0
0バイト90% 削除で縮んだ量11,108,352 バイトのまま
2,378ページ再利用を待つ空きページ全 2,712 ページのうち 88%
10%VACUUM 後のサイズ11.1MB → 1.1MB。この量で約5ミリ秒

2で行を9割消しても、ファイルは1バイトも縮みませんでした。3で3万行を足してもファイルは大きくならず、空きページが 2,378 から 1,564 に減っています。消したあとの空きは、無駄になっているのではなく、次の書き込みのために取ってある場所です。 実行したコードは次のとおりです。

import sqlite3, os
c = sqlite3.connect("a.db", isolation_level=None)
c.execute("create table t(id integer primary key, payload text)")
c.execute("begin")
c.executemany("insert into t values(?,?)", ((i, "x" * 100) for i in range(1, 100001)))
c.execute("commit")
c.execute("delete from t where id % 10 <> 0")
print(os.path.getsize("a.db"), c.execute("pragma freelist_count").fetchone())
c.execute("vacuum")
print(os.path.getsize("a.db"), c.execute("pragma freelist_count").fetchone())
11108352 (2378,)
1118208 (0,)

VACUUM の仕組みと注意点

公式ドキュメントによると、VACUUM は内容を一時的なデータベースファイルへ写し、元のファイルを上書きします。そのため、実行中は元のファイルの最大2倍の空き容量が要ります(「as much as twice the size of the original database file is required in free disk space」)。大きなデータベースほど、縮めるための空きが先に要る点に注意します。

auto_vacuum と incremental_vacuum

SQLite には、コミットのたびに自動でファイルを切り詰める auto_vacuum の設定があります。同じ10万行で3つの設定を比べました。

設定 90% 削除の直後 追加の操作のあと VACUUM 後
NONE(既定)11,108,352―1,118,208
FULL1,372,160―1,122,304
INCREMENTAL11,124,7361,372,160(incremental_vacuum)1,122,304

FULL では、DELETE をコミットした時点でファイルが 1,372,160 バイトまで縮みました。ただし VACUUM 後の 1,122,304 バイトより大きく、ページの中の隙間までは詰めていません。公式ドキュメントも、auto_vacuum は断片化を進めることがあり、VACUUM のようにページを詰め直さないと説明しています。INCREMENTAL では PRAGMA incremental_vacuum(1000) で約1,000ページ分(11,124,736 → 7,024,640 バイト)だけ縮み、引数なしで残りの空きページをすべて返しました。auto_vacuum はテーブルを作る前に設定します(あとから変えるときは、設定してから VACUUM を実行します)。SQLite の基本操作は、関連記事「SQLiteの使い方|コマンド早見表とPython連携を実行例で解説」で扱っています。

PostgreSQLのVACUUMとVACUUM FULLの違い(実測)

この節では、PostgreSQL で「VACUUM したのにテーブルのファイルが縮まない」理由と、縮む条件が分かります。

PostgreSQL のふつうの VACUUM は、空いた場所を「再利用できる」状態にするだけで、原則として OS には返しません。ファイルを小さくするのは VACUUM FULL です。 公式ドキュメントは、標準の VACUUM について「it will not return the space to the operating system, except in the special case where one or more pages at the end of a table become entirely free」と説明しています。10万行のテーブルで測りました。

操作 行数 テーブルのサイズ
1. 10万行を INSERT100,00014,131,200 バイト
2. 90% を DELETE(10行に9行)10,00014,131,200 バイト
3. VACUUM10,00014,131,200 バイト
4. 5万行を INSERT60,00014,131,200 バイト
5. その5万行を DELETE して VACUUM10,00014,131,200 バイト
6. VACUUM FULL10,0001,417,216 バイト

3の VACUUM のあとも、サイズは 14,131,200 バイトのままでした。VACUUM (VERBOSE) の出力は「pages: 0 removed, 1725 remain」で、1ページも減っていません。どのページにも生きている行が残っているためです。4で5万行を足してもサイズが変わらないのは、空いた場所が再利用されたからです。6の VACUUM FULL で 1,417,216 バイト(約10%)になり、インデックスも 2,260,992 から 245,760 バイトになりました。

SELECT pg_relation_size('t') AS table_bytes,
       pg_relation_size('t_pkey') AS index_bytes,
       pg_relation_filepath('t') AS file;
-- VACUUM FULL の前
 table_bytes | index_bytes |       file
-------------+-------------+------------------
    14131200 |     2260992 | base/16384/16385

-- VACUUM FULL のあと
 table_bytes | index_bytes |       file
-------------+-------------+------------------
     1417216 |      245760 | base/16384/16392

ファイルの名前が 16385 から 16392 に変わっています。VACUUM FULL は、テーブルを詰め直した新しいファイルを書き、前のファイルと入れ替える動きです。公式ドキュメントは、VACUUM FULL が ACCESS EXCLUSIVE ロックを取ること(実行中はそのテーブルの読み書きができない)、新しい写しのぶんの空き容量が要ることを挙げています。

ふつうの VACUUM でも縮む場合(末尾が空いたとき)

公式の説明にある「特別な場合」も確かめました。同じ10万行のテーブルで、後ろ半分(id が 50,000 より大きい行)を消してから VACUUM を実行した結果です。

INFO:  table "u": truncated 1725 to 863 pages
 after_vacuum
--------------
      7069696

ファイルの末尾のページがまるごと空いたので、ふつうの VACUUM で 14,131,200 から 7,069,696 バイトに切り詰められました。縮むかどうかは、消した量ではなく、空いた場所がファイルの末尾にまとまっているかで決まります。 また、テーブルの中身をすべて消すなら、TRUNCATE を実行した直後にサイズが 0 バイトになりました。

操作 OSへ返すか ロック 向く場面
VACUUM末尾が空いたときだけ読み書きと並行できる日常の保守(autovacuum が自動で実行)
VACUUM FULL返す(書き直す)ACCESS EXCLUSIVE大量削除のあと、再び増える見込みがないとき
TRUNCATEすぐ返すACCESS EXCLUSIVEテーブルを丸ごと空にするとき

autovacuum の監視と設定は、関連記事「PostgreSQLのVACUUMとautovacuum|監視SQLと設定値の目安」で扱っています。

SQL ServerのDBCC SHRINKDATABASEと注意点(断片化)

この節では、SQL Server でデータベースをシュリンクするコマンドと、Microsoft が示している注意点が分かります。ここは手元で動かしておらず、Microsoft Learn の記載の範囲です。

DBCC SHRINKDATABASE は、指定したデータベースのデータファイルとログファイルのサイズを縮小するコマンドです(Microsoft Learn「Shrinks the size of the data and log files in the specified database.」)。 ファイル単位で縮めるコマンドとして DBCC SHRINKFILE もあります。

-- 構文(Microsoft Learn より。主な部分)
DBCC SHRINKDATABASE
( database_name | database_id | 0
     [ , target_percent ]
     [ , { NOTRUNCATE | TRUNCATEONLY } ]
)
引数 意味(Microsoft Learn の説明)
target_percent縮小したあとに、ファイルの中に残しておく空き領域の割合
NOTRUNCATEファイルの末尾のページを前の空いた場所へ移して詰める。末尾の空きは OS へ返さず、ファイルの大きさは変わらない。データファイルだけに働く
TRUNCATEONLYファイルの末尾の空きを OS へ返す。ページは移動しない

「詰める」と「末尾を返す」が別の引数になっている点は、前の節までで見た SQLite・PostgreSQL と同じ考え方です。Microsoft Learn は、シュリンクについて次の注意を挙げています。

  • 1通常の保守作業として扱わない「Don't consider shrink operations a regular maintenance operation.」日々の処理で大きくなったファイルは、縮小を要しないとしている
  • 2インデックスの断片化が進むことがある断片化の状態は保たれず、大きな範囲を読むクエリの読み取り性能が下がる場合があるとしている
  • 3縮めてもまた大きくなるなら、その空きは必要な空き繰り返し縮めるのは逆効果で、ファイルを広げ直す処理が性能の妨げになるとしている
  • 4AUTO_SHRINK は、特別な理由がなければ ON にしない「Unless you have a specific requirement, don't set the AUTO_SHRINK database option to ON.」
  • 5最小サイズより小さくはならない10MB で作って 100MB に増えたデータベースは、全部消しても 10MB までしか縮まないと説明されている

断片化とは、関係するデータがファイルの中で離れた場所に散らばることです。シュリンクは末尾のページを前の空いた場所へ移すので、もともと順に並んでいたページの並びが崩れることがあります。縮小のあとに読み取りが遅くなったと感じたら、インデックスの断片化の状態を確かめる、という順で考えます。

ボリュームの縮小(Windows)とresize2fs(Linux)

この節では、ディスクの区画を縮める操作の手順と、Linux の resize2fs を実際に動かした結果が分かります。

ボリュームやファイルシステムのシュリンクは、区画を末尾から縮めて、未割り当ての領域を作る操作です。 作業の前に、必ずバックアップを取ります。

Windows:ディスクの管理の「ボリュームの縮小」

Microsoft Learn の手順は次のとおりです(手元では動かしていません)。

1

ディスクの管理を開く

縮小したいベーシック ボリュームを右クリックする。操作には Backup Operators または Administrators グループの権限が要る。

Windows

2

[ボリュームの縮小]を選ぶ

英語版のメニュー名は Shrink Volume。

Windows

3

画面の指示に従って縮小する量を決める

通常のファイルは、空きを作るために自動で移動される。フォーマットし直す操作は要らない。

Windows

コマンドでは、diskpart を開いて list volume → select volume 番号 → shrink desired=サイズ(MB) の順に実行します。Microsoft Learn は次の点を挙げています。

  • 縮小できるのは、ファイルシステムのないベーシック ボリュームか、NTFS のベーシック ボリューム
  • ページング ファイルやシャドウ コピーの保存領域のような移動できないファイルがあると、その位置までしか縮められない
  • データベースのファイルなどを直接置いている生のパーティション(ファイルシステムなし)は、縮小でデータが壊れるおそれがある

Microsoft Learn の日本語版は、ページの見出しを「ベーシック ボリュームを圧縮する」、メニュー名を[ボリュームの縮小]と表記しています。この操作は、前の節の表でいう「圧縮(compress)」ではなく「縮小(shrink)」です。

Linux:resize2fs で ext4 を縮小する(実測)

resize2fs は、ext2・ext3・ext4 のファイルシステムの大きさを変えるコマンドです。マニュアルは、縮小はマウントしていない状態で行うこと、resize2fs はパーティションの大きさを変えないので、縮小するときは「先にファイルシステム、次にパーティション」の順に行うことを説明しています。64MB のイメージファイルに ext4 を作り、9MB のファイルを入れて試しました。

$ resize2fs fs.img 32M
Resizing the filesystem on fs.img to 8192 (4k) blocks.
The filesystem on fs.img is now 8192 (4k) blocks long.

$ resize2fs -P fs.img
Estimated minimum size of the filesystem: 4274

$ resize2fs fs.img 4M
resize2fs: New size smaller than minimum (4274)

$ resize2fs -M fs.img
Resizing the filesystem on fs.img to 4274 (4k) blocks.
The filesystem on fs.img is now 4274 (4k) blocks long.

$ e2fsck -f -n fs.img
fs.img: 17/16384 files (5.9% non-contiguous), 4267/4274 blocks
段階 ブロック数(4KB) イメージのサイズ 空きブロック
作成時(64MB)16,38467,108,864 バイト12,117
resize2fs 32M8,19233,554,432 バイト3,925
resize2fs -M(最小)4,27417,506,304 バイト7

中のファイル(9MB)より小さい 4MB を指定すると、「New size smaller than minimum (4274)」で止まりました。-P は最小のブロック数の見積もりを表示し、-M はそこまで縮めます。縮小のあとも e2fsck は異常を報告せず、6個のファイルは残っていました。マニュアルは、最小サイズの見積もりが正しくない場合があること(特にブロックサイズが 1k・2k のとき)も注意として挙げています。-M で限界まで縮めると空きが7ブロックしか残らないので、ふだん使う区画には向きません。

パーティションごと縮めるときの順番

先にパーティションファイルシステムより区画が小さくなり、末尾のデータが区画の外に出てしまう
→
先にファイルシステムresize2fs で縮めてから、パーティションを新しいファイルシステム以上の大きさに縮める

広げるときは逆で、先にパーティション、次に resize2fs

ログの切り詰めと、コード・画像の縮小(minify)

この節では、ログを小さくする操作と、配信するファイルを小さくする操作を、測った数字で見比べられます。

ログの切り詰め(SQLite の WAL で実測)

ログのシュリンクは、「反映し終わって要らなくなった部分を切り捨てる」操作です。 SQLite の WAL モード(変更をいったん別のファイルに書く方式)で、2万行を書いたあとのファイルサイズを測りました。

操作 本体(w.db) WAL(w.db-wal)
2万行を INSERT した直後4,096 バイト2,253,672 バイト
wal_checkpoint(PASSIVE)2,232,320 バイト2,253,672 バイト
wal_checkpoint(TRUNCATE)2,232,320 バイト0 バイト

PASSIVE のチェックポイントで中身は本体へ反映されましたが、WAL のファイルは 2,253,672 バイトのままでした。TRUNCATE を指定すると 0 バイトになります(公式ドキュメント「the WAL file is truncated to zero bytes upon successful completion」)。ここでも「反映する」と「ファイルを短くする」は別の動きです。なお、DBCC SHRINKDATABASE の NOTRUNCATE はログファイルには働かないと Microsoft Learn に書かれています。

JavaScript の minify(terser で実測)

minify は、プログラムの動きを変えずに、空白・コメント・名前を短くしてファイルを小さくする処理です。22行の JavaScript を terser 5.51.2 で処理しました。

処理 サイズ gzip 後
元のファイル857 バイト505 バイト
空白とコメントを除く(terser 既定)668 バイト373 バイト
圧縮と名前の短縮(-c -m)432 バイト307 バイト
トップレベルの名前も短縮(--toplevel)339 バイト269 バイト
// 元(一部)
function calculateTotalPrice(itemList, taxRate) {
  let totalPrice = 0;
  for (const currentItem of itemList) {
    const subTotal = currentItem.unitPrice * currentItem.quantity;
    totalPrice = totalPrice + subTotal;
  }
  ...

// terser -c -m --toplevel の出力(一部)
function(t,n){let o=0;for(const n of t){o+=n.unitPrice*n.quantity}const u=Math.floor(o*n);return{totalPrice:o,taxAmount:u,grandTotal:o+u}}

857 バイトが 339 バイト(40%)になりました。minify(書き方を短くする)と gzip(圧縮)は重ねて使え、両方で 269 バイトです。unitPrice のようなプロパティ名は、外から参照されるかもしれないので既定では短くなりません。

画像の縮小(Pillow で実測)

画像は、縦横のピクセル数を減らす(リサイズ)と、ファイルが小さくなります。2400×1800 の画像を JPEG(品質85)で保存して比べました。

大きさ JPEG(品質85) 元との比
2400×1800731,439 バイト100%
1200×900251,068 バイト34%
800×600136,500 バイト19%

800×600 を WebP(品質80)で保存すると 89,612 バイトでした。一方、同じ画像を PNG で縮小したところ、904,154 バイト(2400×1800)が 1,077,950 バイト(1200×900)に増えました。なめらかな模様に、縮小で中間色が増え、PNG の圧縮が効きにくくなったためと考えられます。ピクセル数を減らせば必ずファイルが小さくなるとは限らず、形式との組み合わせで結果が変わります。

シュリンクするかどうかの判断表と、よくあるエラー/つまずき

この節では、ITで「縮めるべきか、そのままにするか」の判断と、実行時に出るエラーの原文と直し方が分かります。

判断の軸は「その空きは、また使われるか」です。 また使われる空きを縮めても、次の書き込みで広げ直すことになり、手間と負荷だけが残ります。

状況 判断 理由
日々の追加・削除で、サイズが上下している縮めない空きは次の書き込みで再利用される(実測の3・4)
データの移行や整理で、一度だけ大量に削除した縮める候補再び増える見込みがなければ、空きは戻らない
ディスクの残りが少なく、ほかの用途に空きが要る縮める候補ただし実行中に追加の空き容量が要る操作がある
テーブルを丸ごと空にするTRUNCATEPostgreSQL ではすぐ 0 バイトになった
ログが大きい。アプリは動いたまま切り詰めるrm では領域が戻らない。truncate で 0 バイトにする
読み書きを止められない時間帯縮めない(時間を選ぶ)VACUUM FULL は排他ロックを取る
バックアップをまだ取っていない区画の縮小先にバックアップ区画の操作は、失敗すると取り返しにくい
1

何がどれだけ空いているかを測る

SQLite は PRAGMA freelist_count、PostgreSQL は pg_relation_size、ディスクは df と du。

測る

2

その空きがまた使われるかを考える

過去のサイズの推移を見て、増減を繰り返しているなら、そのままにする。

判断

3

実行中に要る空き容量とロックを確かめる

SQLite の VACUUM は最大で元の2倍、VACUUM FULL は新しい写しのぶんの空きが要る。

準備

4

バックアップを取り、利用の少ない時間に実行する

実行の前後でサイズを記録し、効果を数字で残す。

実行

よくあるエラー/つまずき(原文つき)

症状・原文 原因 直し方
DELETE したのに DB のファイルサイズが変わらない 空いたページは再利用のために残る 縮める理由があるときだけ VACUUM(SQLite)・VACUUM FULL(PostgreSQL)
PostgreSQL で VACUUM したのに縮まない(pages: 0 removed) ふつうの VACUUM が返すのは、末尾のまるごと空いたページだけ そのまま再利用に任せる。縮めるなら VACUUM FULL
cannot VACUUM from within a transaction(SQLite) トランザクションの中で VACUUM を実行した COMMIT してから実行する。Python は isolation_level=None で接続する
ERROR: VACUUM cannot run inside a transaction block(PostgreSQL) BEGIN のあとに VACUUM を実行した トランザクションの外で、1文だけで実行する
output file already exists(SQLite の VACUUM INTO) 出力先のファイルがすでにある 別の名前にするか、先にファイルを消す
resize2fs: New size smaller than minimum (4274) 中のデータより小さいサイズを指定した resize2fs -P で最小のブロック数を見てから指定する
rm したのに df の空きが増えない 消したファイルをプロセスが開いたまま プロセスを再起動する。ログは rm ではなく truncate で空にする
Windows でボリュームが思ったほど縮小できない 移動できないファイル(ページング ファイルなど)が後ろにある Microsoft Learn は、イベント ID 259 のログで妨げているファイルを調べる方法を案内している
画像を縮小したのにファイルが大きくなった PNG で、縮小によって中間色が増えた 写真や模様は JPEG・WebP で保存する

包装のシュリンク・シュリンクラップ契約・シュリンクフレーション(言葉の紹介)

この節では、ビジネスとIT以外で出会う「シュリンク」の付く言葉の意味が分かります。ここは言葉の紹介までにとどめます。

言葉 意味
シュリンク包装(シュリンクラップ) 熱で縮むフィルムで商品を包み、熱をかけて密着させる包装。本・CD・DVD などで見かける
シュリンクフィルム シュリンク包装に使う、熱で縮むフィルム
シュリンク付き・シュリンクなし 商品に外装のフィルムが付いているか、付いていないかを表す言い方
シュリンクラップ契約 デジタル大辞泉の説明では「商品の包装(シュリンクラップ)を開けた時点で、添付された商品の使用許諾書に合意したとみなす契約方式のこと」。パッケージで売られるソフトウェアで使われてきた方式の名前
シュリンクフレーション shrink と inflation(インフレーション)を合わせた言葉。Merriam-Webster は「同じ価格のまま、商品の1個あたりの量を減らすこと」と説明している

シュリンクフレーションで縮むのは内容量です。たとえば 100g の商品が同じ価格で 90g になると、1g あたりの価格は計算上 11.1% 上がります(100 ÷ 90 − 1)。シュリンクラップ契約は方式の名前で、個々の契約の扱いは、それぞれのソフトウェアの提供元が示す利用条件で確かめます。

1包装の話なら「フィルム」

「シュリンクが破れている」は、外装のフィルムのこと。

2物価の話なら「内容量」

「シュリンクフレーション」は、量が減ること。

3会議の話なら「規模」

「シュリンクしている」は、市場や売上が縮むこと。

よくある質問

この節では、シュリンクについてよく調べられる疑問の答えが分かります。

Q. シュリンクとは、簡単に言うと何ですか。
A. 「縮むこと・縮小すること」です。英語の shrink から来ています。ビジネスでは市場や売上の規模が小さくなること、ITではボリュームやデータベースのファイルを小さくする操作を指します。

Q. 「シュリンクする」はビジネスでどう使いますか。
A. 「国内の市場がシュリンクしている」のように、規模が縮んでいく流れを言うときに使います。社外向けの文書では「縮小している」「減少している」と書き、何が・どれだけ・いつと比べて、を添えると伝わりやすくなります。

Q. シュリンクの言い換えと対義語は何ですか。
A. 言い換えは「縮小」「減少」「収縮」です。対義語は「拡大」「成長」「拡張」で、英語では expand・grow・extend が対になります。

Q. シュリンクと圧縮は同じですか。
A. 違います。シュリンクは区画やファイルの「枠」を小さくすること、圧縮は中身の表し方を変えて量を減らすことです。圧縮したファイルは、使う前に展開が要ります。

Q. データを削除したのに、データベースのファイルが小さくならないのはなぜですか。
A. 空いた場所を、次の書き込みで再利用するために残しているからです。手元の SQLite では、10万行の9割を消してもファイルは 11,108,352 バイトのままで、VACUUM を実行して 1,118,208 バイトになりました。

Q. PostgreSQL の VACUUM と VACUUM FULL の違いは何ですか。
A. VACUUM は空いた場所を再利用できる状態にする処理で、OS に返すのは末尾のまるごと空いたページだけです。VACUUM FULL はテーブルを新しいファイルに書き直して小さくしますが、実行中は排他ロックを取り、追加の空き容量が要ります。

Q. データベースのシュリンクは定期的に実行したほうがよいですか。
A. Microsoft Learn は、SQL Server のシュリンクを通常の保守作業として扱わないよう案内しています。縮めてもまた大きくなるなら、その空きはふだんの処理に必要な空きです。一度だけ大量に削除したあとなど、理由があるときに実行します。

Q. シュリンクでデータは消えますか。
A. 正しく実行できれば、中のデータは残ります。手元の resize2fs でも、縮小のあとに6個のファイルが残り、検査で異常は出ませんでした。ただし区画の操作は失敗すると戻しにくいので、先にバックアップを取ります。Microsoft Learn は、ファイルシステムのない生のパーティションではデータが壊れるおそれがあると注意しています。

Q. Windows の「ボリュームの縮小」で、空きがあるのに少ししか縮小できません。
A. 移動できないファイル(ページング ファイルやシャドウ コピーの保存領域など)が区画の後ろのほうにあると、その位置までしか縮小できません。Microsoft Learn は、イベント ID 259 のログで妨げているファイルを調べる方法を案内しています。

Q. シュリンクと minify は同じ意味ですか。
A. どちらも「小さくする」ですが、対象が違います。minify は JavaScript や CSS の空白・コメント・名前を短くして、動きを変えずにファイルを小さくする処理です。手元では 857 バイトが 339 バイトになりました。

Q. シュリンクの過去形は何ですか。
A. shrink の過去形は shrank(shrunk とも)、過去分詞は shrunk(shrunken とも)です。shrunken は「縮んだ」という形容詞としても使われます。

まとめ

この節では、この記事の要点を5つで振り返れます。

  • シュリンクは「縮むこと・縮小すること」。 何が縮むのか(市場・ファイル・フィルム・内容量)で意味が決まる。
  • ビジネスでは規模の縮小。 市場のシュリンクとシェアの低下を分け、何が・どれだけ・なぜ、を添える。年率 −3% でも5年で −14.1% になる。
  • ITでは「消す」と「縮む」が別の動き。 SQLite も PostgreSQL も、9割削除してファイルは1バイトも縮まず、VACUUM・VACUUM FULL で約10%になった。
  • 縮めるかどうかは「その空きがまた使われるか」で決める。 Microsoft Learn も、シュリンクを通常の保守作業としない方針を示している。
  • 区画の縮小は順番とバックアップ。 縮めるときは先にファイルシステム、次にパーティション。最小サイズより小さくはできない。

参考・出典

この節では、この記事で確かめた一次情報の場所が分かります(確認日 2026年11月11日)。

  • 小学館「デジタル大辞泉」シュリンク/シュリンクラップ契約(Weblio 辞書に収録):https://www.weblio.jp/content/シュリンク
  • 小学館「プログレッシブ英和中辞典(第5版)」shrink(コトバンクに収録):https://kotobank.jp/ejword/shrink
  • Merriam-Webster「shrink」:https://www.merriam-webster.com/dictionary/shrink
  • Merriam-Webster「shrinkflation」:https://www.merriam-webster.com/dictionary/shrinkflation
  • SQLite「VACUUM」:https://www.sqlite.org/lang_vacuum.html
  • SQLite「Pragma statements」(auto_vacuum・incremental_vacuum・wal_checkpoint):https://www.sqlite.org/pragma.html
  • PostgreSQL 16「Routine Vacuuming」:https://www.postgresql.org/docs/16/routine-vacuuming.html
  • Microsoft Learn「DBCC SHRINKDATABASE (Transact-SQL)」:https://learn.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-shrinkdatabase-transact-sql
  • Microsoft Learn「Shrink a basic volume」:https://learn.microsoft.com/en-us/windows-server/storage/disk-management/shrink-a-basic-volume
  • resize2fs(8) マニュアル:https://man7.org/linux/man-pages/man8/resize2fs.8.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「シュリンクとは|ビジネス・ITでの意味とDBが縮まない理由を実測」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

成長のヒミツ、 ぜんぶ丸わかり