Introduction

ちょっとしたやらかしだが、Windows 上で PostgreSQL のデータベースを初期化するには

1
2
$ cd C:\Program Files\PostgreSQL\16\bin
$ initdb.exe -D "C:\Program Files\PostgreSQL\16\data"

のように実行するのだが、この時、誤って C:\Program Files\PostgreSQL\16\data そのものを削除していると…面倒なことになる。

What happened?

権限がない

デフォルトの C:\Program Files\PostgreSQL\16\data はインストール時に作成されたフォルダであるため、手動でフォルダを再度作成しただけではエラーになってしまう。

1
2
3
4
5
6
7
8
9
10
11
12
$ cd C:\Program Files\PostgreSQL\16\bin
$ initdb.exe -D "C:\Program Files\PostgreSQL\16\data"
The files belonging to this database system will be owned by user "xxxxxxxx".
This user must also own the server process.

The database cluster will be initialized with locale "English_United States.1252".
The default database encoding has accordingly been set to "WIN1252".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory C:/Program Files/PostgreSQL/16/data ... initdb: error: could not change permissions of directory "C:/Program Files/PostgreSQL/16/data": Permission denied

エラーにある通り、作成されるデータベースのファイルはユーザ xxxxxxxx に所有されることになる。
そのため、データベースフォルダも xxxxxxxx に所有されている必要がある。
xxxxxxxx にフルコントロールで権限をつけると、初期化に成功する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ cd C:\Program Files\PostgreSQL\16\bin
$ initdb.exe -D "C:\Program Files\PostgreSQL\16\data"
The files belonging to this database system will be owned by user "xxxxxxxx".
This user must also own the server process.

The database cluster will be initialized with locale "English_United States.1252".
The default database encoding has accordingly been set to "WIN1252".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory C:/Program Files/PostgreSQL/16/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... windows
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... America/Los_Angeles
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

pg_ctl -D ^"C^:^\Program^ Files^\PostgreSQL^\16^\data^" -l logfile start

しかし…これだけでは終わらない。

サービスが起動しない

初期化が終わり PostgreSQL を再起動するとも、サービスがエラーで止まってしまい起動しない。
こちらも権限が影響している。
ここでは NETWORK SERVICE アカウントが不足している。
NETWORK SERVICE にフルコントロールで権限をつけると、無事に起動に成功する。

Error