initdb creates a new
PostgreSQL database cluster. A database
cluster is a collection of databases that are managed by a single
Creating a database cluster consists of creating the directories in
which the database data will live, generating the shared catalog
tables (tables that belong to the whole cluster rather than to any
particular database), and creating the template1
and postgres databases. When you later create a
new database, everything in the template1 database is
copied. (Therefore, anything installed in template1
is automatically copied into each database created later.)
The postgres database is a default database meant
for use by users, utilities and third party applications.
Although initdb will attempt to create the
specified data directory, it might not have permission if the parent
directory of the desired data directory is root-owned. To initialize
in such a setup, create an empty data directory as root, then use
chown to assign ownership of that directory to the
database user account, then su to become the
database user to run initdb.
initdb must be run as the user that will own the
server process, because the server needs to have access to the
files and directories that initdb creates.
Since the server cannot be run as root, you must not run
initdb as root either. (It will in fact refuse
to do so.)
initdb initializes the database cluster's default
locale and character set encoding. The character set encoding,
collation order (LC_COLLATE) and character set classes
(LC_CTYPE, e.g. upper, lower, digit) can be set separately
for a database when it is created. initdb determines
those settings for the template1 database, which will
serve as the default for all other databases.
To alter the default collation order or character set classes, use the
--lc-collate and --lc-ctype options.
Collation orders other than C or POSIX also have
a performance penalty. For these reasons it is important to choose the
right locale when running initdb.
The remaining locale categories can be changed later when the server
is started. You can also use --locale to set the
default for all locale categories, including collation order and
character set classes. All server locale values (lc_*) can
be displayed via SHOW ALL.
More details can be found in Section 22.1.
To alter the default encoding, use the --encoding.
More details can be found in Section 22.2.