PostgreSQL を運用管理をするうえで、データベースのディレクトリ構造やファイルの役割についての情報が必要になることがあります。
今回は、データベースクラスタのディレクトリやファイルについて解説します。
PostgreSQL の基本的な運用コマンドについては、以下の記事を参考にしてください。
【PostgreSQL】基本的な運用コマンド一覧
PostgreSQL のインストールと初期設定の手順については、以下を参考にしてください。
【PostgreSQL】【CentOS7】yum コマンドで PostgreSQL インストール&初期設定(ユーザー作成、パスワード設定、データベース作成、権限割り当て)手順
PostgreSQL のディレクトリ構造
RedHat 7 系で PostgreSQL 9.2.24 の場合です。
yum で PostgreSQL をインストールした場合、デフォルトでは「/var/lib/pgsql/data」ディレクトリ配下にデータ一式が配置されます。
【参考例】
【参考例】
-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$
|
- 12703_fsm ← Free Space Map ファイル
- 12703_vm ← Visibility Map ファイル
「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)
コメント