Creating Postgres tablespaces
=============================

To create Postgres tablespaces during deployment, define their names and
locations in ``postgres_tablespaces`` under ``cluster_vars`` or a
particular instance’s ``vars`` in config.yml.

If you :ref:`Filesystem configuration <Filesystem configuration>`  with ``volume_for: postgres_tablespace`` set and a
``tablespace_name`` defined, they will be added as default entries to
``postgres_tablespaces`` .

.. code:: yaml

   cluster_vars:
     postgres_tablespaces:
       explicit:
         location: /some/path

   instances:

   - Name: example
     …
     volumes:
     - device_name: /dev/xvdh
       …
       vars:
         volume_for: postgres_tablespace
         tablespace_name: implicit

The example above would create two tablespaces: explicit (at /some/path)
and implicit (at /opt/postgres/tablespaces/implicit/tablespace_data by
default, unless you specify a different mountpoint for the volume).

Every ``postgres_tablespace`` volume must have ``tablespace_name``
defined; the tablespace location will be derived from the volume’s
mountpoint.

Every entry in ``postgres_tablespaces`` must specify a tablespace name
(as the key) and its ``location`` . If you are specifying tablespace
locations explicitly, do not put tablespaces inside PGDATA, and do not
use any volume mountpoint directly as a tablespace location
(``lost+found`` will confuse some tools into thinking the directory is
not empty).

By default, the tablespace ``owner`` is ``postgres`` , but you can set
it to any valid username (the users in :ref:`Creating Postgres users <Creating Postgres users>` 

will have been created by this time).

Streaming replicas must have the same ``postgres_tablespace`` volumes
and ``postgres_tablespaces`` setting as their upstream instance

You can set the default tablespace for a database in :ref:`Creating Postgres databases <Creating Postgres databases>`  .
