diff --git a/_includes/v22.1/sidebar-data/reference.json b/_includes/v22.1/sidebar-data/reference.json index 1bd11ad4edd..6efbc50951b 100644 --- a/_includes/v22.1/sidebar-data/reference.json +++ b/_includes/v22.1/sidebar-data/reference.json @@ -210,6 +210,12 @@ "/${VERSION}/alter-range.html" ] }, + { + "title": "ALTER RANGE ... RELOCATE", + "urls": [ + "/${VERSION}/alter-range-relocate.html" + ] + }, { "title": "ALTER ROLE", "urls": [ diff --git a/v22.1/alter-range-relocate.md b/v22.1/alter-range-relocate.md new file mode 100644 index 00000000000..3c5b7ac43cb --- /dev/null +++ b/v22.1/alter-range-relocate.md @@ -0,0 +1,228 @@ +--- +title: ALTER RANGE ... RELOCATE +summary: Use the ALTER RANGE ... RELOCATE statement to move a lease or replica between stores in an emergency situation. +toc: true +docs_area: reference.sql +--- + +New in v22.1: The `ALTER RANGE ... RELOCATE` statement is a subcommand of [`ALTER RANGE`](alter-range.html). It is used to move a lease or [replica](architecture/overview.html#architecture-replica) between [stores](cockroach-start.html#store). This is helpful in an emergency situation to relocate data in the cluster. + +{{site.data.alerts.callout_danger}} +Most users should not need to use this statement; it is for use in emergency situations. If you are in an emergency situation where you think using this statement may help, Cockroach Labs recommends contacting [support](support-resources.html). +{{site.data.alerts.end}} + +{% include {{ page.version.version }}/misc/schema-change-stmt-note.md %} + +## Synopsis + +
+{% remote_include https://raw.githubusercontent.com/cockroachdb/generated-diagrams/release-22.1/grammar_svg/alter_range_relocate.html %} +
+ +## Required privileges + +To alter a range and move a lease or replica between stores, the user must have one of the following: + +- Membership to the [`admin`](security-reference/authorization.html#admin-role) role for the cluster. + +## Examples + +### Find the cluster node IDs and store IDs + +To use `ALTER RANGE ... RELOCATE`, you will need to know your cluster's node IDs and store IDs. To get the node IDs and store IDs in your cluster, run the following statement: + +{% include_cached copy-clipboard.html %} +~~~ sql +SELECT node_id, store_id FROM crdb_internal.kv_store_status; +~~~ + +~~~ + node_id | store_id +----------+----------- + 1 | 1 + 2 | 2 + 3 | 3 + 4 | 4 + 5 | 5 + 6 | 6 + 7 | 7 + 8 | 8 + 9 | 9 +(9 rows) +~~~ + +### Find range ID and leaseholder information + +To use `ALTER RANGE ... RELOCATE`, you need to know how to find the range ID, leaseholder, and other information for a [table](show-ranges.html#show-ranges-for-a-table-primary-index), [index](show-ranges.html#show-ranges-for-an-index), or [database](show-ranges.html#show-ranges-for-a-database). You can find this information using the [`SHOW RANGES`](show-ranges.html) statement. + +For example, to get all range IDs, leaseholder node IDs, and leaseholder localities for the [`movr.users`](movr.html) table, use the following query: + +{% include_cached copy-clipboard.html %} +~~~ sql +WITH user_info AS (SHOW RANGES FROM TABLE users) SELECT range_id, lease_holder, lease_holder_locality FROM user_info; +~~~ + +~~~ + range_id | lease_holder | lease_holder_locality +-----------+--------------+--------------------------- + 70 | 3 | region=us-east1,az=d + 67 | 9 | region=europe-west1,az=d + 66 | 3 | region=us-east1,az=d + 65 | 3 | region=us-east1,az=d + 69 | 3 | region=us-east1,az=d + 45 | 2 | region=us-east1,az=c + 50 | 2 | region=us-east1,az=c + 46 | 2 | region=us-east1,az=c + 49 | 2 | region=us-east1,az=c +(9 rows) +~~~ + + + +### Move the lease for a range to a specified store + +To move the lease for range ID 70 to store ID 4: + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER RANGE 70 RELOCATE LEASE TO 4; +~~~ + +~~~ + range_id | pretty | result +-----------+------------+--------- + 70 | /Table/106 | ok +(1 row) +~~~ + +### Move the lease for all of a table's ranges to a store + +To move the leases for all data in the [`movr.users`](movr.html) table to a specific store: + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER RANGE RELOCATE LEASE TO 2 FOR SELECT range_id from crdb_internal.ranges where table_name = 'users' +~~~ + +~~~ + range_id | pretty | result +-----------+----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 70 | /Table/106 | unable to find store 2 in range r70:/Table/106{-/1/"amsterdam"/"\xb333333@\x00\x80\x00\x00\x00\x00\x00\x00#"} [(n7,s7):1, (n3,s3):4, (n4,s4):5, next=6, gen=27] + 67 | /Table/106/1/"amsterdam"/"\xb333333@\x00\x80\x00\x00\x00\x00\x00\x00#" | unable to find store 2 in range r67:/Table/106/1/"{amsterdam"/"\xb333333@\x00\x80\x00\x00\x00\x00\x00\x00#"-boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n"} [(n3,s3):4, (n9,s9):6, (n6,s6):7, next=8, gen=34, sticky=9223372036.854775807,2147483647] + 66 | /Table/106/1/"boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n" | unable to find store 2 in range r66:/Table/106/1/"{boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n"-los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e"} [(n7,s7):1, (n3,s3):4, (n4,s4):5, next=6, gen=25, sticky=9223372036.854775807,2147483647] + 65 | /Table/106/1/"los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e" | unable to find store 2 in range r65:/Table/106/1/"{los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e"-new york"/"\x19\x99\x99\x99\x99\x99J\x00\x80\x00\x00\x00\x00\x00\x00\x05"} [(n7,s7):1, (n3,s3):4, (n4,s4):5, next=6, gen=25, sticky=9223372036.854775807,2147483647] + 69 | /Table/106/1/"new york"/"\x19\x99\x99\x99\x99\x99J\x00\x80\x00\x00\x00\x00\x00\x00\x05" | unable to find store 2 in range r69:/Table/106/1/"{new york"/"\x19\x99\x99\x99\x99\x99J\x00\x80\x00\x00\x00\x00\x00\x00\x05"-paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00("} [(n9,s9):5, (n3,s3):4, (n4,s4):3, next=6, gen=29, sticky=9223372036.854775807,2147483647] + 45 | /Table/106/1/"paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00(" | ok + 50 | /Table/106/1/"san francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19" | ok + 46 | /Table/106/1/"seattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14" | ok + 49 | /Table/106/1/"washington dc"/"L\xcc\xcc\xcc\xcc\xccL\x00\x80\x00\x00\x00\x00\x00\x00\x0f" | ok +(9 rows) +~~~ + +When it isn't possible to move a lease for a range to the specified store, the `result` column will show the message `unable to find store ...` as shown above. + +### Move a replica from one store to another store + +If you know the store where a range is located, you can move its lease to another store: + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER RANGE 45 RELOCATE FROM 2 to 4; +~~~ + +~~~ + range_id | pretty | result +-----------+-----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 45 | /Table/106/1/"paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00(" | removing learners from r45:/Table/106/1/"{paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00("-san francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19"} [(n2,s2):1LEARNER, (n8,s8):2, (n5,s5):3, (n4,s4):4, next=5, gen=14, sticky=9223372036.854775807,2147483647]: change replicas of r45 failed: descriptor changed: [expected] r45:/Table/106/1/"{paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00("-san francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19"} [(n2,s2):1LEARNER, (n8,s8):2, (n5,s5):3, (n4,s4):4, next=5, gen=14, sticky=9223372036.854775807,2147483647] != [actual] r45:/Table/106/1/"{paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00("-san francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19"} [(n4,s4):4, (n8,s8):2, (n5,s5):3, next=5, gen=15, sticky=9223372036.854775807,2147483647] +(1 row) +~~~ + +### Move all of a table's replicas on one store to another store + +To move the replicas for all data in the [`movr.users`](movr.html) table on one store to another store: + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER RANGE RELOCATE FROM 2 TO 7 FOR SELECT range_id from crdb_internal.ranges where table_name = 'users'; +~~~ + +~~~ + range_id | pretty | result +-----------+----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 70 | /Table/106 | trying to add a voter to a store that already has a VOTER_FULL + 67 | /Table/106/1/"amsterdam"/"\xb333333@\x00\x80\x00\x00\x00\x00\x00\x00#" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_VOTER Target:n2,s2} + 66 | /Table/106/1/"boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n" | trying to add a voter to a store that already has a VOTER_FULL + 65 | /Table/106/1/"los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e" | trying to add a voter to a store that already has a VOTER_FULL + 69 | /Table/106/1/"new york"/"\x19\x99\x99\x99\x99\x99J\x00\x80\x00\x00\x00\x00\x00\x00\x05" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_VOTER Target:n2,s2} + 45 | /Table/106/1/"paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00(" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_VOTER Target:n2,s2} + 50 | /Table/106/1/"san francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19" | change replicas of r50 failed: descriptor changed: [expected] r50:/Table/106/1/"s{an francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19"-eattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14"} [(n2,s2):1, (n8,s8):2, (n5,s5):3, (n7,s7):4LEARNER, next=5, gen=12, sticky=9223372036.854775807,2147483647] != [actual] r50:/Table/106/1/"s{an francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19"-eattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14"} [(n2,s2):1, (n8,s8):2, (n5,s5):3, next=5, gen=13, sticky=9223372036.854775807,2147483647] + 46 | /Table/106/1/"seattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14" | removing learners from r46:/Table/106/1/"{seattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14"-washington dc"/"L\xcc\xcc\xcc\xcc\xccL\x00\x80\x00\x00\x00\x00\x00\x00\x0f"} [(n2,s2):1LEARNER, (n8,s8):2, (n5,s5):3, (n7,s7):4, next=5, gen=14, sticky=9223372036.854775807,2147483647]: change replicas of r46 failed: descriptor changed: [expected] r46:/Table/106/1/"{seattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14"-washington dc"/"L\xcc\xcc\xcc\xcc\xccL\x00\x80\x00\x00\x00\x00\x00\x00\x0f"} [(n2,s2):1LEARNER, (n8,s8):2, (n5,s5):3, (n7,s7):4, next=5, gen=14, sticky=9223372036.854775807,2147483647] != [actual] r46:/Table/106/1/"{seattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14"-washington dc"/"L\xcc\xcc\xcc\xcc\xccL\x00\x80\x00\x00\x00\x00\x00\x00\x0f"} [(n7,s7):4, (n8,s8):2, (n5,s5):3, next=5, gen=15, sticky=9223372036.854775807,2147483647] + 49 | /Table/106/1/"washington dc"/"L\xcc\xcc\xcc\xcc\xccL\x00\x80\x00\x00\x00\x00\x00\x00\x0f" | ok +(9 rows) +~~~ + +See the `result` column in the output for the status of the operation. If it's `ok`, the replica was moved with no issues. Other messages will indicate whether the target store is already full (`VOTER_FULL`), or if the replica you're trying to remove doesn't exist. + +### Move all of a range's voting replicas from one store to another store + +To move all of a range's voting replicas from one store to another store: + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER RANGE RELOCATE VOTERS FROM 7 TO 2 FOR SELECT range_id from crdb_internal.ranges where table_name = 'users'; +~~~ + +~~~ + range_id | pretty | result +-----------+----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 70 | /Table/106 | ok + 67 | /Table/106/1/"amsterdam"/"\xb333333@\x00\x80\x00\x00\x00\x00\x00\x00#" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_VOTER Target:n7,s7} + 66 | /Table/106/1/"boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n" | removing learners from r66:/Table/106/1/"{boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n"-los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e"} [(n7,s7):1LEARNER, (n3,s3):4, (n4,s4):5, (n2,s2):6, next=7, gen=28, sticky=9223372036.854775807,2147483647]: change replicas of r66 failed: descriptor changed: [expected] r66:/Table/106/1/"{boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n"-los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e"} [(n7,s7):1LEARNER, (n3,s3):4, (n4,s4):5, (n2,s2):6, next=7, gen=28, sticky=9223372036.854775807,2147483647] != [actual] r66:/Table/106/1/"{boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n"-los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e"} [(n2,s2):6, (n3,s3):4, (n4,s4):5, next=7, gen=29, sticky=9223372036.854775807,2147483647] + 65 | /Table/106/1/"los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e" | ok + 69 | /Table/106/1/"new york"/"\x19\x99\x99\x99\x99\x99J\x00\x80\x00\x00\x00\x00\x00\x00\x05" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_VOTER Target:n7,s7} + 45 | /Table/106/1/"paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00(" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_VOTER Target:n7,s7} + 50 | /Table/106/1/"san francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19" | trying to add a voter to a store that already has a VOTER_FULL + 46 | /Table/106/1/"seattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14" | trying to add a voter to a store that already has a VOTER_FULL + 49 | /Table/106/1/"washington dc"/"L\xcc\xcc\xcc\xcc\xccL\x00\x80\x00\x00\x00\x00\x00\x00\x0f" | trying to add a voter to a store that already has a VOTER_FULL +(9 rows) +~~~ + +See the `result` column in the output for the status of the operation. If it's `ok`, the replica was moved with no issues. Other messages will indicate whether the target store is already full (`VOTER_FULL`), or if the replica you're trying to remove doesn't exist. + +### Move all of a range's non-voting replicas from one store to another store + +To move a range's [non-voting replicas](architecture/replication-layer.html#non-voting-replicas), use the statement below. + +{{site.data.alerts.callout_info}} +This statement will only have an effect on clusters that have non-voting replicas configured, such as [multiregion clusters](multiregion-overview.html). If your cluster is not a multiregion cluster, it doesn't do anything, and will display errors in the `result` field as shown below. +{{site.data.alerts.end}} + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER RANGE RELOCATE NONVOTERS FROM 7 TO 2 FOR SELECT range_id from crdb_internal.ranges where table_name = 'users'; +~~~ + +~~~ + range_id | pretty | result +-----------+----------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------- + 70 | /Table/106 | type of replica being removed (VOTER_FULL) does not match expectation for change: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} + 67 | /Table/106/1/"amsterdam"/"\xb333333@\x00\x80\x00\x00\x00\x00\x00\x00#" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} + 66 | /Table/106/1/"boston"/"333333D\x00\x80\x00\x00\x00\x00\x00\x00\n" | type of replica being removed (VOTER_FULL) does not match expectation for change: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} + 65 | /Table/106/1/"los angeles"/"\x99\x99\x99\x99\x99\x99H\x00\x80\x00\x00\x00\x00\x00\x00\x1e" | type of replica being removed (VOTER_FULL) does not match expectation for change: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} + 69 | /Table/106/1/"new york"/"\x19\x99\x99\x99\x99\x99J\x00\x80\x00\x00\x00\x00\x00\x00\x05" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} + 45 | /Table/106/1/"paris"/"\xcc\xcc\xcc\xcc\xcc\xcc@\x00\x80\x00\x00\x00\x00\x00\x00(" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} + 50 | /Table/106/1/"san francisco"/"\x80\x00\x00\x00\x00\x00@\x00\x80\x00\x00\x00\x00\x00\x00\x19" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} + 46 | /Table/106/1/"seattle"/"ffffffH\x00\x80\x00\x00\x00\x00\x00\x00\x14" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} + 49 | /Table/106/1/"washington dc"/"L\xcc\xcc\xcc\xcc\xccL\x00\x80\x00\x00\x00\x00\x00\x00\x0f" | trying to remove a replica that doesn't exist: {ChangeType:REMOVE_NON_VOTER Target:n7,s7} +(9 rows) +~~~ + +## See also + +- [`ALTER RANGE`](alter-range.html) +- [`SHOW RANGES`](show-ranges.html) +- [`SHOW RANGE FOR ROW`](show-range-for-row.html) +- [Troubleshoot cluster setup](cluster-setup-troubleshooting.html) +- [Replication Layer](architecture/replication-layer.html) +- [Multiregion Capabilities Overview](multiregion-overview.html) +- [SQL Statements](sql-statements.html) diff --git a/v22.1/alter-range.md b/v22.1/alter-range.md index 72f07cd95bb..8009c81d2bb 100644 --- a/v22.1/alter-range.md +++ b/v22.1/alter-range.md @@ -5,4 +5,23 @@ toc: true docs_area: reference.sql --- -The `ALTER RANGE` [statement](sql-statements.html) is used to configure replication zones for system ranges. See the [`CONFIGURE ZONE`](configure-zone.html) subcommand for more details. +The `ALTER RANGE` [statement](sql-statements.html) applies a [schema change](online-schema-changes.html) to a range. For information on using `ALTER RANGE`, see the pages for its [subcommands](#subcommands). + +{% include {{ page.version.version }}/misc/schema-change-stmt-note.md %} + +## Subcommands + +| Subcommand | Description | +|----------------------------------------------------------------------------------------+---------------------------------------------------------------------------------| +| [`CONFIGURE ZONE`](configure-zone.html) | [Configure replication zones](configure-replication-zones.html) for a database. | +| New in v22.1: [`RELOCATE`](alter-range-relocate.html) | Move a lease or replica between stores in an emergency situation. | + +## See also + +- [Configure Replication Zones](configure-replication-zones.html) +- [Multiregion Capabilities Overview](multiregion-overview.html) +- [Troubleshoot cluster setup](cluster-setup-troubleshooting.html) +- [Replication Layer](architecture/replication-layer.html) +- [`ALTER RANGE ... CONFIGURE ZONE`](configure-zone.html) +- [`ALTER RANGE ... RELOCATE`](alter-range-relocate.html) +- [SQL Statements](sql-statements.html) diff --git a/v22.1/configure-zone.md b/v22.1/configure-zone.md index eae1eb1bf65..3278beb8dc1 100644 --- a/v22.1/configure-zone.md +++ b/v22.1/configure-zone.md @@ -5,7 +5,7 @@ toc: true docs_area: reference.sql --- -`CONFIGURE ZONE` is a subcommand of the `ALTER DATABASE`, `ALTER TABLE`, `ALTER INDEX`, `ALTER PARTITION`, and `ALTER RANGE` statements and is used to add, modify, reset, or remove [replication zones](configure-replication-zones.html) for those objects. To view details about existing replication zones, see [`SHOW ZONE CONFIGURATIONS`](show-zone-configurations.html). +`CONFIGURE ZONE` is a subcommand of the `ALTER DATABASE`, `ALTER TABLE`, `ALTER INDEX`, `ALTER PARTITION`, and [`ALTER RANGE`](alter-range.html) statements and is used to add, modify, reset, or remove [replication zones](configure-replication-zones.html) for those objects. To view details about existing replication zones, see [`SHOW ZONE CONFIGURATIONS`](show-zone-configurations.html). In CockroachDB, you can use **replication zones** to control the number and location of replicas for specific sets of data, both when replicas are first added and when they are rebalanced to maintain cluster equilibrium.