【PostgreSQL】データベースのディレクトリ構造やファイルの役割について

PostgreSQL を運用管理をするうえで、データベースのディレクトリ構造やファイルの役割についての情報が必要になることがあります。

今回は、データベースクラスタのディレクトリやファイルについて解説します。

 

PostgreSQL の基本的な運用コマンドについては、以下の記事を参考にしてください。

【PostgreSQL】基本的な運用コマンド一覧

 

PostgreSQL のインストールと初期設定の手順については、以下を参考にしてください。

【PostgreSQL】【CentOS7】yum コマンドで PostgreSQL インストール&初期設定(ユーザー作成、パスワード設定、データベース作成、権限割り当て)手順

 

 

 

PostgreSQL のディレクトリ構造

RedHat 7 系PostgreSQL 9.2.24 の場合です。

yum で PostgreSQL をインストールした場合、デフォルトでは「/var/lib/pgsql/data」ディレクトリ配下にデータ一式が配置されます。

 

【参考例】

【PostgreSQL】データベースのディレクトリ構造やファイルの役割について

 

 

【参考例】

-bash-4.2$ pwd
/var/lib/pgsql/data

-bash-4.2$ tree -d 

 |-pg_xlog ← トランザクションログ(WAL)を格納するディレクトリ 
 |  |-archive_status 
 |-global ← データベース間で共有するデータを格納するディレクトリ
 |-pg_clog 
 |-pg_notify 
 |-pg_serial 
 |-pg_snapshots 
 |-pg_subtrans 
 |-pg_twophase 
 |-pg_multixact 
 |  |-members 
 |  |-offsets 
 |-base ← 各データベースのサブディレクトリを格納するディレクトリ
 |  |-1 ← base ディレクトリ配下の各ディレクトリが1つのデータベースとなります。 
 |  |-12921 ← 各ディレクトリ名がデータベースのOIDとなります。 
 |  |-12926 
 |-pg_tblspc 
 |-pg_stat_tmp 
 |-pg_log ← ログファイルを格納するディレクトリ 
-bash-4.2$

 

 

base ディレクトリ

base ディレクトリ配下のディレクトリ(データベースディレクトリ)名は、データベースの OID(Object ID)になっています。

【参考例】

-bash-4.2$ pwd 
/var/lib/pgsql/data/base 
-bash-4.2$ ls 
1  12921  12926 ← ディレクトリ名が「OID」になっています。
-bash-4.2$

 

 

試しに「1」ディレクトリ配下は以下のようにすべてファイルが格納されています。(ディレクトリはなし)

-bash-4.2$ pwd 
/var/lib/pgsql/data/base/1 
-bash-4.2$ ls 
12663      12712      12752_fsm  12796      12876_fsm 
12663_fsm  12714      12752_vm   12797      12876_vm 
12663_vm   12715      12754      12829      12878 
12665      12716      12755      12829_fsm  12879 
12665_fsm  12716_fsm  12755_fsm  12829_vm   12880 
12665_vm   12716_vm   12755_vm   12831      12880_fsm 
12667      12718      12757      12832      12880_vm 
12668      12719      12757_fsm  12833      12882 
12669      12720      12757_vm   12833_fsm  12883 
12669_fsm  12720_fsm  12759      12833_vm   12885 
12669_vm   12720_vm   12760      12835      12886 
12671      12722      12761      12836      12886_fsm 
12672      12723      12762      12836_fsm  12886_vm 
12677      12724      12764      12836_vm   12888 
12679      12724_fsm  12766      12838      12890 
12680      12724_vm   12767      12839      12891 
12681      12726      12768      12840      12891_fsm 
12681_fsm  12727      12769      12840_fsm  12891_vm 
12681_vm   12728      12770      12840_vm   12893 
12683      12728_fsm  12770_fsm  12842      12895 
12684      12728_vm   12770_vm   12843      12896 
12685      12730      12772      12844      12896_fsm 
12685_fsm  12731      12774      12844_fsm  12896_vm 
12685_vm   12732      12775      12844_vm   12898 
12687      12732_fsm  12776      12846      12900 
12689      12732_vm   12776_fsm  12847      12901 
12690      12734      12776_vm   12848      12901_fsm 
12691      12735      12778      12848_fsm  12901_vm 
12692      12736      12779      12848_vm   12903 
12692_fsm  12736_fsm  12780      12850      12905 
12692_vm   12736_vm   12782      12851      12906 
12694      12738      12783      12852      12906_fsm 
12695      12739      12784      12854      12906_vm 
12696      12740      12785      12855      12908 
12698      12741      12785_fsm  12856      12910 
12700      12741_fsm  12785_vm   12858      12911 
12701      12741_vm   12787      12859      12911_fsm 
12702      12743      12788      12860      12911_vm 
12703      12744      12789      12862      12913 
12703_fsm  12745      12789_fsm  12863      12915 
12703_vm   12745_fsm  12789_vm   12865      12916 
12705      12745_vm   12791      12866      12918 
12707      12747      12792      12867      12920 
12708      12748      12793      12869      pg_filenode.map 
12709      12749      12794      12871      PG_VERSION 
12710      12751      12794_fsm  12872 
12711      12752      12794_vm   12876 
-bash-4.2$

 

 

「PG_VERSION」ファイルで PostgreSQL のバージョンを確認できます。

-bash-4.2$ cat PG_VERSION
9.2
-bash-4.2$

 

 

 

global ディレクトリ

データベースクラスタで共有するテーブルを保有するディレクトリです。

base ディレクトリ配下のデータベースディレクトリと同じように「Free Space Map ファイル」「Visibility Map ファイル」も格納されています。

-bash-4.2$ cd global/ 
-bash-4.2$ ls 
12673      12807      12812_vm   12821      12873 
12673_fsm  12808      12814      12822      12875 
12673_vm   12808_fsm  12815      12823      12922 
12675      12808_vm   12817      12823_fsm  12924 
12676      12810      12818      12823_vm   12925 
12802      12811      12819      12825      pg_control 
12804      12812      12819_fsm  12827      pg_filenode.map 
12806      12812_fsm  12819_vm   12828      pg_internal.init 
-bash-4.2$

 

 

 

pg_clog ディレクトリ  

トランザクションの「コミット状態」を管理するファイルが格納されます。

-bash-4.2$ cd pg_clog/
-bash-4.2$ ls
0000
-bash-4.2$

 

ファイルの中身です。

-bash-4.2$ cat 0000
@UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU-bash-4.2$

 

 

pg_log ディレクトリ

PostgreSQL のログが格納されています。

-bash-4.2$ cd pg_log/
-bash-4.2$ ls
postgresql-Sat.log
-bash-4.2$

 

 

pg_xlog ディレクトリ

WAL ファイルを格納するディレクトリです。

 

-bash-4.2$ cd pg_xlog/
-bash-4.2$ ls
000000010000000000000001  archive_status
-bash-4.2$

 

 

pg_tblspc ディレクトリ

テーブルやインデックスなどのデータベースオブジェクトを任意のディレクトリに格納した場合にシンボリックリンクの情報を格納するディレクトリです。

 

 

 

 

PostgreSQL で使用するファイル

PostgreSQL で使用されるファイルは「データベースクラスタ」と呼ばれるディレクトリ配下に格納され管理されます。

データベースクラスタを一言でいえば、「ディレクトリ」と言えます。

データベースクラスタは「initdb」コマンドで作成します。(PostgreSQL 9.0 以降は pg_ctl コマンドでも作成可能です)

データベースクラスタので格納場所(ディレクトリ)は自由に決めることができます。

 

PG_VERSION ファイル

PostgreSQL のメジャーバージョン番号が記載されています。

-bash-4.2$ pwd
/var/lib/pgsql/data

-bash-4.2$ cat PG_VERSION
9.2 ← メジャーバージョンが記載されています。
-bash-4.2$

 

 

postgresql.conf ファイル

PostgreSQL のパラメータを設定するファイルです。

-bash-4.2$ pwd 
/var/lib/pgsql/data 
-bash-4.2$ ls 
base         pg_ident.conf  pg_serial     pg_tblspc    postgresql.conf 
global       pg_log         pg_snapshots  pg_twophase  postmaster.opts 
pg_clog      pg_multixact   pg_stat_tmp   PG_VERSION   postmaster.pid 
pg_hba.conf  pg_notify      pg_subtrans   pg_xlog

 

 

コメントアウトされた行を排除して「postgresql.conf」を確認するとデフォルトではほとんどパラメータが設定されていない状態であることが分かります。

 

【コメントアウト行の除外後】

-bash-4.2$ grep -v '^\s*#' postgresql.conf | grep -v '^\s*$' 
max_connections = 100                   # (change requires restart) 
shared_buffers = 32MB                   # min 128kB 
logging_collector = on                  # Enable capturing of stderr and csvlog 
log_filename = 'postgresql-%a.log'      # log file name pattern, 
log_truncate_on_rotation = on           # If on, an existing log file with the 
log_rotation_age = 1d                   # Automatic rotation of logfiles will 
log_rotation_size = 0                   # Automatic rotation of logfiles will 
log_timezone = 'UTC' 
datestyle = 'iso, mdy' 
timezone = 'UTC' 
lc_messages = 'en_US.UTF-8'                     # locale for system error message 
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting 
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting 
lc_time = 'en_US.UTF-8'                         # locale for time formatting 
default_text_search_config = 'pg_catalog.english' 
-bash-4.2$

 

実際の行数は15行です。

-bash-4.2$ grep -v '^\s*#' postgresql.conf | grep -v '^\s*$' | wc -l
15
-bash-4.2$

 

【Linux】grep コマンドで【コメント行】および【空白行】を削除する方法

 

 

 

データベースクラスタのアクセス権限

データベースクラスタ(今回の場合は /var/lib/pgsql/data ディレクトリ配下)のアクセス権限は「700」です。

-bash-4.2$ ls -lh 
total 48K 
drwx------. 5 postgres postgres   41 Nov 17 01:41 base 
drwx------. 2 postgres postgres 4.0K Nov 17 03:42 global 
drwx------. 2 postgres postgres   18 Nov 17 01:41 pg_clog 
-rw-------. 1 postgres postgres 4.2K Nov 17 01:41 pg_hba.conf 
-rw-------. 1 postgres postgres 1.6K Nov 17 01:41 pg_ident.conf 
drwx------. 2 postgres postgres   32 Nov 17 03:42 pg_log 
drwx------. 4 postgres postgres   36 Nov 17 01:41 pg_multixact 
drwx------. 2 postgres postgres   18 Nov 17 03:42 pg_notify 
drwx------. 2 postgres postgres    6 Nov 17 01:41 pg_serial 
drwx------. 2 postgres postgres    6 Nov 17 01:41 pg_snapshots 
drwx------. 2 postgres postgres   25 Nov 17 13:05 pg_stat_tmp 
drwx------. 2 postgres postgres   18 Nov 17 01:41 pg_subtrans 
drwx------. 2 postgres postgres    6 Nov 17 01:41 pg_tblspc 
drwx------. 2 postgres postgres    6 Nov 17 01:41 pg_twophase 
-rw-------. 1 postgres postgres    4 Nov 17 01:41 PG_VERSION 
drwx------. 3 postgres postgres   60 Nov 17 01:41 pg_xlog 
-rw-------. 1 postgres postgres  20K Nov 17 01:41 postgresql.conf 
-rw-------. 1 postgres postgres   57 Nov 17 03:42 postmaster.opts 
-rw-------. 1 postgres postgres   92 Nov 17 03:42 postmaster.pid 
-bash-4.2$

 

PostgreSQL は起動時にアクセス権限が「700」になっていることを確認し、権限が変更されている場合はエラーを出力します。

そのため、コピーを復元したり、バックアップを復元するときは、アクセス権限が変わらないように注意します。

 

 

 

参考図書

現在以下の2冊の本で OSS-DB(PostgreSQL)の勉強をしています。

OSS教科書 OSS-DB Silver

 

 

[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人