initdb — create a new PostgreSQL database cluster
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
postgres databases. When you later create a new
database, everything in the
database is copied. (Therefore, anything installed in
template1 is automatically copied into each
database created later.) The
database is a default database meant for use by users, utilities
and third party applications.
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
assign ownership of that directory to the database user account,
su to become the database user to
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
template1 database, which will
serve as the default for all other databases.
To alter the default collation order or character set classes,
--lc-ctype options. Collation orders other than
POSIX also have a performance penalty. For these
reasons it is important to choose the right locale when running
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
SHOW ALL. More details
can be found in Section 23.1.
To alter the default encoding, use the
--encoding. More details can be found in Section 23.3.
This option specifies the default authentication method for
local users used in
using the specified authentication method for non-replication as
well as replication connections.
Do not use
trust unless you trust
all local users on your system.
is the default for ease of installation.
This option specifies the authentication method for local users
via TCP/IP connections used in
This option specifies the authentication method for local users
via Unix-domain socket connections used in
This option specifies the directory where the database cluster
should be stored. This is the only information required by
initdb, but you can avoid writing it
by setting the
variable, which can be convenient since the database server
postgres) can find the database
directory later by the same variable.
Selects the encoding of the template database. This will also be
the default encoding of any database you create later, unless you
override it there. The default is derived from the locale, or
SQL_ASCII if that does not work. The
character sets supported by the PostgreSQL server are described in Section 23.3.1.
Use checksums on data pages to help detect corruption by the I/O system that would otherwise be silent. Enabling checksums may incur a noticeable performance penalty. This option can only be set during initialization, and cannot be changed later. If set, checksums are calculated for all objects, in all databases.
Sets the default locale for the database cluster. If this option
is not specified, the locale is inherited from the environment that
initdb runs in. Locale support is
described in Section 23.1.
--locale, but only sets the
locale in the specified category.
initdb will wait for
all files to be written safely to disk. This option causes
initdb to return without waiting,
which is faster, but means that a subsequent operating system crash
can leave the data directory corrupt. Generally, this option is
useful for testing, but should not be used when creating a
initdb read the database
superuser's password from a file. The first line of the file is
taken as the password.
Safely write all database files to disk and exit. This does not perform any of the normal initdb operations.
Sets the default text search configuration. See default_text_search_config for further information.
Selects the user name of the database superuser. This defaults
to the name of the effective user running
initdb. It is really not important what the
superuser's name is, but one might choose to keep the customary
name postgres, even if the
operating system user's name is different.
initdb prompt for a password
to give the database superuser. If you don't plan on using password
authentication, this is not important. Otherwise you won't be able
to use password authentication until you have a password set
This option specifies the directory where the write-ahead log should be stored.
Other, less commonly used, options are also available:
Print debugging output from the bootstrap backend and a few
other messages of lesser interest for the general public. The
bootstrap backend is the program
initdb uses to create the catalog tables. This
option generates a tremendous amount of extremely boring
initdb should find
its input files to initialize the database cluster. This is
normally not necessary. You will be told if you need to specify
their location explicitly.
By default, when
that an error prevented it from completely creating the database
cluster, it removes any files it might have created before
discovering that it cannot finish the job. This option inhibits
tidying-up and is thus useful for debugging.
Print the initdb version and exit.
Show help about initdb command line arguments, and exit.
Specifies the directory where the database cluster is to be
stored; can be overridden using the
Specifies the default time zone of the created database cluster. The value should be a full time zone name (see Section 8.5.3).
This utility, like most other PostgreSQL utilities, also uses the environment variables supported by libpq (see Section 33.14).
initdb can also be invoked via
If you see anything in the documentation that is not correct, does not match your experience with the particular feature or requires further clarification, please use this form to report a documentation issue.