DDL replication options
=======================

The `bdr.ddl_replication <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/pgd-settings#bdrddl_replication>`_  parameter specifies replication behavior.

``bdr.ddl_replication = on`` is the default. This setting replicates DDL
to the default replication set, which by default means all nodes.
Non-default replication sets don’t replicate DDL unless they have a
:ref:`Replication sets <Replication sets>` 

defined for them.

You can also replicate DDL to specific replication sets using the
function 
`bdr.replicate_ddl_command() <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/functions#bdrreplicate_ddl_command>`_  . This function can be helpful if you want to run
DDL commands when a node is down. It’s also helpful if you want to have
indexes or partitions that exist on a subset of nodes or rep sets, for
example, all nodes at site1.

::

   SELECT bdr.replicate_ddl_command(
                   CREATE INDEX CONCURRENTLY ON foo (col7);,
                   ARRAY[site1],     -- the replication sets
                   all);              -- ddl_locking to apply

While we don’t recommend it, you can skip automatic DDL replication and
execute it manually on each node using the `bdr.ddl_replication <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/pgd-settings#bdrddl_replication>`_  configuration
parameter.

::

   SET bdr.ddl_replication = off;

When set, it makes PGD skip both the global locking and the replication
of executed DDL commands. You must then run the DDL manually on all
nodes.

..  Warning::
   Executing DDL manually on each node without global locking can cause the whole PGD group to stop replicating if conflicting DDL or DML executes concurrently.

Only the bdr_superuser or superuser can set the ``bdr.ddl_replication``
parameter. It can also be set in the ``postgres.conf`` configuration
file.
