Description
initdb creates a new
PostgreSQL database cluster. A database
cluster is a collection of databases that are managed by a single
server instance.
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 may not 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 collation order
(LC_COLLATE) and character set classes
(LC_CTYPE, e.g. upper, lower, digit) are fixed for all
databases and can not be changed. 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. All server locale
values (lc_*) can be displayed via SHOW ALL.
More details can be found in Section 21.1.
The character set encoding can be set separately for a database when
it is created. initdb determines the encoding for
the template1 database, which will serve as the
default for all other databases. To alter the default encoding use
the --encoding option. More details can be found in
Section 21.2.