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

# CREATE VIRTUAL CLUSTER

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>;
};

export const version = "v26.1";

<Note>
  **This feature is in <InternalLink path="cockroachdb-feature-availability">preview</InternalLink>** and subject to change. To share feedback and/or issues, contact [Support](https://support.cockroachlabs.com).
</Note>

The `CREATE VIRTUAL CLUSTER` statement creates a new virtual cluster. It is supported only starting a <InternalLink path="set-up-physical-cluster-replication">**physical cluster replication (PCR)** job</InternalLink>.

PCR happens between an *active* primary cluster and a *passive* standby cluster that accepts updates from the primary cluster. The unit of replication is a *virtual cluster*, which is part of the underlying infrastructure in the primary and standby clusters. The CockroachDB cluster has:

* The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up PCR, create and manage a virtual cluster, and observe metrics and logs for the CockroachDB cluster and each virtual cluster.
* The application virtual cluster manages the cluster’s data plane. Application virtual clusters contain user data and run application workloads.

For more detail, refer to the <InternalLink path="physical-cluster-replication-overview">Physical Cluster Replication Overview</InternalLink>.

## Required privileges

The following <InternalLink path="security-reference/authorization#supported-privileges">privileges</InternalLink> are required to start a PCR stream with `CREATE VIRTUAL CLUSTER`:

* The `REPLICATIONDEST` and `MANAGEVIRTUALCLUSTER` system privileges: The user starting the PCR stream from the standby cluster.
* The `REPLICATIONSOURCE` system privilege: The user specified in the connection string for the primary cluster.

Use the <InternalLink path="grant">`GRANT SYSTEM`</InternalLink> statement to grant the necessary privileges to users, for example:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
GRANT SYSTEM MANAGEVIRTUALCLUSTER TO user;
```

## Synopsis

xml version="1.0" encoding="UTF-8"?

<CreateVirtualCluster />

## Parameters

| Parameter                     | Description                                                                                                                |
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `virtual\_cluster\_name`      | The name for the new virtual cluster.                                                                                      |
| `LIKE virtual\_cluster\_spec` | Creates a virtual cluster with the same [capabilities](#capabilities) and settings as another virtual cluster.             |
| `primary\_virtual\_cluster`   | The name of the primary's virtual cluster to replicate.                                                                    |
| `primary\_connection\_string` | The PostgreSQL connection string to the primary cluster. Refer to [Connection string](#connection-string) for more detail. |
| `replication\_options\_list`  | Options to modify the PCR streams. Refer to [Options](#options).                                                           |

## Options

| Option                 | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `READ VIRTUAL CLUSTER` | (<InternalLink path="cockroachdb-feature-availability">**Preview**</InternalLink>) Create a <InternalLink path="physical-cluster-replication-technical-overview#start-up-sequence-with-read-on-standby">read-only virtual cluster</InternalLink> on the standby cluster, which allows reads of the standby's replicating virtual cluster. For an example, refer to [Start a PCR stream with read from standby](#start-a-pcr-stream-with-read-from-standby). |

## Connection string

When you <InternalLink path="set-up-physical-cluster-replication#step-4-start-replication">initiate a PCR stream</InternalLink> from the standby cluster, it is necessary to pass a connection string to the system virtual cluster on the primary cluster:

```text theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'
```

To form a connection string similar to the example, include the following values and query parameters. Replace values in <code>{'{...}'}</code> with the appropriate values for your configuration:

| Value                                  | Description                                                                                                                                                                                                                                                        |
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <code>{'{replication user}'}</code>    | The user on the primary cluster that has the `REPLICATION` system privilege. Refer to <InternalLink path="set-up-physical-cluster-replication#create-a-user-with-replication-privileges">Create a user with replication privileges</InternalLink> for more detail. |
| <code>{'{password}'}</code>            | The replication user's password.                                                                                                                                                                                                                                   |
| <code>{'{node ID or hostname}'}</code> | The node IP address or hostname of any node from the primary cluster.                                                                                                                                                                                              |
| `options=ccluster=system`              | The parameter to connect to the system virtual cluster on the primary cluster.                                                                                                                                                                                     |
| `sslmode=verify-full`                  | The `verify-full` secure connection type.                                                                                                                                                                                                                          |
| `sslrootcert={primary cert}`           | The path to the primary cluster's CA certificate on the standby cluster.                                                                                                                                                                                           |

## Capabilities

<Note>
  Cockroach Labs does not recommend changing the default capabilities of created virtual clusters.
</Note>

*Capabilities* control what a virtual cluster can do. When you start a PCR stream, you can specify a virtual cluster with `LIKE` to ensure other virtual clusters on the standby cluster will work in the same way. `LIKE` will refer to a virtual cluster on the CockroachDB cluster you're running the statement from.

## Examples

### Start a PCR stream

To start a PCR stream to the standby of the primary's virtual cluster:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
CREATE VIRTUAL CLUSTER main FROM REPLICATION OF main ON 'postgresql://{connection string to primary}';
```

This will create a `main` virtual cluster in the standby cluster. The standby's system virtual cluster will connect to the primary cluster to initiate the PCR job. For details on the PCR stream, refer to the <InternalLink path="show-virtual-cluster#responses">Responses</InternalLink> for `SHOW VIRTUAL CLUSTER`.

### Start a PCR stream with read from standby

<Note>
  While **physical cluster replication (PCR)** is generally available, using the `READ VIRTUAL CLUSTER` option to read from a standby cluster is in <InternalLink path="cockroachdb-feature-availability">preview</InternalLink>.
</Note>

Use the `READ VIRTUAL CLUSTER` option to set up a PCR stream that also creates a read-only virtual cluster on the standby cluster. You can create a PCR job as per the <InternalLink path="set-up-physical-cluster-replication">Set Up Physical Cluster Replication</InternalLink> guide and then add the option to the `CREATE VIRTUAL CLUSTER` statement:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
CREATE VIRTUAL CLUSTER main FROM REPLICATION OF main ON 'postgresql://{connection string to primary}' WITH READ VIRTUAL CLUSTER;
```

View the newly created virtual clusters:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
SHOW VIRTUAL CLUSTERS;
```

You'll find:

* The `main` virtual cluster, which is accepting writes from the primary cluster.
* The `main-readonly` virtual cluster, which is a read-only version of the `main` virtual cluster.

```text theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
  id |     name      | data_state  | service_mode
-----+---------------+-------------+---------------
   1 | system        | ready       | shared
   3 | main          | replicating | none
   4 | main-readonly | ready       | shared
(3 rows)
```

To read table data from the standby cluster, connect to the `readonly` virtual cluster:

```shell theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
cockroach sql --url `"postgresql://root@{node IP or hostname}:{26257}?options=-ccluster=main-readonly&sslmode=verify-full"` --certs-dir=certs
```

<Note>
  You can only read data on the created `readonly` virtual cluster, other operations like `SHOW VIRTUAL CLUSTERS` must be run from the `system` virtual cluster. To connect to the `readonly` virtual cluster, refer to the <InternalLink path="set-up-physical-cluster-replication#connection-reference">Connection Reference</InternalLink>.
</Note>

If you started the PCR stream with the `READ VIRTUAL CLUSTER` option, failing over with `SYSTEM TIME` will destroy the `readonly` virtual cluster. If you fail over with `LATEST`, the `readonly` virtual cluster will remain on the original standby cluster, but will **not** update with new writes. Use <InternalLink path="drop-virtual-cluster">`DROP VIRTUAL CLUSTER`</InternalLink> to remove the `readonly` virtual cluster.

For details on adding a read-only virtual cluster after a failback, refer to the <InternalLink path="alter-virtual-cluster">`ALTER VIRTUAL CLUSTER`</InternalLink> page.

## See also

* <InternalLink path="drop-virtual-cluster">`DROP VIRTUAL CLUSTER`</InternalLink>
* <InternalLink path="alter-virtual-cluster">`ALTER VIRTUAL CLUSTER`</InternalLink>
* <InternalLink path="show-virtual-cluster">`SHOW VIRTUAL CLUSTER`</InternalLink>
