> ## Documentation Index
> Fetch the complete documentation index at: https://cockroachlabs.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Take Locality-restricted Backups

export const InternalLink = ({version, path = "", children, ...props}) => {
  let detectedVersion = version || "stable";
  if (typeof window !== 'undefined' && !version) {
    const match = window.location.pathname.match(/\/docs\/([^/]+)/);
    if (match) {
      detectedVersion = match[1];
    }
  }
  const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
  return <a href={`/docs/${detectedVersion}/${normalizedPath}`} {...props}>
      {children}
    </a>;
};

The `EXECUTION LOCALITY` option allows you to restrict the nodes that can execute a <InternalLink path="backup">backup</InternalLink> job by using a <InternalLink path="cockroach-start#locality">locality filter</InternalLink> when you create the backup. This will pin the <InternalLink path="backup-architecture#job-creation-phase">coordination of the backup job</InternalLink> and the nodes that <InternalLink path="backup-architecture#export-phase">process the row data</InternalLink> to the defined locality filter.

Pass the `WITH EXECUTION LOCALITY` option for <InternalLink path="restore">`RESTORE`</InternalLink> to restrict execution of the job to nodes with matching localities.

Defining an execution locality for a backup job is useful in the following cases:

* When nodes in a cluster operate in different locality tiers, networking rules can restrict nodes from accessing a storage bucket. For an example, refer to [Access backup storage restricted by network rules](#access-backup-storage-restricted-by-network-rules).
* When a multi-region cluster is running heavy workloads and an aggressive backup schedule, designating a region as the "backup" locality may improve latency. For an example, refer to [Create a non-primary region for backup jobs](#create-a-non-primary-region-for-backup-jobs).

CockroachDB also supports *locality-aware backups*, which allow you to partition and store backup data in a way that is optimized for locality. In general, when you run a locality-aware backup, nodes write backup data to the <InternalLink path="use-cloud-storage">cloud storage</InternalLink> bucket that is closest to the node locality configured at <InternalLink path="cockroach-start">node startup</InternalLink>. Refer to <InternalLink path="take-and-restore-locality-aware-backups">Take and Restore Locality-aware Backups</InternalLink> for more detail.

## Technical overview

For a technical overview of how a locality-restricted backup works, refer to <InternalLink path="backup-architecture#job-coordination-using-the-execution-locality-option">Job coordination using the `EXECUTION LOCALITY` option</InternalLink>.

## Supported products

The feature described on this page is available in **CockroachDB Advanced**, **CockroachDB Standard**, **CockroachDB Basic**, and **CockroachDB self-hosted** clusters when you are running <InternalLink version="cockroachcloud" path="take-and-restore-self-managed-backups">self-managed backups</InternalLink>. For a full list of features, refer to <InternalLink path="backup-and-restore-overview#backup-and-restore-support">Backup and restore product support</InternalLink>.

## Syntax

To specify the locality filter for the coordinating node, run `EXECUTION LOCALITY` with key-value pairs. The key-value pairs correspond to the <InternalLink path="cockroach-start#locality">locality designations</InternalLink> a node is configured to use when it starts.

You can bind any ordered list of locality key-value pairs, from most inclusive to least inclusive, to a node at startup. For example, a user with a multi-region and multi-cloud deployment may bind each node with `cloud=,region=` locality tiers. To back up to a specific `cloud,region`, add `cloud={cloud},region={region}` as the execution locality arguments:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
BACKUP DATABASE {database} INTO 'external://backup_storage' WITH EXECUTION LOCALITY = 'cloud=gce,region=us-west1';
```

When you run a backup or restore that uses `EXECUTION LOCALITY`, consider the following:

* The backup or restore job will fail if no nodes match the locality filter.
* The backup or restore job may take slightly more time to start, because it must select the node that coordinates the backup or restore (the *coordinating node* ). Refer to <InternalLink path="backup-architecture#job-coordination-using-the-execution-locality-option">Job coordination using the `EXECUTION LOCALITY` option</InternalLink>.
* Even after a backup or restore job has been pinned to a locality filter, it may still read data from another locality if no replicas of the data are available in the locality specified by the backup job's locality filter.
* If the job is created on a node that does not match the locality filter, you will receive an error even when the **job creation was successful**. This error indicates that the job execution moved to another node. To avoid this error when creating a manual job (as opposed to a <InternalLink path="create-schedule-for-backup">scheduled job</InternalLink> ), you can use the <InternalLink path="backup">`DETACHED`</InternalLink> option with `EXECUTION LOCALITY`. Then, use the <InternalLink path="show-jobs#show-job-when-complete">`SHOW JOB WHEN COMPLETE`</InternalLink> statement to determine when the job has finished. For more details, refer to <InternalLink path="backup-architecture#job-coordination-using-the-execution-locality-option">Job coordination using the `EXECUTION LOCALITY` option</InternalLink>.
* The backup job will send <InternalLink path="architecture/overview#range">ranges</InternalLink> to the cloud storage bucket matching the node's locality. However, a range's locality will not necessarily match the node's locality. The backup job will attempt to back up ranges through nodes matching that range's locality, however this is not always possible.

## Examples

This section outlines some example uses of the `EXECUTION LOCALITY` option.

### Access backup storage restricted by network rules

For security or other reasons, a cluster may be subject to network rules across regions or to other locality requirements. For example, if you have a requirement that only nodes within the same region as the backup <InternalLink path="use-cloud-storage">cloud storage</InternalLink> location can access the storage bucket, you can configure the backup job's `EXECUTION LOCALITY` to execute only on nodes with network access to the bucket.

The following diagram shows a CockroachDB cluster where each of the nodes can communicate with each other through a specific port, but any other network traffic between regions is blocked. Replicas in regions that do not match the cloud storage region (Node 2) cannot access the storage to <InternalLink path="backup-architecture#export-phase">export backup data</InternalLink>.

Instead, Node 3's locality does match the backup job's `EXECUTION LOCALITY`. Replicas that match a backup job's locality designation and hold the backup job's row data will begin reading and exporting to cloud storage.

<img src="https://mintcdn.com/cockroachlabs/Z2623UEgCBYdavu9/images/v24.1/network-restriction.png?fit=max&auto=format&n=Z2623UEgCBYdavu9&q=85&s=8434a0d7bf9757f08bee14c87a8c91be" alt="Using execution locality when there is a network restriction between locality requirements" width="782" height="573" data-path="images/v24.1/network-restriction.png" />

To execute the backup only on nodes in the same region as the cloud storage location, you can specify <InternalLink path="cockroach-start#locality">locality filters</InternalLink> that a node must match to take part in the backup job's execution.

For example, you can pin the execution of the backup job to `us-west-1`:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
BACKUP DATABASE {database} INTO 'external://backup_storage_uswest' WITH EXECUTION LOCALITY = 'region=us-west-1', DETACHED;
```

To restore the most recent locality-restricted backup:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
RESTORE FROM LATEST IN 'external://backup_storage_uswest' WITH EXECUTION LOCALITY = 'region=us-west-1', DETACHED;
```

Refer to the <InternalLink path="backup">`BACKUP`</InternalLink> and <InternalLink path="restore">`RESTORE`</InternalLink> pages for further detail on other parameters and options.

### Create a non-primary region for backup jobs

Sometimes the execution of backup jobs can consume considerable resources when running <InternalLink path="create-schedule-for-backup">frequent full and incremental backups simultaneously</InternalLink>. One approach to minimize the impact of running background jobs on foreground application traffic is to restrict the execution of backup jobs to a designated subset of nodes that are not also serving application traffic.

This diagram shows a CockroachDB cluster in four regions. The node used to run the backup job was configured with <InternalLink path="architecture/replication-layer#non-voting-replicas">non-voting replicas</InternalLink> to provide low-latency reads. The node in this region will complete the backup job coordination and data export to cloud storage.

<img src="https://mintcdn.com/cockroachlabs/NXeupIfOAa-SZMEU/images/v24.1/background-work.png?fit=max&auto=format&n=NXeupIfOAa-SZMEU&q=85&s=524c824b4f244db31966e0e5bb249620" alt="Using execution locality to create a non-primary region for backup jobs" width="1524" height="795" data-path="images/v24.1/background-work.png" />

For details, refer to:

* The <InternalLink path="cockroach-start#locality">`--locality`</InternalLink> flag to specify the locality tiers that describe the location of a node.
* The `num_voters` and `voter_constraints` variables on the <InternalLink path="configure-replication-zones">Replication Controls</InternalLink> page to configure non-voting replicas via zone configurations.

After configuring the nodes in a specific region to use non-voting replicas, you can create the backup job and define its locality requirement for the nodes:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
BACKUP DATABASE {database} INTO 'external://backup_storage' WITH EXECUTION LOCALITY = 'region={region},dc={datacenter}', DETACHED;
```

## See also

* <InternalLink path="backup-and-restore-overview">Backup and Restore Overview</InternalLink>
* <InternalLink path="backup-architecture">Backup Architecture</InternalLink>
* <InternalLink path="backup">`BACKUP`</InternalLink>
* <InternalLink path="restore">`RESTORE`</InternalLink>
