ALTER DATABASE statement applies a schema change to a database.
This schema change statement is registered as a job. You can view long-running jobs with
SHOW JOBS.Required privileges
Refer to the respective subcommands.Synopsis
Parameters
Additional parameters are documented for the respective subcommands.
Subcommands
ADD REGION
ALTER DATABASE .. ADD REGION adds a region to a multi-region database. While CockroachDB processes an index modification or changing a table to or from a REGIONAL BY ROW table, attempting to drop a region from the database containing that REGIONAL BY ROW table will produce an error. Similarly, while this statement is running, all index modifications and locality changes on REGIONAL BY ROW tables will be blocked.
In order to add a region with
ADD REGION, you must first set a primary database region with SET PRIMARY REGION, or at database creation. For an example showing how to add a primary region with ALTER DATABASE, see Set the primary region.Required privileges
To add a region to a database, the user must have one of the following:- Membership to the
adminrole for the cluster. - Either ownership or the
CREATEprivilege for the database and allREGIONAL BY ROWtables in the database.
Parameters
For usage, see Synopsis.
ADD SUPER REGION
ALTER DATABASE .. ADD SUPER REGION adds a super region to a multi-region database.
To use super regions, keep the following considerations in mind:
- Your cluster must be a multi-region cluster.
- Super regions must be enabled(/docs/v25.3/alter-database#enable-super-regions).
- Super regions can only contain one or more database regions that have already been added with
ALTER DATABASE ... ADD REGION. - Each database region can only belong to one super region. In other words, given two super regions A and B, the set of database regions in A must be disjoint from the set of database regions in B.
- You cannot drop a region that is part of a super region until you either alter the super region to remove it, or drop the super region altogether.
Required privileges
To add a super region to a database, the user must have one of the following:- Membership to the
adminrole for the cluster. - Either ownership or the
CREATEprivilege for the database.
Parameters
For usage, see Synopsis.
ALTER LOCALITY
ALTER DATABASE .. ALTER LOCALITY provides a customization tool for advanced users to persistently modify the configuration generated by the standard multi-region SQL abstractions on a per-region basis.
The feature this statement enables is also known as Zone Config Extensions. For more information about how it works, and the benefits over using the low-level CONFIGURE ZONE statement, see Zone Config Extensions.
For examples, see Use Zone Config Extensions.
Required privileges
The user must be a member of theadmin or owner roles, or have the CREATE privilege on the database.
Parameters
For usage, see Synopsis.
ALTER SUPER REGION
ALTER DATABASE .. ALTER SUPER REGION alters an existing super region of a multi-region database.
To use super regions, keep the following considerations in mind:
- Your cluster must be a multi-region cluster.
- Super regions must be enabled(/docs/v25.3/alter-database#enable-super-regions).
- Super regions can only contain one or more database regions that have already been added with
ALTER DATABASE ... ADD REGION. - Each database region can only belong to one super region. In other words, given two super regions A and B, the set of database regions in A must be disjoint from the set of database regions in B.
- You cannot drop a region that is part of a super region until you either alter the super region to remove it, or drop the super region altogether.
Required privileges
To alter a database’s super region, the user must have one of the following:- Membership to the
adminrole for the cluster. - Either ownership or the
CREATEprivilege for the database.
Parameters
For usage, see Synopsis.
CONFIGURE ZONE
ALTER DATABASE ... CONFIGURE ZONE is used to add, modify, reset, or remove replication zones for a database. To view details about existing replication zones, use SHOW ZONE CONFIGURATIONS. For more information about replication zones, see Replication Controls.
If you directly change a database’s zone configuration with
ALTER DATABASE ... CONFIGURE ZONE, CockroachDB will block all ALTER DATABASE ... SET PRIMARY REGION statements on the database.Required privileges
The user must be a member of theadmin role or have been granted CREATE or ZONECONFIG privileges. To configure system objects, the user must be a member of the admin role.
Parameters
For usage, see Synopsis.
DROP REGION
ALTER DATABASE .. DROP REGION drops a region from a multi-region database. While CockroachDB processes an index modification or changing a table to or from a REGIONAL BY ROW table, attempting to drop a region from the database containing that REGIONAL BY ROW table will produce an error. Similarly, while this statement is running, all index modifications and locality changes on REGIONAL BY ROW tables will be blocked.
You cannot drop a region from a multi-region database if:
- The region is set as the primary region, unless it is the last remaining region.
- The region is set as the secondary region. To drop the region, you must first unset the secondary region using
DROP SECONDARY REGION. - The database uses the
REGIONsurvival goal and there are only three regions configured on the database.
Required privileges
To drop a region from a database, the user must have one of the following:- Membership to the
adminrole for the cluster. - Membership to the owner role, or the
CREATEprivilege, for the database and allREGIONAL BY ROWtables in the database.
Parameters
For usage, see Synopsis.
DROP SECONDARY REGION
ALTER DATABASE .. DROP SECONDARY REGION unsets the secondary region (if set) from a multi-region database.
The secondary region is used for failover purposes: if the primary region fails, the secondary region acts as the new primary region. For more information, see Secondary regions.
For examples, see Manage regions.
Required privileges
To unset a secondary region on a database, the user must have one of the following:- Membership to the
adminrole for the cluster. - Membership to the owner role, or the
CREATEprivilege for the database.
DROP SUPER REGION
ALTER DATABASE .. DROP SUPER REGION drops a super region from a multi-region database.
To use super regions, keep the following considerations in mind:
- Your cluster must be a multi-region cluster.
- Super regions must be enabled(/docs/v25.3/alter-database#enable-super-regions).
- Super regions can only contain one or more database regions that have already been added with
ALTER DATABASE ... ADD REGION. - Each database region can only belong to one super region. In other words, given two super regions A and B, the set of database regions in A must be disjoint from the set of database regions in B.
- You cannot drop a region that is part of a super region until you either alter the super region to remove it, or drop the super region altogether.
Required privileges
To drop a super region from a database, the user must have one of the following:- Membership to the
adminrole for the cluster. - Either ownership or the
CREATEprivilege for the database.
Parameters
For usage, see Synopsis.
OWNER TO
ALTER DATABASE ... OWNER TO is used to change the owner of a database.
For examples, see Change database owner.
Required privileges
To change the owner of a database, the user must be anadmin user, or the current owner of the database and a member of the new owner role. The user must also have the CREATEDB privilege.
Parameters
For usage, see Synopsis.
PLACEMENT
ALTER DATABASE ... PLACEMENT is used to set the replica placement policy (DEFAULT or RESTRICTED) for a multi-region database’s regional tables. Regional tables are those with REGIONAL BY ROW or REGIONAL BY TABLE localities.
ALTER DATABASE ... PLACEMENT RESTRICTED constrains the voting and non-voting replica placement for the database’s tables to the home regions associated with those tables. This is a way of opting out of non-voting replicas for regional tables to accomplish one or more of the following goals:
- Implement a data domiciling strategy.
- Reduce the amount of data stored on the cluster.
- Reduce the overhead of replicating data across a large number of regions (e.g., 10 or more) for databases with heavier write loads.
ALTER DATABASE ... PLACEMENT RESTRICTED does not allow you to opt out of placing non-voting replicas entirely. For example, GLOBAL tables in the database will remain unaffected by this statement. GLOBAL tables are designed to have replicas placed across all available cluster regions to ensure fast local reads.
For examples, see Set replica placement policy.
Required privileges
To use this statement, the user must have one of the following:- Membership to the
adminrole for the cluster. - Ownership or the
CREATEprivilege for the database and all tables in the database.
Parameters
For usage, see Synopsis.
The replica placement policies work as follows:
-
DEFAULT (Default): If the replica placement policy is set to DEFAULT, CockroachDB will use its default replica placement settings, which mean that:
- Data will be placed in as many regions as necessary to ensure your database survival goals are met.
- You can get fast stale reads from all database regions.
RESTRICTED: If the replica placement policy is set to RESTRICTED, CockroachDB will constrain replica placement to only those regions where the table has voting replicas (that is, replicas which participate in the Raft quorum). In practice, this means that voting replicas for the table will be constrained to the table’s home region. Specifically, for REGIONAL BY TABLE tables, it will only place replicas in the defined region (or the database’s primary region); for REGIONAL BY ROW tables, it will only place replicas for each underlying partition in the partition’s specified region. Finally, note that:
- Regional tables with this placement setting will no longer provide “fast stale reads” from other (non-home) regions, since fast stale reads rely on the presence of non-voting replicas.
- The
RESTRICTEDreplica placement policy is only available for databases with theZONEsurvival goal. - This setting does not affect how
GLOBALtables work; they will still place replicas in all database regions.
RENAME TO
ALTER DATABASE ... RENAME TO changes the name of a database.
It is not possible to rename a database if the database is referenced by a view. For more details, see View Dependencies.
Required privileges
To rename a database, the user must be a member of theadmin role or must have the CREATEDB parameter set.
Parameters
For usage, see Synopsis.
RESET {session variable}
ALTER DATABASE ... RESET {session variable} clears a database-level override of a session variable so that future sessions use the default value.
For a list of the session variables that have been updated from default values, see SHOW DEFAULT SESSION VARIABLES FOR ROLE.
Required privileges
No privileges are required to reset a session setting.Parameters
For usage, see Synopsis.
Aliases
In CockroachDB, the following are aliases forALTER DATABASE ... RESET {session variable}:
SET {session variable}
ALTER DATABASE ... SET {session variable} sets the default value of a session variable for all future sessions on the database. This command does not alter the session setting of the current session.
For a list of the session variables that have been updated from default values, see SHOW DEFAULT SESSION VARIABLES FOR ROLE.
Required privileges
To set therole session variable, the current user must be a member of the admin role, or a member of the target role.
All other session variables do not require privileges to modify.
Parameters
For usage, see Synopsis.
Aliases
In CockroachDB, the following are aliases forALTER DATABASE ... SET {session variable}:
ALTER ROLE ALL IN DATABASE ... SET {session variable}
ALTER ROLE ALL ....
Session variable precedence
When a session starts, CockroachDB determines the initial value of each session variable by evaluating the settings in the following order (items earlier in the list take precedence over later items):- Connection string parameters: A value supplied as a query parameter in the connection URL (for example,
.../movr?sslmode=disable&timezone=UTC). - Per-role, per-database defaults: A value set by
ALTER ROLE {role_name} IN DATABASE {db_name} SET {var}={value}. - Per-role, all-database defaults: A value set by
ALTER ROLE {role_name} SET {var}={value}. - All-role, per-database defaults: A value set by
ALTER ROLE ALL IN DATABASE {db_name} SET {var}={value}or equivalently byALTER DATABASE {db_name} SET {var}={value}. - Cluster-wide defaults for all roles and all databases: A value set by
ALTER ROLE ALL SET {var}={value}.
root user is exempt from settings 3–5. The root user is only affected by values specified in the connection string.
You can also set session variables for the duration of a single transaction by using SET LOCAL {var}={value}.
Changes to defaults using the preceding methods only apply to future sessions. This is because session variable resolution happens at session start time. To change a default value in an existing open session, set the variable explicitly with
SET.SET PRIMARY REGION
ALTER DATABASE .. SET PRIMARY REGION sets the primary region of a multi-region database.
If a database’s zone configuration has been directly set with an
ALTER DATABASE ... CONFIGURE ZONE statement, CockroachDB will block all ALTER DATABASE ... SET PRIMARY REGION statements on the database.To remove existing, manually-configured zones from a database (and unblock SET PRIMARY REGION statements on the database), use an ALTER DATABASE ... CONFIGURE ZONE DISCARD statement.Required privileges
To add a primary region to a database with no existing regions, the user must have one of the following:- Membership to the
adminrole for the cluster. - Membership to the owner role, or the
CREATEprivilege, for the database and all tables in the database.
CREATE privilege on the database.
Parameters
For usage, see Synopsis.
SET SECONDARY REGION
ALTER DATABASE .. SET SECONDARY REGION adds a secondary region to a multi-region database for failover purposes.
If the primary region fails, the secondary region becomes the new primary region. For more information, see Secondary regions.
In order to add a secondary region with
ALTER DATABASE ... SET SECONDARY REGION, you must first set a primary database region with SET PRIMARY REGION, or when creating the database. For an example showing how to add a secondary region with ALTER DATABASE, see Set the secondary region.REGIONAL BY ROW tables. CockroachDB does not prevent you from defining secondary regions on databases with regional by row tables, but the interaction of these features is not supported.
Therefore, Cockroach Labs recommends that you avoid defining secondary regions on databases that use regional by row table configurations.
For examples, see Manage regions.
Required privileges
To add a secondary region to a database, the user must have one of the following:- Membership to the
adminrole for the cluster. - Either ownership or the
CREATEprivilege for the database.
Parameters
For usage, see Synopsis.
SURVIVE {ZONE,REGION} FAILURE
ALTER DATABASE ... SURVIVE {ZONE,REGION} FAILURE statement sets the survival goal for a multi-region database.
For examples, see Configure survival goals.
Required privileges
The user must be a member of theadmin or owner roles, or have the CREATE privilege on the database.
Parameters
For usage, see Synopsis.
Examples
Manage regions
Setup
Only a cluster region specified at node startup can be used as a database region. To follow along with the examples in this section, start a demo cluster with the--global flag to simulate a multi-region cluster:
SHOW REGIONS FROM CLUSTER statement:
Set the primary region
Suppose you want to make the databasemovr a multi-region database.
To add the first region to the database, or to set an already-added region as the primary region, use a SET PRIMARY REGION statement:
- All tables will be
REGIONAL BY TABLEin the primary region by default. - This means that all such tables will have all of their voting replicas and leaseholders moved to the primary region. This process is known as rebalancing.
Add regions to a database
To add more regions to a database that already has at least one region:SHOW REGIONS FROM DATABASE statement:
Set the secondary region
To set an existing database region (that is not already the primary region) as the secondary region, use the following statement:"us-west1" region will act as the primary region if the original primary region fails.
Secondary regions are not compatible with databases containing REGIONAL BY ROW tables. CockroachDB does not prevent you from defining secondary regions on databases with regional by row tables, but the interaction of these features is not supported.
Therefore, Cockroach Labs recommends that you avoid defining secondary regions on databases that use regional by row table configurations.
Unset the secondary region
To unset an existing database region as the secondary region on a multi-region database, use theDROP SECONDARY REGION statement:
This statement does not drop the region from the database. To drop a region, use
DROP REGION.Change the existing primary region
To change the primary region to another region in the database, use aSET PRIMARY REGION statement.
Drop a region from a database
To drop a region from a multi-region database, use aDROP REGION statement.
- The region is set as the primary region, unless it is the last remaining region.
- The region is set as the secondary region. To drop the region, you must first unset the secondary region using
DROP SECONDARY REGION. - The database uses the
REGIONsurvival goal and there are only three regions configured on the database.
Manage super regions
Setup
Only a cluster region specified at node startup can be used as a database region. To follow along with the examples in this section, start a demo cluster with the--global flag to simulate a multi-region cluster:
SHOW REGIONS FROM CLUSTER statement:
Set up MovR database regions
Execute the following statements. They will tell CockroachDB about the database’s regions. This information is necessary so that CockroachDB can later move data around to optimize access to particular data from particular regions. For more information about how this works at a high level, see Database Regions.Set up MovR global tables
Because the data inpromo_codes is not updated frequently (a.k.a., “read-mostly”), and needs to be available from any region, the right table locality is GLOBAL.
user_promo_codes table to have a foreign key into the global promo_codes table. This will enable fast reads of the promo_codes.code column from any region in the cluster.
Set up MovR regional tables
All of the tables exceptpromo_codes contain rows which are partitioned by region, and updated very frequently. For these tables, the right table locality for optimizing access to their data is REGIONAL BY ROW.
Apply this table locality to the remaining tables. These statements use a CASE statement to put data for a given city in the right region and can take around 1 minute to complete for each table.
-
rides -
user_promo_codes -
users -
vehicle_location_histories -
vehicles
Enable super regions
To enable super regions, set theenable_super_regions session setting to 'on':
sql.defaults.super_regions.enabled cluster setting to true:
Add a super region to a database
To add a super region to a multi-region database, use theALTER DATABASE ... ADD SUPER REGION statement:
Alter a super region
This example assumes you have already added a"usa" super region as shown in the example Add a super region to a database. If you wanted to drop the region us-west1, you would first need to remove it from the super region.
To remove a region from a super region, use the ALTER DATABASE ... ALTER SUPER REGION statement and list only the regions that should remain in the super region:
Allow user to modify a primary region that is part of a super region
By default, you may not change the primary region of a multi-region database when that region is part of a super region. This is a safety setting designed to prevent you from accidentally moving the data for a regional table that is meant to be stored in the super region out of that super region, which could break your data domiciling setup. If you are sure about what you are doing, you can allow modifying the primary region by setting thealter_primary_region_super_region_override session setting to 'on':
sql.defaults.alter_primary_region_super_region_override.enable cluster setting to true:
Drop a super region from a database
To drop a super region from a multi-region database, use aDROP SUPER REGION statement:
ADD SUPER REGION:
Configure replication zones
Cockroach Labs does not recommend modifying zone configurations manually. does not recommend modifying zone configurations manually. Most users should use multi-region SQL statements instead. If additional control is needed, use Zone Config Extensions to augment the multi-region SQL statements.Setup
The following examples use MovR, a fictional vehicle-sharing application, to demonstrate CockroachDB SQL statements. For more information about the MovR example application and dataset, see MovR: A Global Vehicle-sharing App. To follow along, runcockroach demo with the --geo-partitioned-replicas flag. This command opens an interactive SQL shell to a temporary, 9-node in-memory cluster with the movr database.
Create a replication zone for a database
To control replication for a specific database, use theALTER DATABASE ... CONFIGURE ZONE statement to define the relevant values (other values will be inherited from the parent zone):
Edit a replication zone
Remove a replication zone
When you discard a zone configuration, the objects it was applied to will then inherit a configuration from an object “the next level up”; e.g., if the object whose configuration is being discarded is a table, it will use its parent database’s configuration.You cannot
DISCARD any zone configurations on multi-region tables, indexes, or partitions if the multi-region abstractions created the zone configuration.Troubleshoot replication zones
For instructions showing how to troubleshoot replication zones that may be misconfigured, see Troubleshoot Replication Zone Configurations.Use Zone Config Extensions
The following examples show:- How to override specific fields of a schema object’s zone configs.
- How something like the Secondary regions multi-region abstraction could have been implemented using Zone Config Extensions. For this example, we will call it “Failover regions”.
- How to reset a region’s Zone Config Extensions.
- How to discard a region’s Zone Config Extensions.
- How you could implement super regions.
- How to minimize cross-region write latency.
We strongly recommend using the multi-region abstractions over “rolling your own” using Zone Config Extensions. These examples are provided to show the flexibility of Zone Config Extensions.
Setup
The setup described in this section will be used in the following examples.Start a cluster
Start acockroach demo cluster as follows:
SHOW REGIONS:
Make the database multi-region
Next, modify the database to use the multi-region abstractions as follows:- Set the primary region using
SET PRIMARY REGION. - Add the other two regions using
ADD REGION.
Override specific fields of a schema object’s zone configs
In this example we will configure a multi-region MovR database to update itslease_preferences field.
Setting the primary region to us-east1 during the setup steps added us-east1 to lease_preferences.
ALTER DATABASE ... ALTER LOCALITY to overwrite the lease_preferences field to add us-west1 to the list of regions:
lease_preferences field is now updated to include us-west1.
To remove the changes made in this example, reset the Zone Config Extensions.
Implement super regions
In this example, Zone Config Extensions are used to provide an alternative implementation of super regions, which are useful for data domiciling. For this example, you need to start acockroach demo cluster using the following command, which defines the available cluster localities using the --demo-locality flag:
- Make the
movrdatabase into a multi-region database by setting the primary region. - Set the
movrdatabase to survive region failures. - Add the remaining regions defined at cluster start time to the multi-region
movrdatabase (for a total of 6).
ALTER LOCALITY statements to configure replication zones such that:
- Replicas in the
us-east1region are only stored on nodes in the US. - Replicas in the
europe-central1region are only stored on nodes in the EU.
Minimize cross-region write latency
In this example, Zone Config Extensions are used to minimize cross-region write latency in a cluster with the following characteristics:- Three main US regions (
us-west1,us-east1,us-central1). - Two additional distant regions (
europe-west1,asia-northeast1). Only follower reads will be made from these regions.
cockroach demo cluster using the following command, which defines the available cluster localities using the --demo-locality flag:
- Make the
movrdatabase into a multi-region database by setting the primary region. - Set the
movrdatabase to survive region failures. - Add the remaining regions defined at cluster start time to the multi-region
movrdatabase (for a total of 5).
movr database are REGIONAL tables:
ALTER LOCALITY statements to configure replication zones such that:
- The 3 US regions have voting replicas (that is, replicas that participate in Raft quorum).
- The 2 additional regions (Europe and Japan) are left with only non-voting replicas that can be used to serve follower reads.
Failover regions
In this example we will use Zone Config Extensions to configure a multi-region MovR database so that if the primary region fails, enough replicas will be found in another region (the “failover” region) to take over for the primary region. We will set the locality scope for this configuration to beREGIONAL IN, which covers all REGIONAL BY TABLE IN {region} tables and all partitions of REGIONAL BY ROW tables.
This functionality is already provided by the built-in Secondary regions feature. It is used here to show the flexibility of Zone Config Extensions. We strongly recommend using the built-in multi-region features whenever possible.
-
Set the database to have a
REGIONsurvival goal usingALTER DATABASE ... SURVIVE REGION FAILURE: -
Apply the
REGIONAL BY ROWlocality to themovr.ridestable using the following statement: -
View the zone configs for the
movr.ridestable usingSHOW ZONE CONFIGURATION:Remember that we configuredus-east1to be our primary region during cluster setup. The output above confirms thatus-east1is the primary region based on the values of thevoter_constraintsandlease_preferenceskeys. -
Update the configuration to keep additional voting replicas and leaseholders in
us-west1. We do this because we would like to configureus-west1to be the failover region forus-east1. The following SQL statement accomplishes this by configuringus-east1to keep additional voting replicas and leaseholders inus-west1. This means that ifus-east1fails, it will fail over tous-west1. -
View the zone configs for the
movr.ridestable usingSHOW ZONE CONFIGURATION:The following changes are shown:- There are now 2 voting replicas stored in
us-west1. - There is now a preference that if leases cannot be placed in
us-east1, they should be placed inus-west1.
us-east1goes down, the cluster will still be able to operate until some mitigation is in place. - There are now 2 voting replicas stored in
Reset a region’s Zone Config Extensions
To reset the Zone Config Extension configuration applied to a region to the default settings, enter the following statement:This will not reset any configuration created by the multi-region abstractions.
Discard a region’s Zone Config Extensions
To discard the Zone Config Extension settings from a region, enter the following statement:Troubleshoot Zone Config Extensions
The process for troubleshooting Zone Config Extensions is the same as troubleshooting any other changes to zone configs. For instructions showing how to troubleshoot replication zones that may be misconfigured, see Troubleshoot Replication Zone Configurations.Change database owner
Setup
To follow along, runcockroach demo to start a temporary, in-memory cluster with the movr sample dataset preloaded:
Change a database’s owner
Suppose that the current owner of themovr database is root and you want to change the owner to a new user named max.
max, query the pg_catalog.pg_database and pg_catalog.pg_roles tables:
If the user running the command is not an admin user, they must own the database and be a member of the new owning role. They must also have the
CREATEDB privilege.Set replica placement policy
Setup
To follow along with the examples below:-
Start a demo cluster with the
--globalflag to simulate a multi-region cluster: - Set the demo cluster’s database regions and table localities as described in Low Latency Reads and Writes in a Multi-Region Cluster (specifically, starting at Step 5. Execute multi-region SQL statements).
-
Enable the replica placement syntax with either the session variable or the cluster setting as shown below.
-
To use the session variable:
-
To use the cluster setting:
-
To use the session variable:
Use
ALTER ROLE ALL SET {sessionvar} = {val} instead of the sql.defaults.* cluster settings. This allows you to set a default value for all users for any session variable that applies during login, making the sql.defaults.* cluster settings redundant.Create a database with the replica placement policy set to restricted
If you know at database creation time that you’d like to set the database’s replica placement policy to “restricted”, you can do so in aCREATE DATABASE statement as shown below:
Set the replica placement policy to RESTRICTED
When you set the database’s placement policy to RESTRICTED, you are saying that you want the underlying data to be restricted to the table or partition’s home region.
Set the replica placement policy to DEFAULT
If previously you set the replica placement policy to RESTRICTED, you can set it back to the default by issuing the following statement:
Rename database
Rename a database
Configure survival goals
Survive zone failures
To change the survival goal of a multi-region database to survive zone failures, use the following statement:Surviving zone failures is the default setting for multi-region databases.

