From dcab056a1bae5338479fbab8218140d4c0eba5ab Mon Sep 17 00:00:00 2001
From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com>
Date: Fri, 26 Apr 2024 11:33:26 -0400
Subject: [PATCH 01/25] Remove config profile flags from pcr and update
responses from show virtual cluster (#18488)
---
.../interface-virtual-cluster.md | 2 +-
.../interface-virtual-cluster.md | 4 +-
.../show-virtual-cluster-data-state.md | 2 +-
.../show-virtual-cluster-responses.md | 7 +-
src/current/v23.2/create-virtual-cluster.md | 2 +-
src/current/v23.2/cutover-replication.md | 14 +-
...physical-cluster-replication-monitoring.md | 2 +-
.../physical-cluster-replication-overview.md | 4 +-
.../set-up-physical-cluster-replication.md | 24 +--
src/current/v23.2/show-virtual-cluster.md | 2 +-
.../v23.2/work-with-virtual-clusters.md | 4 +-
src/current/v24.1/alter-virtual-cluster.md | 8 +-
src/current/v24.1/create-virtual-cluster.md | 14 +-
src/current/v24.1/cutover-replication.md | 44 +++---
src/current/v24.1/drop-virtual-cluster.md | 4 +-
...physical-cluster-replication-monitoring.md | 19 ++-
.../physical-cluster-replication-overview.md | 18 +--
.../set-up-physical-cluster-replication.md | 144 ++++++++----------
src/current/v24.1/show-virtual-cluster.md | 33 +++-
.../v24.1/work-with-virtual-clusters.md | 9 +-
20 files changed, 184 insertions(+), 176 deletions(-)
diff --git a/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md b/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md
index 96c5ddd74ab..8fb43c6ee1c 100644
--- a/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md
+++ b/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md
@@ -1,2 +1,2 @@
-- 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 physical cluster replication, create and manage a virtual clusters, and observe metrics and logs for the CockroachDB cluster and each virtual cluster.
+- 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 physical cluster replication, create and manage a virtual cluster, and observe metrics and logs for the CockroachDB cluster and each virtual cluster.
- Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `application`.
diff --git a/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md b/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md
index 96c5ddd74ab..aaca2fd0cb0 100644
--- a/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md
+++ b/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md
@@ -1,2 +1,2 @@
-- 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 physical cluster replication, create and manage a virtual clusters, and observe metrics and logs for the CockroachDB cluster and each virtual cluster.
-- Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `application`.
+- 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 physical cluster replication, create and manage a virtual cluster, and observe metrics and logs for the CockroachDB cluster and each virtual cluster.
+- Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `main`.
diff --git a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md
index a39bef0fe3e..c0a3163e8f3 100644
--- a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md
+++ b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md
@@ -5,5 +5,5 @@ State | Description
`replicating` | The replication job has started and is replicating data.
`replication paused` | The replication job is paused due to an error or a manual request with [`ALTER VIRTUAL CLUSTER ... PAUSE REPLICATION`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}).
`replication pending cutover` | The replication job is running and the cutover time has been set. Once the the replication reaches the cutover time, the cutover will begin automatically.
-`replication cutting over` | The job has started cutting over. The cutover time can no longer be changed. Once cutover is complete, A virtual cluster will be available for use with [`ALTER VIRTUAL CLUSTER ... START SHARED SERVICE`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}).
+`replication cutting over` | The job has started cutting over. The cutover time can no longer be changed. Once cutover is complete, a virtual cluster will be available for use with [`ALTER VIRTUAL CLUSTER ... START SHARED SERVICE`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}).
`replication error` | An error has occurred. You can find more detail in the error message and the logs.
diff --git a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md
index a537bc94939..545fc73058c 100644
--- a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md
+++ b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md
@@ -3,12 +3,13 @@ Field | Response
`id` | The ID of a virtual cluster.
`name` | The name of the standby (destination) virtual cluster.
`data_state` | The state of the data on a virtual cluster. This can show one of the following: `initializing replication`, `ready`, `replicating`, `replication paused`, `replication pending cutover`, `replication cutting over`, `replication error`. Refer to [Data state](#data-state) for more detail on each response.
-`service_mode` | The service mode shows whether a virtual cluster is ready to accept SQL requests. This can show one `none` or `shared`. When `shared`, a virtual cluster's SQL connections will be served by the same nodes that are serving the system virtual cluster.
+`service_mode` | The service mode shows whether a virtual cluster is ready to accept SQL requests. This can show `none` or `shared`. When `shared`, a virtual cluster's SQL connections will be served by the same nodes that are serving the system virtual cluster.
`source_tenant_name` | The name of the primary (source) virtual cluster.
`source_cluster_uri` | The URI of the primary (source) cluster. The standby cluster connects to the primary cluster using this URI when [starting a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication).
-`replication_job_id` | The ID of the replication job.
-`replicated_time` | The latest timestamp at which the standby cluser has consistent data — that is, the latest time you can cut over to. This time advances automatically as long as the replication proceeds without error. `replicated_time` is updated periodically (every `30s`).
+`replicated_time` | The latest timestamp at which the standby cluster has consistent data — that is, the latest time you can cut over to. This time advances automatically as long as the replication proceeds without error. `replicated_time` is updated periodically (every `30s`).
`retained_time` | The earliest timestamp at which the standby cluster has consistent data — that is, the earliest time you can cut over to.
+`replication_lag` | The time between the most up-to-date replicated time and the actual time. Refer to the [Technical Overview]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %}) for more detail.
`cutover_time` | The time at which the cutover will begin. This can be in the past or the future. Refer to [Cut over to a point in time]({% link {{ page.version.version }}/cutover-replication.md %}#cut-over-to-a-point-in-time).
+`status` | The status of the replication stream. This can show one of the following: `initializing replication`, `ready`, `replicating`, `replication paused`, `replication pending cutover`, `replication cutting over`, `replication error`. Refer to [Data state](#data-state) for more detail on each response.
`capability_name` | The [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) name.
`capability_value` | Whether the [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) is enabled for a virtual cluster.
diff --git a/src/current/v23.2/create-virtual-cluster.md b/src/current/v23.2/create-virtual-cluster.md
index 52a9214901c..377a280cf4a 100644
--- a/src/current/v23.2/create-virtual-cluster.md
+++ b/src/current/v23.2/create-virtual-cluster.md
@@ -57,7 +57,7 @@ When you [initiate a replication stream]({% link {{ page.version.version }}/set-
{% include_cached copy-clipboard.html %}
~~~
-'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'
+'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 `{...}` with the appropriate values for your configuration:
diff --git a/src/current/v23.2/cutover-replication.md b/src/current/v23.2/cutover-replication.md
index b6da91cf3de..1f767452159 100644
--- a/src/current/v23.2/cutover-replication.md
+++ b/src/current/v23.2/cutover-replication.md
@@ -44,9 +44,9 @@ SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS;
{% include_cached copy-clipboard.html %}
~~~
- id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+---------------
- 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL
+ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
+-----+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+---------------
+ 5 | application | replicating | none | application | postgresql://user:redacted@host?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL
~~~
Run the following from the standby cluster's SQL shell to start the cutover:
@@ -82,7 +82,7 @@ The `retained_time` response provides the earliest time to which you can cut ove
~~~
id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+---------------
-3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
+3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
(1 row)
~~~
@@ -117,9 +117,9 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER
SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS;
~~~
~~~
- id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
- -----+---------------------+-----------------------------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+---------------------------------
- 4 | application | replication pending cutover | none | application | postgresql://user:redacted@3ip:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000
+ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
+ -----+---------------------+-----------------------------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+---------------------------------
+ 4 | application | replication pending cutover | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000
(1 row)
~~~
diff --git a/src/current/v23.2/physical-cluster-replication-monitoring.md b/src/current/v23.2/physical-cluster-replication-monitoring.md
index bf0c8075833..a99e1b6547c 100644
--- a/src/current/v23.2/physical-cluster-replication-monitoring.md
+++ b/src/current/v23.2/physical-cluster-replication-monitoring.md
@@ -35,7 +35,7 @@ Refer to [Responses](#responses) for a description of each field.
~~~
id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+---------------
-3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
+3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
(1 row)
~~~
diff --git a/src/current/v23.2/physical-cluster-replication-overview.md b/src/current/v23.2/physical-cluster-replication-overview.md
index 5f90783055e..4c904174d4c 100644
--- a/src/current/v23.2/physical-cluster-replication-overview.md
+++ b/src/current/v23.2/physical-cluster-replication-overview.md
@@ -91,14 +91,14 @@ To connect to a virtualized cluster using the SQL shell:
{% include_cached copy-clipboard.html %}
~~~ shell
- cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs"
+ cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs"
~~~
- For the application virtual cluster, include the `options=-ccluster=application` parameter in the `postgresql` connection URL:
{% include_cached copy-clipboard.html %}
~~~ shell
- cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs"
+ cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs"
~~~
{{site.data.alerts.callout_info}}
diff --git a/src/current/v23.2/set-up-physical-cluster-replication.md b/src/current/v23.2/set-up-physical-cluster-replication.md
index 4259f4d5a19..1d97e29a142 100644
--- a/src/current/v23.2/set-up-physical-cluster-replication.md
+++ b/src/current/v23.2/set-up-physical-cluster-replication.md
@@ -78,7 +78,7 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`]
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
- "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \
+ "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \
--certs-dir "certs"
~~~
@@ -147,7 +147,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi
{% include_cached copy-clipboard.html %}
~~~ shell
- cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"
+ cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"
~~~
Replace `{node_advertise_address}` and `{node_advertise_port}` with a node's [`--advertise-addr`]({% link {{ page.version.version }}/cockroach-start.md %}#flags-advert-addr) IP address or hostname and port.
@@ -165,7 +165,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi
{% include_cached copy-clipboard.html %}
~~~ shell
- cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"
+ cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"
~~~
1. To connect to the primary cluster's application virtual cluster, use the `ccluster=application` parameter:
@@ -173,7 +173,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
- "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" \
+ "postgresql://root@{node IP or hostname}:26257?options=-ccluster=application&sslmode=verify-full" \
--certs-dir "certs"
~~~
@@ -219,7 +219,7 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`]
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
- "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \
+ "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \
--certs-dir "certs"
~~~
@@ -310,7 +310,7 @@ The system virtual cluster in the standby cluster initiates and controls the rep
~~~ sql
CREATE VIRTUAL CLUSTER application LIKE template
FROM REPLICATION OF application
- ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt';
+ ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt';
~~~
{% include {{ page.version.version }}/physical-replication/like-description.md %}
@@ -356,9 +356,9 @@ The system virtual cluster in the standby cluster initiates and controls the rep
{% include_cached copy-clipboard.html %}
~~~
- id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
- ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+---------------
- 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
+ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
+ ---+--------------------+--------------------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+---------------
+ 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
(1 row)s
~~~
@@ -372,9 +372,9 @@ For additional detail on the standard CockroachDB connection parameters, refer t
Cluster | Interface | Usage | URL and Parameters
--------+-----------+-------+------------+----
-Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`
- `options=-ccluster=system`
- `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate.
-Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`
{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:
- `options=-ccluster=application`
- `sslmode=verify-full`
- `sslrootcert={path}/certs/ca.crt`
- `sslcert={path}/certs/client.root.crt`
- `sslkey={path}/certs/client.root.key`
-Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`
- `options=-ccluster=system`
- `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate.
+Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`
- `options=-ccluster=system`
- `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate.
+Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`
{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:
- `options=-ccluster=application`
- `sslmode=verify-full`
- `sslrootcert={path}/certs/ca.crt`
- `sslcert={path}/certs/client.root.crt`
- `sslkey={path}/certs/client.root.key`
+Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`
- `options=-ccluster=system`
- `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate.
## What's next
diff --git a/src/current/v23.2/show-virtual-cluster.md b/src/current/v23.2/show-virtual-cluster.md
index 761c3f2ae41..a10395705a9 100644
--- a/src/current/v23.2/show-virtual-cluster.md
+++ b/src/current/v23.2/show-virtual-cluster.md
@@ -77,7 +77,7 @@ SHOW VIRTUAL CLUSTER application;
~~~
id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
-----+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+---------------
- 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL
+ 5 | application | replicating | none | application | postgresql://user:redacted@host?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL
~~~
### Show replication status
diff --git a/src/current/v23.2/work-with-virtual-clusters.md b/src/current/v23.2/work-with-virtual-clusters.md
index 8ec5cc4409f..972b00508b7 100644
--- a/src/current/v23.2/work-with-virtual-clusters.md
+++ b/src/current/v23.2/work-with-virtual-clusters.md
@@ -34,7 +34,7 @@ For example:
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
-"postgresql://root@{node IP or hostname}:26257/?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \
+"postgresql://root@{node IP or hostname}:26257?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \
--certs-dir "certs"
~~~
@@ -58,7 +58,7 @@ For example, to connect to the system virtual cluster using the `cockroach sql`
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
-"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \
+"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \
--certs-dir "certs"
~~~
diff --git a/src/current/v24.1/alter-virtual-cluster.md b/src/current/v24.1/alter-virtual-cluster.md
index 3253008dc52..8c63dbf8632 100644
--- a/src/current/v24.1/alter-virtual-cluster.md
+++ b/src/current/v24.1/alter-virtual-cluster.md
@@ -60,7 +60,7 @@ To start the [cutover]({% link {{ page.version.version }}/cutover-replication.md
{% include_cached copy-clipboard.html %}
~~~ sql
-ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO {cutover time specification};
+ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO {cutover time specification};
~~~
You can use either:
@@ -74,7 +74,7 @@ You can change the retention window to protect data from [garbage collection]({%
{% include_cached copy-clipboard.html %}
~~~ sql
-ALTER VIRTUAL CLUSTER application SET REPLICATION RETENTION = '24h';
+ALTER VIRTUAL CLUSTER main SET REPLICATION RETENTION = '24h';
~~~
{% include {{ page.version.version }}/physical-replication/retention.md %}
@@ -85,14 +85,14 @@ When a virtual cluster is [`ready`]({% link {{ page.version.version }}/show-virt
{% include_cached copy-clipboard.html %}
~~~ sql
-ALTER VIRTUAL CLUSTER application START SHARED SERVICE;
+ALTER VIRTUAL CLUSTER main START SHARED SERVICE;
~~~
To stop the `shared` service for a virtual cluster and prevent it from accepting SQL connections:
{% include_cached copy-clipboard.html %}
~~~ sql
-ALTER VIRTUAL CLUSTER application STOP SERVICE;
+ALTER VIRTUAL CLUSTER main STOP SERVICE;
~~~
## See also
diff --git a/src/current/v24.1/create-virtual-cluster.md b/src/current/v24.1/create-virtual-cluster.md
index 44b989c75a5..1f886e276f3 100644
--- a/src/current/v24.1/create-virtual-cluster.md
+++ b/src/current/v24.1/create-virtual-cluster.md
@@ -57,7 +57,7 @@ When you [initiate a replication stream]({% link {{ page.version.version }}/set-
{% include_cached copy-clipboard.html %}
~~~
-'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'
+'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 `{...}` with the appropriate values for your configuration:
@@ -77,20 +77,20 @@ Value | Description
Cockroach Labs does not recommend changing the default capabilities of created virtual clusters.
{{site.data.alerts.end}}
-_Capabilities_ control what a virtual cluster can do. The [configuration profile]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#start-the-standby-cluster) included at startup creates the `template` virtual cluster with the same set of capabilities per CockroachDB version. When you start a replication stream, you can specify the `template` VC 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.
+_Capabilities_ control what a virtual cluster can do. When you start a replication 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 replication stream
-To start a replication stream to the standby of the primary's application virtual cluster:
+To start a replication stream to the standby of the primary's virtual cluster:
{% include_cached copy-clipboard.html %}
~~~ sql
-CREATE VIRTUAL CLUSTER application LIKE template FROM REPLICATION OF application ON 'postgresql://{connection string to primary}';
+CREATE VIRTUAL CLUSTER main FROM REPLICATION OF main ON 'postgresql://{connection string to primary}';
~~~
-This will create a virtual cluster in the standby cluster that is based on the `template` virtual cluster, which is created during [cluster startup with `--config-profile`]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#start-the-primary-cluster). The standby's system virtual cluster will connect to the primary cluster to initiate the replication stream job. For detail on the replication stream, refer to the [Responses]({% link {{ page.version.version }}/show-virtual-cluster.md %}#responses) for `SHOW VIRTUAL CLUSTER`.
+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 replication stream job. For detail on the replication stream, refer to the [Responses]({% link {{ page.version.version }}/show-virtual-cluster.md %}#responses) for `SHOW VIRTUAL CLUSTER`.
### Specify a retention window for a replication stream
@@ -98,10 +98,10 @@ When you initiate a replication stream, you can specify a retention window to pr
{% include_cached copy-clipboard.html %}
~~~ sql
-CREATE VIRTUAL CLUSTER application LIKE template FROM REPLICATION OF application ON 'postgresql://{connection string to primary}' WITH RETENTION '36h';
+CREATE VIRTUAL CLUSTER main FROM REPLICATION OF main ON 'postgresql://{connection string to primary}' WITH RETENTION '36h';
~~~
-This will initiate a replication stream from the primary cluster into the standby cluster's new `standbyapplication` virtual cluster. The `RETENTION` option allows you to specify a timestamp in the past for cutover to the standby cluster. After cutover, the `standbyapplication` will be transactionally consistent to any timestamp within that retention window.
+This will initiate a replication stream from the primary cluster into the standby cluster's new `main` virtual cluster. The `RETENTION` option allows you to specify a timestamp in the past for cutover to the standby cluster. After cutover, the standby `main` virtual cluster will be transactionally consistent to any timestamp within that retention window.
{% include {{ page.version.version }}/physical-replication/retention.md %}
diff --git a/src/current/v24.1/cutover-replication.md b/src/current/v24.1/cutover-replication.md
index 0ead39ad859..c29b1b1c8b5 100644
--- a/src/current/v24.1/cutover-replication.md
+++ b/src/current/v24.1/cutover-replication.md
@@ -39,21 +39,22 @@ To view the current replication timestamp, use:
{% include_cached copy-clipboard.html %}
~~~ sql
-SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS;
+SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS;
~~~
{% include_cached copy-clipboard.html %}
~~~
- id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+---------------
- 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL
+ id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status
+-----+------+--------------------+-------------------------------------------------+---------------------------------+------------------------+-----------------+--------------+--------------
+ 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating
+(1 row)
~~~
Run the following from the standby cluster's SQL shell to start the cutover:
{% include_cached copy-clipboard.html %}
~~~ sql
-ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO LATEST;
+ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO LATEST;
~~~
The `cutover_time` is the timestamp at which the replicated data is consistent. The cluster will revert any data above this timestamp:
@@ -73,16 +74,15 @@ To select a [specific time]({% link {{ page.version.version }}/as-of-system-time
{% include_cached copy-clipboard.html %}
~~~ sql
-SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS;
+SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS;
~~~
The `retained_time` response provides the earliest time to which you can cut over.
-{% include_cached copy-clipboard.html %}
~~~
-id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
----+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+---------------
-3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
+ id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status
+-----+------+--------------------+-------------------------------------------------+-------------------------------+------------------------+-----------------+--------------+--------------
+ 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating
(1 row)
~~~
@@ -90,7 +90,7 @@ Specify a timestamp:
{% include_cached copy-clipboard.html %}
~~~ sql
-ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO SYSTEM TIME '-1h';
+ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO SYSTEM TIME '-1h';
~~~
Refer to [Using different timestamp formats]({% link {{ page.version.version }}/as-of-system-time.md %}#using-different-timestamp-formats) for more information.
@@ -99,13 +99,16 @@ Similarly, to cut over to a specific time in the future:
{% include_cached copy-clipboard.html %}
~~~ sql
-ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO SYSTEM TIME '+5h';
+ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO SYSTEM TIME '+5h';
~~~
A future cutover will proceed once the replicated data has reached the specified time.
{{site.data.alerts.callout_info}}
-To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER ... WITH REPLICATION STATUS`]({% link {{ page.version.version }}/show-virtual-cluster.md %}) to find the replication stream's `replication_job_id`, which you can pass to `SHOW JOB WHEN COMPLETE job_id` as the `job_id`. Refer to the `SHOW JOBS` page for [details]({% link {{ page.version.version }}/show-jobs.md %}#parameters) and an [example]({% link {{ page.version.version }}/show-jobs.md %}#show-job-when-complete).
+To monitor for when the replication stream completes, do the following:
+
+1. Find the replication stream's `job_id` using `SELECT * FROM [SHOW JOBS] WHERE job_type = 'REPLICATION STREAM INGESTION';`
+1. Run `SHOW JOB WHEN COMPLETE job_id`. Refer to the `SHOW JOBS` page for [details]({% link {{ page.version.version }}/show-jobs.md %}#parameters) and an [example]({% link {{ page.version.version }}/show-jobs.md %}#show-job-when-complete).
{{site.data.alerts.end}}
## Step 2. Complete the cutover
@@ -114,12 +117,12 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER
{% include_cached copy-clipboard.html %}
~~~ sql
- SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS;
+ SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS;
~~~
~~~
- id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
- -----+---------------------+-----------------------------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+---------------------------------
- 4 | application | replication pending cutover | none | application | postgresql://user:redacted@3ip:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000
+ id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status
+ ---+------+--------------------+-------------------------------------------------+-------------------------------+------------------------------+-----------------+--------------------------------+--------------
+ 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2023-09-28 16:09:04.327473+00 | 2023-09-28 17:41:18.03092+00 | 00:00:19.602682 | 1695922878030920020.0000000000 | replication pending cutover
(1 row)
~~~
@@ -129,15 +132,14 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER
{% include_cached copy-clipboard.html %}
~~~ sql
- ALTER VIRTUAL CLUSTER application START SERVICE SHARED;
+ ALTER VIRTUAL CLUSTER main START SERVICE SHARED;
~~~
~~~
id | name | data_state | service_mode
-----+---------------------+--------------------+---------------
1 | system | ready | shared
- 2 | template | ready | none
- 3 | application | ready | shared
+ 3 | main | ready | shared
(3 rows)
~~~
@@ -145,7 +147,7 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER
{% include_cached copy-clipboard.html %}
~~~ sql
- SET CLUSTER SETTING server.controller.default_target_cluster='application';
+ SET CLUSTER SETTING server.controller.default_target_cluster='main';
~~~
At this point, the primary and standby clusters are entirely independent. You will need to use your own network load balancers, DNS servers, or other network configuration to direct application traffic to the standby (now primary). To enable physical cluster replication again, from the new primary to the original primary (or a completely different cluster), refer to [Cut back to the primary cluster](#cut-back-to-the-primary-cluster).
diff --git a/src/current/v24.1/drop-virtual-cluster.md b/src/current/v24.1/drop-virtual-cluster.md
index 03bb7a7de7f..f9471bb839e 100644
--- a/src/current/v24.1/drop-virtual-cluster.md
+++ b/src/current/v24.1/drop-virtual-cluster.md
@@ -55,7 +55,7 @@ To remove a virtual cluster from a CockroachDB cluster:
{% include_cached copy-clipboard.html %}
~~~ sql
-DROP VIRTUAL CLUSTER IF EXISTS application;
+DROP VIRTUAL CLUSTER IF EXISTS main;
~~~
### Remove a virtual cluster without waiting for garbage collection
@@ -64,7 +64,7 @@ Use `IMMEDIATE` to drop a virtual cluster instead of waiting for data to be garb
{% include_cached copy-clipboard.html %}
~~~ sql
-DROP VIRTUAL CLUSTER IF EXISTS application IMMEDIATE;
+DROP VIRTUAL CLUSTER IF EXISTS main IMMEDIATE;
~~~
## See also
diff --git a/src/current/v24.1/physical-cluster-replication-monitoring.md b/src/current/v24.1/physical-cluster-replication-monitoring.md
index 2a3c4e62d0b..c4dd13f4082 100644
--- a/src/current/v24.1/physical-cluster-replication-monitoring.md
+++ b/src/current/v24.1/physical-cluster-replication-monitoring.md
@@ -26,16 +26,15 @@ In the standby cluster's SQL shell, you can query `SHOW VIRTUAL CLUSTER ... WITH
{% include_cached copy-clipboard.html %}
~~~ sql
-SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS;
+SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS;
~~~
Refer to [Responses](#responses) for a description of each field.
-{% include_cached copy-clipboard.html %}
~~~
-id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
----+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+---------------
-3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
+id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status
+---+------+--------------------+-------------------------------------------------+-------------------------------+------------------------------+-----------------+--------------------------------+--------------
+3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2023-09-28 16:09:04.327473+00 | 2023-09-28 17:41:18.03092+00 | 00:00:19.602682 | 1695922878030920020.0000000000 | replicating
(1 row)
~~~
@@ -109,7 +108,7 @@ To verify that the data at a certain point in time is correct on the standby clu
{% include_cached copy-clipboard.html %}
~~~ sql
- SELECT replicated_time FROM [SHOW VIRTUAL CLUSTER standbyapplication WITH REPLICATION STATUS];
+ SELECT replicated_time FROM [SHOW VIRTUAL CLUSTER standbymain WITH REPLICATION STATUS];
~~~
~~~
replicated_time
@@ -124,12 +123,12 @@ To verify that the data at a certain point in time is correct on the standby clu
{% include_cached copy-clipboard.html %}
~~~ sql
- SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER application] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00';
+ SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER main] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00';
~~~
~~~
tenant_name | end_ts | fingerprint
------------+--------------------------------+----------------------
- application | 1704816945291575000.0000000000 | 2646132238164576487
+ main | 1704816945291575000.0000000000 | 2646132238164576487
(1 row)
~~~
@@ -139,12 +138,12 @@ To verify that the data at a certain point in time is correct on the standby clu
{% include_cached copy-clipboard.html %}
~~~ sql
- SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER standbyapplication] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00';
+ SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER standbymain] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00';
~~~
~~~
tenant_name | end_ts | fingerprint
--------------------+--------------------------------+----------------------
- standbyapplication | 1704816945291575000.0000000000 | 2646132238164576487
+ standbymain | 1704816945291575000.0000000000 | 2646132238164576487
(1 row)
~~~
diff --git a/src/current/v24.1/physical-cluster-replication-overview.md b/src/current/v24.1/physical-cluster-replication-overview.md
index 80b1ac8550a..47f10380a97 100644
--- a/src/current/v24.1/physical-cluster-replication-overview.md
+++ b/src/current/v24.1/physical-cluster-replication-overview.md
@@ -23,7 +23,7 @@ You can use physical cluster replication in a disaster recovery plan to:
- Meet your RTO (Recovery Time Objective) and RPO (Recovery Point Objective) requirements. Physical cluster replication provides lower RTO and RPO than [backup and restore]({% link {{ page.version.version }}/backup-and-restore-overview.md %}).
- Automatically replicate everything in your primary cluster to recover quickly from a control plane or full cluster failure.
-- Protect against region failure when you cannot use individual [multi-region clusters]({% link {{ page.version.version }}/multiregion-overview.md %}) — for example, if you have a two-datacenter architecture and do not have access to three regions; or, you need low-write latency in a single region. Physical cluster replication allows for an active-passive (primary-standby) structure across two clusters with the passive cluster in different region.
+- Protect against region failure when you cannot use individual [multi-region clusters]({% link {{ page.version.version }}/multiregion-overview.md %}) — for example, if you have a two-datacenter architecture and do not have access to three regions; or, you need low-write latency in a single region. Physical cluster replication allows for an active-passive (primary-standby) structure across two clusters with the passive cluster in a different region.
- Avoid conflicts in data after recovery; the replication completes to a transactionally consistent state as of a certain point in time.
## Features
@@ -56,18 +56,18 @@ For more comprehensive guides, refer to:
### Start clusters
-To initiate physical cluster replication on clusters, you must [start]({% link {{ page.version.version }}/cockroach-start.md %}) the primary and standby CockroachDB clusters with the `--config-profile` flag. This enables [cluster virtualization]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) and sets up each cluster ready for replication.
+To use physical cluster replication on clusters, you must [initialize]({% link {{ page.version.version }}/cockroach-start.md %}) the primary and standby CockroachDB clusters with the `--virtualized` and `--virtualized-empty` flags respectively. This enables [cluster virtualization]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) and sets up each cluster ready for replication.
The active primary cluster that serves application traffic:
~~~shell
-cockroach start ... --config-profile replication-source
+cockroach init ... --virtualized
~~~
The passive standby cluster that will ingest the replicated data:
~~~shell
-cockroach start ... --config-profile replication-target
+cockroach init ... --virtualized-empty
~~~
The node topology of the two clusters does not need to be the same. For example, you can provision the standby cluster with fewer nodes. However, consider that:
@@ -91,14 +91,14 @@ To connect to a virtualized cluster using the SQL shell:
{% include_cached copy-clipboard.html %}
~~~ shell
- cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs"
+ cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs"
~~~
-- For the application virtual cluster, include the `options=-ccluster=application` parameter in the `postgresql` connection URL:
+- For the virtual cluster, include the `options=-ccluster=main` parameter in the `postgresql` connection URL:
{% include_cached copy-clipboard.html %}
~~~ shell
- cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs"
+ cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=main&sslmode=verify-full" --certs-dir "certs"
~~~
{{site.data.alerts.callout_info}}
@@ -122,11 +122,11 @@ Statement | Action
### Cluster versions and upgrades
-The standby cluster host will need to be at the same major version as, or one version ahead of, the primary's application virtual cluster at the time of cutover.
+The standby cluster host will need to be at the same major version as, or one version ahead of, the primary's virtual cluster at the time of cutover.
To [upgrade]({% link {{ page.version.version }}/upgrade-cockroach-version.md %}) a virtualized cluster, you must carefully and manually apply the upgrade. For details, refer to [Upgrades]({% link {{ page.version.version }}/work-with-virtual-clusters.md %}#upgrade-a-cluster) in the [Cluster Virtualization Overview]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}).
-When physical cluster replication is enabled, we recommend following this procedure on the standby cluster first, before upgrading the primary cluster. It is preferable to avoid a situation in which the application virtual cluster, which is being replicated, is a version higher than what the standby cluster can serve if you were to cut over.
+When physical cluster replication is enabled, we recommend following this procedure on the standby cluster first, before upgrading the primary cluster. It is preferable to avoid a situation in which the virtual cluster, which is being replicated, is a version higher than what the standby cluster can serve if you were to cut over.
## Demo video
diff --git a/src/current/v24.1/set-up-physical-cluster-replication.md b/src/current/v24.1/set-up-physical-cluster-replication.md
index 03b30fca72e..f3b6fe0f8db 100644
--- a/src/current/v24.1/set-up-physical-cluster-replication.md
+++ b/src/current/v24.1/set-up-physical-cluster-replication.md
@@ -34,7 +34,7 @@ The high-level steps in this tutorial are:
{% include enterprise-feature.md %}
- Two separate CockroachDB clusters (primary and standby) with a minimum of three nodes each, and each using the same CockroachDB {{page.version.version}} version.
- - To set up each cluster, you can follow [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}). When you start each node in your cluster with the `cockroach start` command, you **must** pass the `--config-profile` flag with a `replication` value. Refer to cluster creation steps for the [primary cluster](#start-the-primary-cluster) and for the [standby cluster](#start-the-standby-cluster) for details.
+ - To set up each cluster, you can follow [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}). When you initialize the cluster with the [`cockroach init`]({% link {{ page.version.version }}/cockroach-init.md %}) command, you **must** pass the `--virtualized` or `--virtualized-empty` flag. Refer to the cluster creation steps for the [primary cluster](#initialize-the-primary-cluster) and for the [standby cluster](#initialize-the-standby-cluster) for details.
- The [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}) tutorial creates a self-signed certificate for each {{ site.data.products.core }} cluster. To create certificates signed by an external certificate authority, refer to [Create Security Certificates using OpenSSL]({% link {{ page.version.version }}/create-security-certificates-openssl.md %}).
- All nodes in each cluster will need access to the Certificate Authority for the other cluster. Refer to [Copy certificates](#step-3-copy-certificates).
- An [{{ site.data.products.enterprise }} license]({% link {{ page.version.version }}/enterprise-licensing.md %}) on the primary **and** standby clusters. You must use the system virtual cluster on the primary and standby clusters to enable your {{ site.data.products.enterprise }} license.
@@ -42,29 +42,17 @@ The high-level steps in this tutorial are:
## Step 1. Create the primary cluster
-### Start the primary cluster
+### Initialize the primary cluster
-To enable physical cluster replication, it is necessary to start each node with the appropriate _configuration profile_ set with the `--config-profile` flag. A configuration profile applies a custom configuration to the server at initialization time. When using physical cluster replication, the `replication-source` and `replication-target` configuration profiles are used to create a virtualized cluster with a system virtual cluster and an application virtual cluster.
+To enable physical cluster replication, it is necessary to initialize the CockroachDB cluster with the appropriate flag to create the appropriate virtual clusters on the primary and standby cluster.
-The primary cluster requires the following value:
+When initializing the [primary cluster](#initialize-the-primary-cluster), you pass the `--virtualized` flag to create a [_virtualized cluster_]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) with a `system` virtual cluster and a `main` virtual cluster. When initializing the [standby cluster](#initialize-the-standby-cluster), you pass the `--virtualized-empty` flag to create a virtualized standby cluster that contains a `system` virtual cluster.
-{% include_cached copy-clipboard.html %}
-~~~ shell
---config-profile replication-source
-~~~
-
-For example, a `cockroach start` command according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes):
+For example, the `cockroach init` command to initialize the primary cluster (according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes)):
{% include_cached copy-clipboard.html %}
~~~ shell
-cockroach start \
---certs-dir=certs \
---advertise-addr= \
---join=,, \
---cache=.25 \
---max-sql-memory=.25 \
---background \
---config-profile replication-source
+cockroach init --certs-dir=certs --host={address of any node on --join list} --virtualized
~~~
Ensure that you follow the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-4-initialize-the-cluster) to initialize your cluster before continuing to set up physical cluster replication.
@@ -78,14 +66,14 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`]
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
- "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \
+ "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \
--certs-dir "certs"
~~~
The prompt will include `system` when you are connected to the system virtual cluster.
{{site.data.alerts.callout_info}}
- You should only connect to the system virtual cluster for cluster administration. To work with databases, tables, or workloads, connect to the application virtual cluster.
+ You should only connect to the system virtual cluster for cluster administration. To work with databases, tables, or workloads, connect to a virtual cluster.
{{site.data.alerts.end}}
1. Add your cluster organization and [{{ site.data.products.enterprise }} license]({% link {{ page.version.version }}/enterprise-licensing.md %}) to the cluster:
@@ -99,6 +87,13 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`]
SET CLUSTER SETTING enterprise.license = 'your enterprise license';
~~~
+1. Set the `kv.rangefeed.enabled` cluster setting to `true`. The replication job connects to a long-lived request, a _rangefeed_, which pushes changes as they happen:
+
+ {% include_cached copy-clipboard.html %}
+ ~~~ sql
+ SET CLUSTER SETTING kv.rangefeed.enabled = true;
+ ~~~
+
1. Confirm the status of your virtual cluster: {% comment %}Link to SQL ref page here{% endcomment %}
{% include_cached copy-clipboard.html %}
@@ -106,18 +101,17 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`]
SHOW VIRTUAL CLUSTERS;
~~~
- The output will include the `system` interface and the `application` virtual cluster:
+ The output will include the `system` virtual cluster and the `main` virtual cluster:
~~~
- id | name | data_state | service_mode
- ---+-------------+------------+---------------
- 1 | system | ready | shared
- 2 | template | ready | none
- 3 | application | ready | shared
- (3 rows)
+ id | name | data_state | service_mode
+ -----+--------+------------+---------------
+ 1 | system | ready | shared
+ 3 | main | ready | shared
+ (2 rows)
~~~
- Because this is the primary cluster rather than the standby cluster, `data_state` of all rows is `ready`, rather than `replicating` or another status.{% comment %}link to SQL reference or monitoring page here{% endcomment %}
+ Because this is the primary cluster rather than the standby cluster, the `data_state` of all rows is `ready`, rather than `replicating` or another [status]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %}).
### Create a replication user and password
@@ -130,7 +124,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi
CREATE USER {your username} WITH PASSWORD '{your password}';
~~~
-1. Grant the [`REPLICATION` system privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) to your user: {% comment %}Link to detail on replication system privilege{% endcomment %}
+1. Grant the [`REPLICATION` system privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) to your user:
{% include_cached copy-clipboard.html %}
~~~ sql
@@ -141,19 +135,19 @@ The standby cluster connects to the primary cluster's system virtual cluster usi
### Connect to the primary virtual cluster (optional)
-1. If you would like to run a sample workload on the primary's application virtual cluster, open a new terminal window and use [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}) to run the workload.
+1. If you would like to run a sample workload on the primary's virtual cluster, open a new terminal window and use [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}) to run the workload.
For example, to initiate the [`movr`]({% link {{ page.version.version }}/movr.md %}) workload:
{% include_cached copy-clipboard.html %}
~~~ shell
- cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"
+ cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"
~~~
Replace `{node_advertise_address}` and `{node_advertise_port}` with a node's [`--advertise-addr`]({% link {{ page.version.version }}/cockroach-start.md %}#flags-advert-addr) IP address or hostname and port.
{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:
- - `options=-ccluster=application`
+ - `options=-ccluster=main`
- `sslmode=verify-full`
- `sslrootcert={path}/certs/ca.crt`: the path to the CA certificate.
- `sslcert={path}/certs/client.root.crt`: the path to the client certificate.
@@ -165,21 +159,21 @@ The standby cluster connects to the primary cluster's system virtual cluster usi
{% include_cached copy-clipboard.html %}
~~~ shell
- cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"
+ cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"
~~~
-1. To connect to the primary cluster's application virtual cluster, use the `ccluster=application` parameter:
+1. To connect to the primary cluster's virtual cluster, use the `options=-ccluster={virtual_cluster_name}` parameter:
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
- "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" \
+ "postgresql://root@{node IP or hostname}:26257?options=-ccluster=main&sslmode=verify-full" \
--certs-dir "certs"
~~~
- The prompt will include `application` when you are connected to the application virtual cluster.
+ The prompt will include `main` when you are connected to the virtual cluster.
-1. Create a user for your primary cluster's application virtual cluster:
+1. Create a user for your primary cluster's `main` virtual cluster:
{% include_cached copy-clipboard.html %}
~~~ sql
@@ -190,22 +184,15 @@ The standby cluster connects to the primary cluster's system virtual cluster usi
## Step 2. Create the standby cluster
-### Start the standby cluster
+### Initialize the standby cluster
-Similarly to the primary cluster, each node on the standby cluster must be started with the `--config-profile` flag set to `replication-target`. This creates a _virtualized cluster_ with a system virtual cluster and an application virtual cluster, and sets up all the required configuration for starting a replication stream.
+Similarly to the primary cluster, you must initialize the standby cluster with the `--virtualized-empty` flag. This creates a _virtualized cluster_ with a system virtual cluster.
-For example, a `cockroach start` command according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes):
+For example, the `cockroach init` command to initialize the standby cluster (according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes)):
{% include_cached copy-clipboard.html %}
~~~ shell
-cockroach start \
---certs-dir=certs \
---advertise-addr= \
---join=,, \
---cache=.25 \
---max-sql-memory=.25 \
---background \
---config-profile replication-target
+cockroach init --certs-dir=certs --host={address of any node on --join list} --virtualized-empty
~~~
Ensure that you follow the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-4-initialize-the-cluster) to initialize your cluster before continuing to set up physical cluster replication.
@@ -219,7 +206,7 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`]
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
- "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \
+ "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \
--certs-dir "certs"
~~~
@@ -236,6 +223,15 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`]
SET CLUSTER SETTING enterprise.license = 'your enterprise license';
~~~
+1. Set the `kv.rangefeed.enabled` cluster setting to `true`. The replication job connects to a long-lived request, a _rangefeed_, which pushes changes as they happen:
+
+ {% include_cached copy-clipboard.html %}
+ ~~~ sql
+ SET CLUSTER SETTING kv.rangefeed.enabled = true;
+ ~~~
+
+ {% comment %}While not strictly needed, it is necessary if a user then replicates from the promoted standby to the original primary. Add a note on this once the fast cutback work is published.{% endcomment %}
+
1. Confirm the status of your virtual cluster:
{% include_cached copy-clipboard.html %}
@@ -243,18 +239,15 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`]
SHOW VIRTUAL CLUSTERS;
~~~
- The output will show the `system` interface, but no `application` virtual cluster:
+ The output will show the `system` virtual cluster, but no `main` virtual cluster:
~~~
id | name | data_state | service_mode
---+----------+------------+---------------
1 | system | ready | shared
- 2 | template | ready | none
- (2 rows)
+ (1 rows)
~~~
- {% include {{ page.version.version }}/physical-replication/template-description.md %}
-
### Create a user for the standby cluster
If you would like to access the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) to observe your replication, you will need to create a user:
@@ -308,13 +301,11 @@ The system virtual cluster in the standby cluster initiates and controls the rep
{% include_cached copy-clipboard.html %}
~~~ sql
- CREATE VIRTUAL CLUSTER application LIKE template
- FROM REPLICATION OF application
- ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt';
+ CREATE VIRTUAL CLUSTER main
+ FROM REPLICATION OF main
+ ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt';
~~~
- {% include {{ page.version.version }}/physical-replication/like-description.md %}
-
Once the standby cluster has made a connection to the primary cluster, the standby will pull the topology of the primary cluster and will distribute the replication work across all nodes in the primary and standby.
1. To view all virtual clusters on the standby, run:
@@ -324,15 +315,14 @@ The system virtual cluster in the standby cluster initiates and controls the rep
SHOW VIRTUAL CLUSTERS;
~~~
- The standby cluster will show the `application` virtual cluster is in a `replicating` state.
+ The standby cluster will show the `main` virtual cluster is in a `replicating` state.
~~~
- id | name | data_state | service_mode
- ---+--------------------+--------------------+---------------
- 1 | system | ready | shared
- 2 | template | ready | none
- 3 | application | replicating | none
- (3 rows)
+ id | name | data_state | service_mode
+ -----+--------+-------------+---------------
+ 1 | system | ready | shared
+ 3 | main | replicating | none
+ (2 rows)
~~~
The standby cluster's virtual cluster is offline while the replication stream is running. To bring it online, you must explicitly [start its service after cutover]({% link {{ page.version.version }}/cutover-replication.md %}#step-2-complete-the-cutover).
@@ -341,25 +331,25 @@ The system virtual cluster in the standby cluster initiates and controls the rep
{% include_cached copy-clipboard.html %}
~~~ sql
- ALTER VIRTUAL CLUSTER application PAUSE REPLICATION;
+ ALTER VIRTUAL CLUSTER main PAUSE REPLICATION;
~~~
{% include_cached copy-clipboard.html %}
~~~ sql
- ALTER VIRTUAL CLUSTER application RESUME REPLICATION;
+ ALTER VIRTUAL CLUSTER main RESUME REPLICATION;
~~~
{% include_cached copy-clipboard.html %}
~~~ sql
- SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS;
+ SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS;
~~~
{% include_cached copy-clipboard.html %}
~~~
- id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
- ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+---------------
- 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL
- (1 row)s
+ id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status
+ ---+------+--------------------+--------------------------------------------------------+-------------------------------+------------------------+-----------------+--------------+--------------
+ 3 | main | main | postgresql://user@{node IP or hostname}:26257?redacted | 2024-04-17 20:14:31.952783+00 | 2024-04-17 20:18:50+00 | 00:00:08.738176 | NULL | replicating
+ (1 row)
~~~
With the replication stream running, you can monitor the job via the DB Console, SQL shell, or Prometheus. You can also verify data is correct on the standby cluster at a specific point in time. For more detail, refer to [Physical Cluster Replication Monitoring]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %}).
@@ -370,11 +360,11 @@ This table outlines the connection strings you will need for this setup tutorial
For additional detail on the standard CockroachDB connection parameters, refer to [Client Connection Parameters]({% link {{ page.version.version }}/connection-parameters.md %}#connect-using-a-url).
-Cluster | Interface | Usage | URL and Parameters
+Cluster | Virtual Cluster | Usage | URL and Parameters
--------+-----------+-------+------------+----
-Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`
- `options=-ccluster=system`
- `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate.
-Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`
{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:
- `options=-ccluster=application`
- `sslmode=verify-full`
- `sslrootcert={path}/certs/ca.crt`
- `sslcert={path}/certs/client.root.crt`
- `sslkey={path}/certs/client.root.key`
-Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`
- `options=-ccluster=system`
- `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate.
+Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`
- `options=-ccluster=system`
- `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate.
+Primary | Main | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`
{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:
- `options=-ccluster={virtual_cluster_name}`
- `sslmode=verify-full`
- `sslrootcert={path}/certs/ca.crt`
- `sslcert={path}/certs/client.root.crt`
- `sslkey={path}/certs/client.root.key`
+Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`
- `options=-ccluster=system`
- `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate.
## What's next
diff --git a/src/current/v24.1/show-virtual-cluster.md b/src/current/v24.1/show-virtual-cluster.md
index 185bc876e20..a257fd92887 100644
--- a/src/current/v24.1/show-virtual-cluster.md
+++ b/src/current/v24.1/show-virtual-cluster.md
@@ -49,8 +49,19 @@ This table lists all possible responses from the different `SHOW VIRTUAL CLUSTER
{% include {{ page.version.version }}/physical-replication/show-virtual-cluster-responses.md %}
+{{site.data.alerts.callout_success}}
+To find the job ID for the replication stream, use the [`SHOW JOBS`]({% link {{ page.version.version }}/show-jobs.md %}) statement. For example:
+
+{% include_cached copy-clipboard.html %}
+~~~ sql
+SELECT * FROM [SHOW JOBS] WHERE job_type = 'REPLICATION STREAM INGESTION';
+~~~
+{{site.data.alerts.end}}
+
### Data state
+The `data_state` and `status` fields show the current state of a virtual cluster's data and progress of the replication stream job.
+
{% include {{ page.version.version }}/physical-replication/show-virtual-cluster-data-state.md %}
## Examples
@@ -66,22 +77,22 @@ SHOW VIRTUAL CLUSTERS;
### Show a virtual cluster
-To show more details about the `application` virtual cluster:
+To show more details about the `main` virtual cluster:
{% include_cached copy-clipboard.html %}
~~~ sql
-SHOW VIRTUAL CLUSTER application;
+SHOW VIRTUAL CLUSTER main;
~~~
{% include_cached copy-clipboard.html %}
~~~
- id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time
------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+---------------
- 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL
+ id | name | data_state | service_mode
+-----+------+-------------+---------------
+ 3 | main | replicating | none
+(1 row)
~~~
### Show replication status
-{% comment %}this code block and output could be in an include. This is in several place e.g., cutover page, monitoring{% endcomment %}
To show the replication status of all virtual clusters:
@@ -90,11 +101,17 @@ To show the replication status of all virtual clusters:
SHOW VIRTUAL CLUSTERS WITH REPLICATION STATUS;
~~~
-To show the replication status of the `application` virtual cluster:
+To show the replication status of the `main` virtual cluster:
{% include_cached copy-clipboard.html %}
~~~ sql
-SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS;
+SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS;
+~~~
+~~~
+ id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status
+-----+------+--------------------+-----------------------------------------------+-------------------------------+------------------------+-----------------+--------------+--------------
+ 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating
+(1 row)
~~~
## See also
diff --git a/src/current/v24.1/work-with-virtual-clusters.md b/src/current/v24.1/work-with-virtual-clusters.md
index 8ec5cc4409f..d047f0bb0e7 100644
--- a/src/current/v24.1/work-with-virtual-clusters.md
+++ b/src/current/v24.1/work-with-virtual-clusters.md
@@ -16,7 +16,7 @@ docs_area: deploy
This section shows how to use [SQL clients](#sql-clients) or the [DB Console](#db-console) to connect to a virtual cluster.
{% capture pcr_application_cluster_note %}
-When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the virtual cluster is named `application`.
+When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the virtual cluster is named `main`.
{% endcapture %}
{{ pcr_application_cluster_note }}
@@ -25,7 +25,7 @@ When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-
This section shows how to connect using [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}) when cluster virtualization is enabled.
-Unless you specify which virtual cluster to connect to, when you connect using a SQL client, you are logged into the default virtual cluster. When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the default virtual cluster is named `application`.
+Unless you specify which virtual cluster to connect to, when you connect using a SQL client, you are logged into the default virtual cluster. When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the default virtual cluster is named `main`.
To connect to a specific virtual cluster, add the `GET` URL parameter `options=-ccluster={virtual_cluster_name}` to the connection URL. Replace `{virtual_cluster_name}` with the name of the virtual cluster. You must use `--url` rather than `--host`.
@@ -34,7 +34,7 @@ For example:
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
-"postgresql://root@{node IP or hostname}:26257/?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \
+"postgresql://root@{node IP or hostname}:26257?options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \
--certs-dir "certs"
~~~
@@ -58,7 +58,7 @@ For example, to connect to the system virtual cluster using the `cockroach sql`
{% include_cached copy-clipboard.html %}
~~~ shell
cockroach sql --url \
-"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \
+"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \
--certs-dir "certs"
~~~
@@ -70,7 +70,6 @@ Unless you specify which virtual cluster to connect to, when you connect using t
To connect to a specific virtual cluster, add the `GET` URL parameter `options=-ccluster={virtual_cluster_name}` to the DB Console URL. Replace `{virtual_cluster_name}` with the name of the virtual cluster.
-
If the same SQL user has the `admin` role on the system virtual cluster and also has roles on other virtual clusters, that user can switch among them from the top of the DB Console.
#### Connect to the system virtual cluster
From b378dba5c6d6e8381a0dbc99fc8c399b34054d02 Mon Sep 17 00:00:00 2001
From: Florence Morris
Date: Fri, 26 Apr 2024 13:50:00 -0400
Subject: [PATCH 02/25] DOC-9892 PR #120490 - ui: show license expiration alert
in Db Console (#18501)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
(1) In ui-overview.md, added a section for License expiration message.
(2) In licensing-faqs.md, updated Monitor for license expiry section with a link to the new License expiration message section.
* Incorporated David’s feedback.
* Incorporated Ryan’s feedback.
---
src/current/v24.1/licensing-faqs.md | 5 ++++-
src/current/v24.1/ui-overview.md | 4 ++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/current/v24.1/licensing-faqs.md b/src/current/v24.1/licensing-faqs.md
index 97fce8eafa6..1b9bd2a5abd 100644
--- a/src/current/v24.1/licensing-faqs.md
+++ b/src/current/v24.1/licensing-faqs.md
@@ -139,7 +139,10 @@ I171116 18:11:48.279604 1514 sql/event_log.go:102 [client=[::1]:56357,user=root
## Monitor for license expiry
-You can monitor the time until your license expires with [Prometheus]({% link {{ page.version.version }}/monitor-cockroachdb-with-prometheus.md %}). The `seconds_until_enterprise_license_expiry` metric reports the number of seconds until the Enterprise license on a cluster expires. It will report 0 if there is no license or a negative number if the license has already expired. For more information, see [Monitoring and Alerting]({% link {{ page.version.version }}/monitoring-and-alerting.md %}).
+You can monitor the time until your license expires in two ways:
+
+1. [DB console]({% link {{ page.version.version }}/ui-overview.md %}): The [license expiration message]({% link {{ page.version.version }}/ui-overview.md %}#license-expiration-message) displays the number of days until the expiration date or the days since the expiration date.
+1. [Prometheus]({% link {{ page.version.version }}/monitor-cockroachdb-with-prometheus.md %}): The `seconds_until_enterprise_license_expiry` metric reports the number of seconds until the enterprise license on a cluster expires. It will report `0` if there is no license, and a negative number if the license has already expired. For more information, see [Monitoring and Alerting]({% link {{ page.version.version }}/monitoring-and-alerting.md %}).
## Renew an expired license
diff --git a/src/current/v24.1/ui-overview.md b/src/current/v24.1/ui-overview.md
index 6ccc7f48b8a..1d1f144d077 100644
--- a/src/current/v24.1/ui-overview.md
+++ b/src/current/v24.1/ui-overview.md
@@ -146,6 +146,10 @@ The DB Console stores temporary data in a time-series database in order to gener
By default, the DB Console shares anonymous usage details with Cockroach Labs. For information about the details shared and how to opt-out of reporting, see [Diagnostics Reporting]({% link {{ page.version.version }}/diagnostics-reporting.md %}).
+## License expiration message
+
+If you have [set a license]({% link {{ page.version.version }}/licensing-faqs.md %}#set-a-license) to use [enterprise features]({% link {{ page.version.version }}/enterprise-licensing.md %}), a license expiration message is displayed at the top-right of the DB Console. While the license is valid, the message will read `License expires in X days`, where `X` is the number of days. If the license is no longer valid, the message will read `License expired X days ago`. Hovering over either message displays a tooltip with the expiration date of the license.
+
## See also
- [Troubleshooting Overview]({% link {{ page.version.version }}/troubleshooting-overview.md %})
From 2be4c42018dcd923cd0fa7617c71fafc5df5b436 Mon Sep 17 00:00:00 2001
From: Florence Morris
Date: Mon, 29 Apr 2024 09:47:29 -0400
Subject: [PATCH 03/25] DOC-9004 Create a physical cluster replication metrics
dashboard page when PCR goes GA (#18489)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
(1) Added ui-physical-cluster-replication-dashboard.md, moved content from DB Console section of physical-cluster-replication-monitoring.md.
(2) In physical-cluster-replication-monitoring.md, ui-overview.md and self-hosted-deployments.json, added links to ui-physical-cluster-replication-dashboard.md.
(3) In ui-replication-dashboard.md, added callout regarding ui-physical-cluster-replication-dashboard.md.
* Incorporated Kathryn’s feedback.
* Incorporated Ryan’s feedback.
---
.../sidebar-data/self-hosted-deployments.json | 6 ++
...physical-cluster-replication-monitoring.md | 38 +-----------
src/current/v24.1/ui-overview.md | 1 +
...-physical-cluster-replication-dashboard.md | 59 +++++++++++++++++++
src/current/v24.1/ui-replication-dashboard.md | 6 +-
5 files changed, 73 insertions(+), 37 deletions(-)
create mode 100644 src/current/v24.1/ui-physical-cluster-replication-dashboard.md
diff --git a/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json b/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json
index a357aab89dd..883cf637457 100644
--- a/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json
+++ b/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json
@@ -459,6 +459,12 @@
"/${VERSION}/ui-ttl-dashboard.html"
]
},
+ {
+ "title": "Physical Cluster Replication Dashboard",
+ "urls": [
+ "/${VERSION}/ui-physical-cluster-replication-dashboard.html"
+ ]
+ },
{
"title": "Custom Chart",
"urls": [
diff --git a/src/current/v24.1/physical-cluster-replication-monitoring.md b/src/current/v24.1/physical-cluster-replication-monitoring.md
index c4dd13f4082..e7aacd012ea 100644
--- a/src/current/v24.1/physical-cluster-replication-monitoring.md
+++ b/src/current/v24.1/physical-cluster-replication-monitoring.md
@@ -12,7 +12,7 @@ docs_area: manage
You can monitor a physical cluster replication stream using:
- [`SHOW VIRTUAL CLUSTER ... WITH REPLICATION STATUS`](#sql-shell) in the SQL shell.
-- The [Physical Replication dashboard](#db-console) on the DB Console.
+- The [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) on the [DB Console](#db-console).
- [Prometheus and Alertmanager](#prometheus) to track and alert on replication metrics.
- [`SHOW EXPERIMENTAL_FINGERPRINTS`](#data-verification) to verify data at a point in time is correct on the standby cluster.
@@ -48,41 +48,7 @@ id | name | source_tenant_name | source_cluster_uri
## DB Console
-You can access the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) for your standby cluster at `https://{your IP or hostname}:8080/`. Select the **Metrics** page from the left-hand navigation bar, and then select **Physical Cluster Replication** from the **Dashboard** dropdown. The user that accesses the DB Console must have `admin` privileges to view this dashboard.
-
-{% include {{ page.version.version }}/ui/ui-metrics-navigation.md %}
-
-{{site.data.alerts.callout_info}}
-The **Physical Cluster Replication** dashboard tracks metrics related to physical cluster replication jobs. This is distinct from the [**Replication** dashboard]({% link {{ page.version.version }}/ui-replication-dashboard.md %}), which tracks metrics related to how data is replicated across the cluster, e.g., range status, replicas per store, and replica quiescence.
-{{site.data.alerts.end}}
-
-The **Physical Cluster Replication** dashboard contains graphs for monitoring:
-
-### Logical bytes
-
-
-
-The **Logical Bytes** graph shows you the throughput of the replicated bytes.
-
-Hovering over the graph displays:
-
-- The date and time.
-- The number of logical bytes replicated in MiB.
-
-{{site.data.alerts.callout_info}}
-When you [start a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication), the **Logical Bytes** graph will record a spike of throughput as the initial scan completes. {% comment %}link to technical details here{% endcomment %}
-{{site.data.alerts.end}}
-
-### SST bytes
-
-
-
-The **SST Bytes** graph shows you the rate at which all [SST]({% link {{ page.version.version }}/architecture/storage-layer.md %}#ssts) bytes are sent to the [KV layer]({% link {{ page.version.version }}/architecture/storage-layer.md %}) by physical cluster replication jobs.
-
-Hovering over the graph displays:
-
-- The date and time.
-- The number of SST bytes replicated in MiB.
+You can use the [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) of the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) to monitor [logical bytes]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}#logical-bytes) and [SST bytes]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}#sst-bytes) on the standby cluster.
## Prometheus
diff --git a/src/current/v24.1/ui-overview.md b/src/current/v24.1/ui-overview.md
index 1d1f144d077..5d83e9a805c 100644
--- a/src/current/v24.1/ui-overview.md
+++ b/src/current/v24.1/ui-overview.md
@@ -51,6 +51,7 @@ The Metrics page provides dashboards for all types of CockroachDB metrics.
- [Changefeeds dashboard]({% link {{ page.version.version }}/ui-cdc-dashboard.md %}) has metrics about the [changefeeds]({% link {{ page.version.version }}/change-data-capture-overview.md %}) created across your cluster.
- [Overload dashboard]({% link {{ page.version.version }}/ui-overload-dashboard.md %}) has metrics about the performance of the parts of your cluster relevant to the cluster's [admission control system]({% link {{ page.version.version }}/admission-control.md %}).
- [TTL dashboard]({% link {{ page.version.version }}/ui-ttl-dashboard.md %}) has metrics about the progress and performance of [batch deleting expired data using Row-Level TTL]({% link {{ page.version.version }}/row-level-ttl.md %}) from your cluster.
+- [Physical Cluster Replication dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) has metrics about the [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) streams between a primary and standby cluster.
### Databases
diff --git a/src/current/v24.1/ui-physical-cluster-replication-dashboard.md b/src/current/v24.1/ui-physical-cluster-replication-dashboard.md
new file mode 100644
index 00000000000..936a499e1eb
--- /dev/null
+++ b/src/current/v24.1/ui-physical-cluster-replication-dashboard.md
@@ -0,0 +1,59 @@
+---
+title: Physical Cluster Replication Dashboard
+summary: The Physical Cluster Replication Dashboard lets you monitor and observe replication streams between a primary and standby cluster.
+toc: true
+docs_area: reference.db_console
+---
+
+{{site.data.alerts.callout_info}}
+{% include feature-phases/preview.md %}
+{{site.data.alerts.end}}
+
+The **Physical Cluster Replication** dashboard in the DB Console lets you monitor the [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) streams between a primary and standby cluster.
+
+To view this dashboard, [access the DB Console]({% link {{ page.version.version }}/ui-overview.md %}#db-console-access) for your standby cluster, click **Metrics** on the left-hand navigation bar, and select **Physical Cluster Replication** from the **Dashboard** dropdown.
+
+{{site.data.alerts.callout_info}}
+The **Physical Cluster Replication** dashboard is distinct from the [**Replication** dashboard]({% link {{ page.version.version }}/ui-replication-dashboard.md %}), which tracks metrics related to how data is replicated across the cluster, e.g., range status, replicas per store, and replica quiescence.
+{{site.data.alerts.end}}
+
+## Dashboard navigation
+
+{% include {{ page.version.version }}/ui/ui-metrics-navigation.md %}
+
+The **Physical Cluster Replication** dashboard displays the following time-series graphs:
+
+## Logical bytes
+
+
+
+The **Logical Bytes** graph displays the throughput of the replicated bytes. The graph displays the rate at which the logical bytes (sum of keys + values) are ingested by all replication jobs.
+
+Hovering over the graph displays:
+
+- The date and time.
+- The number of logical bytes replicated.
+
+{{site.data.alerts.callout_info}}
+When you [start a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication), the **Logical Bytes** graph will record a spike of throughput as the initial scan completes. {% comment %}link to technical details here{% endcomment %}
+{{site.data.alerts.end}}
+
+## SST bytes
+
+
+
+The **SST Bytes** graph displays the rate at which all [SST]({% link {{ page.version.version }}/architecture/storage-layer.md %}#ssts) bytes are sent to the [KV layer]({% link {{ page.version.version }}/architecture/storage-layer.md %}) by physical cluster replication jobs.
+
+Hovering over the graph displays:
+
+- The date and time.
+- The number of SST bytes replicated.
+
+{% include {{ page.version.version }}/ui/ui-summary-events.md %}
+
+## See also
+
+- [Physical Cluster Replication Overview]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %})
+- [Physical Cluster Replication Monitoring]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %})
+- [Troubleshooting Overview]({% link {{ page.version.version }}/troubleshooting-overview.md %})
+- [Support Resources]({% link {{ page.version.version }}/support-resources.md %})
diff --git a/src/current/v24.1/ui-replication-dashboard.md b/src/current/v24.1/ui-replication-dashboard.md
index 1f1c1006af2..a7682c2b769 100644
--- a/src/current/v24.1/ui-replication-dashboard.md
+++ b/src/current/v24.1/ui-replication-dashboard.md
@@ -5,10 +5,14 @@ toc: true
docs_area: reference.db_console
---
-The **Replication** dashboard in the DB Console lets you monitor the replication metrics for your cluster.
+The **Replication** dashboard in the DB Console lets you monitor the replication metrics for your cluster, such as range status, replicas per store, and replica quiescence.
To view this dashboard, [access the DB Console]({% link {{ page.version.version }}/ui-overview.md %}#db-console-access), click **Metrics** in the left-hand navigation, and select **Dashboard** > **Replication**.
+{{site.data.alerts.callout_info}}
+The **Replication** dashboard is distinct from the [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}), which tracks metrics related to physical cluster replication jobs.
+{{site.data.alerts.end}}
+
## Review of CockroachDB terminology
- **Range**: CockroachDB stores all user data and almost all system data in a giant sorted map of key-value pairs. This keyspace is divided into "ranges", contiguous chunks of the keyspace, so that every key can always be found in a single range.
From 0fef87eb57a8d4150db815cfee435425356f769f Mon Sep 17 00:00:00 2001
From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com>
Date: Tue, 30 Apr 2024 12:22:55 -0400
Subject: [PATCH 04/25] v24.1.0-beta.3 release notes (#18504)
---
src/current/_data/releases.yml | 27 +++++++++
.../releases/v24.1/v24.1.0-beta.3.md | 60 +++++++++++++++++++
2 files changed, 87 insertions(+)
create mode 100644 src/current/_includes/releases/v24.1/v24.1.0-beta.3.md
diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml
index eb92170f17f..216aeb7598a 100644
--- a/src/current/_data/releases.yml
+++ b/src/current/_data/releases.yml
@@ -5897,3 +5897,30 @@
docker_arm_limited_access: false
source: true
previous_release: v24.1.0-beta.1
+
+- release_name: v24.1.0-beta.3
+ major_version: v24.1
+ release_date: '2024-04-30'
+ release_type: Testing
+ go_version: go1.22.0
+ sha: aea98c134a954d4dbba4916bb22aa6ad23f81004
+ has_sql_only: true
+ has_sha256sum: true
+ mac:
+ mac_arm: true
+ mac_arm_experimental: true
+ mac_arm_limited_access: true
+ windows: true
+ linux:
+ linux_arm: true
+ linux_arm_experimental: false
+ linux_arm_limited_access: false
+ linux_intel_fips: true
+ linux_arm_fips: false
+ docker:
+ docker_image: cockroachdb/cockroach-unstable
+ docker_arm: true
+ docker_arm_experimental: false
+ docker_arm_limited_access: false
+ source: true
+ previous_release: v24.1.0-beta.2
diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md
new file mode 100644
index 00000000000..0852831e401
--- /dev/null
+++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md
@@ -0,0 +1,60 @@
+## v24.1.0-beta.3
+
+Release Date: April 30, 2024
+
+{% include releases/release-downloads-docker-image.md release=include.release %}
+
+SQL language changes
+
+- Updated the [`SHOW GRANTS`]({% link v24.1/show-grants.md %}) responses to display the `object_type` and `object_name`, which has replaced the `relation_name` column. [#122823][#122823]
+- Added [external connection]({% link v24.1/create-external-connection.md %}) granted privileges to the [`SHOW GRANTS`]({% link v24.1/show-grants.md %}) command. [#122823][#122823]
+- Introduced three new [cluster settings]({% link v24.1/cluster-settings.md %}) for controlling table statistics forecasting:
+ - [`sql.stats.forecasts.min_observations`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-min-observations) is the minimum number of observed statistics required to produce a forecast.
+ - [`sql.stats.forecasts.min_goodness_of_fit`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-min-goodness-of-fit) is the minimum R² (goodness of fit) measurement required from all predictive models to use a forecast.
+ - [`sql.stats.forecasts.max_decrease`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-max-decrease) is the most a prediction can decrease, expressed as the minimum ratio of the prediction to the lowest prior observation. [#122459][#122459]
+
+Bug fixes
+
+- Fixed a bug that could lead to descriptors having privileges to roles that no longer exist. Added an automated clean up for [dropped roles]({% link v24.1/drop-role.md %}) inside descriptors. [#122701][#122701]
+- Fixed a bug where [client certificate authentication]({% link v24.1/authentication.md %}#client-authentication) combined with [identity maps]({% link v24.1/sso-sql.md %}#identity-map-configuration) (`server.identity_map.configuration`) did not work since v23.1. For the feature to work correctly, the client must specify a valid db user in the [connection string]({% link v24.1/connection-parameters.md %}). [#122738][#122738]
+- Fixed a bug where the [row-based execution engine]({% link v24.1/architecture/sql-layer.md %}#query-execution) could drop a [`LIMIT`]({% link v24.1/limit-offset.md %}) clause when there was an [`ORDER BY`]({% link v24.1/order-by.md %}) clause, and the ordering was partially provided by an input operator. For example, this bug could occur with an ordering such as `ORDER BY a, b` when the scanned index was only ordered on column `a`. The impact of this bug was that more rows may have been returned than specified by the `LIMIT` clause. This bug is only present when not using the [vectorized execution engine]({% link v24.1/architecture/sql-layer.md %}#vectorized-query-execution). That is, when running with `SET vectorize = off;`. This bug has existed since CockroachDB v22.1. [#122837][#122837]
+- Previously, CockroachDB could run into an internal error when evaluating [PL/pgSQL]({% link v24.1/plpgsql.md %}) routines with nested blocks. The bug is only present in 24.1.0-beta versions. This bug is now fixed. [#122939][#122939]
+- Fixed a bug where [`UPDATE`]({% link v24.1/update.md %}) and [`UPSERT`]({% link v24.1/upsert.md %}) queries with a subquery were sometimes inappropriately using implicit [`FOR UPDATE`]({% link v24.1/select-for-update.md %}) locking within the subquery. This bug has existed since implicit `FOR UPDATE` locking was introduced in v20.1. [#121391][#121391]
+- [Dropping]({% link v24.1/alter-table.md %}#drop-column) and [adding]({% link v24.1/alter-table.md %}#add-column) a column with the same name no longer results in a `"column already exists error"`. [#122631][#122631]
+- Fixed a bug that could cause an internal error of the form `invalid datum type given: ..., expected ...` when a `RECORD`-returning [user-defined function]({% link v24.1/user-defined-functions.md %}), used as a data source, was supplied a column definition list with mismatched types. This bug has existed since v23.1. [#122305][#122305]
+- Fixed a bug that could result in an internal error when attempting to create a [PL/pgSQL]({% link v24.1/plpgsql.md %}) routine using the (unsupported) `%ROWTYPE` syntax for a variable declaration. Now, an expected syntax error is returned instead. [#122966][#122966]
+- Fixed a bug that could result in an assertion error during evaluation of [PL/pgSQL]({% link v24.1/plpgsql.md %}) routines that invoke procedures while using `DEFAULT` arguments. The bug was present in v24.1.0-beta releases and is now fixed. [#122943][#122943]
+- Previously, privileges granted for [external connections]({% link v24.1/create-external-connection.md %}) were displaying in `SHOW SYSTEM GRANTS` with no associated object name. Now these privileges are no longer displayed. Instead, the statement `SHOW GRANTS ON EXTERNAL CONNECTION` should be used to view external connection privileges with their associated object name. [#122857][#122857]
+- Statistics forecasts of zero rows can cause suboptimal [query plans]({% link v24.1/cost-based-optimizer.md %}). Forecasting will now avoid predicting zero rows for most downward-trending statistics. [#122459][#122459]
+- Fixed a bug introduced in v23.2 that could cause a [PL/pgSQL]({% link v24.1/plpgsql.md %}) variable assignment to not be executed if the variable was never referenced after the assignment. [#123045][#123045]
+
+
+
+- More efficient [query plans]({% link v24.1/cost-based-optimizer.md %}) are now generated for queries with text similarity filters, for example, `text_col % 'foobar'`. These plans are generated if the `optimizer_use_trigram_similarity_optimization` [session setting]({% link v24.1/set-vars.md %}) is enabled. It is disabled by default. [#122838][#122838]
+- The [optimizer]({% link v24.1/cost-based-optimizer.md %}) now costs `distinct-on` operators more accurately. It may produce more efficient query plans in some cases. [#122850][#122850]
+- Improved the speed for optimization of some statements using `GROUP BY` or `DISTINCT` or `ON CONFLICT` by skipping the [optimizer]({% link v24.1/cost-based-optimizer.md %}) rule `SplitGroupByScanIntoUnionScans` when it is not needed. [#123034][#123034]
+
+
+
+
Contributors
+
+This release includes 56 merged PRs by 25 authors.
+
+
+
+[#121391]: https://github.com/cockroachdb/cockroach/pull/121391
+[#122305]: https://github.com/cockroachdb/cockroach/pull/122305
+[#122459]: https://github.com/cockroachdb/cockroach/pull/122459
+[#122631]: https://github.com/cockroachdb/cockroach/pull/122631
+[#122701]: https://github.com/cockroachdb/cockroach/pull/122701
+[#122738]: https://github.com/cockroachdb/cockroach/pull/122738
+[#122823]: https://github.com/cockroachdb/cockroach/pull/122823
+[#122837]: https://github.com/cockroachdb/cockroach/pull/122837
+[#122838]: https://github.com/cockroachdb/cockroach/pull/122838
+[#122850]: https://github.com/cockroachdb/cockroach/pull/122850
+[#122857]: https://github.com/cockroachdb/cockroach/pull/122857
+[#122939]: https://github.com/cockroachdb/cockroach/pull/122939
+[#122943]: https://github.com/cockroachdb/cockroach/pull/122943
+[#122966]: https://github.com/cockroachdb/cockroach/pull/122966
+[#123034]: https://github.com/cockroachdb/cockroach/pull/123034
+[#123045]: https://github.com/cockroachdb/cockroach/pull/123045
From a550b11937c1173c5978121430019266ada821ef Mon Sep 17 00:00:00 2001
From: Florence Morris
Date: Tue, 30 Apr 2024 13:10:59 -0400
Subject: [PATCH 05/25] DOC-9399 PR #116411 - ui: update label "CPU" to "SQL
CPU" (#18505)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* In ui-statements-page.md, replaced CPU Time with SQL CPU Time in text and images.
* Incorporated Ryan’s feedback.
---
.../_includes/v24.1/ui/statement-details.md | 4 ++--
.../_includes/v24.1/ui/statements-filter.md | 2 +-
.../_includes/v24.1/ui/statements-table.md | 2 +-
.../v24.1/ui_statement_fingerprint_charts.png | Bin 153982 -> 288755 bytes
.../ui_statement_fingerprint_overview.png | Bin 255261 -> 423110 bytes
5 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/current/_includes/v24.1/ui/statement-details.md b/src/current/_includes/v24.1/ui/statement-details.md
index 690cc701eaa..2155d1c685b 100644
--- a/src/current/_includes/v24.1/ui/statement-details.md
+++ b/src/current/_includes/v24.1/ui/statement-details.md
@@ -30,7 +30,7 @@ The **Overview** section also displays the SQL statement fingerprint statistics
|**Execution Retries** | The number of [retries]({{ link_prefix }}transactions.html#transaction-retries). |
|**Execution Count** | The total number of executions. It is calculated as the sum of first attempts and retries. |
|**Contention Time** | The amount of time spent waiting for resources. For more information about contention, see [Understanding and avoiding transaction contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention). |
-|**CPU Time** | The amount of CPU time spent executing the statement. The CPU time represents the time spent and work done within SQL execution operators. |
+|**SQL CPU Time** | The amount of SQL CPU time spent executing the statement. The SQL CPU time represents the time spent and work done within SQL execution operators. It does not include SQL planning time or KV execution time. |
|**Client Wait Time** | The time spent waiting for the client to send the statement while holding the transaction open. A high wait time indicates that you should revisit the entire transaction and [batch your statements]({{ link_prefix }}transactions.html#batched-statements). |
The following screenshot shows the statement fingerprint of the query described in [Use the right index]({{ link_prefix }}apply-statement-performance-rules.html#rule-2-use-the-right-index):
@@ -60,7 +60,7 @@ Charts following the execution attributes display statement fingerprint statisti
|**Execution Retries** | The number of [retries]({{ link_prefix }}transactions.html#transaction-retries). |
|**Execution Count** | The total number of executions. It is calculated as the sum of first attempts and retries. |
|**Contention Time** | The amount of time spent waiting for resources. For more information about contention, see [Understanding and avoiding transaction contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention). |
-|**CPU Time** | The amount of CPU time spent executing the statement. The CPU time represents the time spent and work done within SQL execution operators. |
+|**SQL CPU Time** | The amount of SQL CPU time spent executing the statement. The SQL CPU time represents the time spent and work done within SQL execution operators. It does not include SQL planning time or KV execution time. |
|**Client Wait Time** | The time spent waiting for the client to send the statement while holding the transaction open. A high wait time indicates that you should revisit the entire transaction and [batch your statements]({{ link_prefix }}transactions.html#batched-statements). |
The following charts summarize the executions of the statement fingerprint illustrated in [Overview](#overview):
diff --git a/src/current/_includes/v24.1/ui/statements-filter.md b/src/current/_includes/v24.1/ui/statements-filter.md
index d5a34084385..c750a860614 100644
--- a/src/current/_includes/v24.1/ui/statements-filter.md
+++ b/src/current/_includes/v24.1/ui/statements-filter.md
@@ -7,7 +7,7 @@ The statement fingerprints returned are determined by the selected **Search Crit
By default, the **Top** `100` statement fingerprints **By** [`% of All Runtime`](#percent-of-all-runtime) for the `Past Hour` are returned.
1. To change the number of results returned, select `25`, `50`, `100`, or `500` from the **Top** dropdown. To return a larger number, select `More` and choose an option: `1000`, `5000`, `10000`.
-1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`.
+1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `SQL CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`.
{{site.data.alerts.callout_info}}
The `More` options may increase the page loading time and are not generally recommended.
{{site.data.alerts.end}}
diff --git a/src/current/_includes/v24.1/ui/statements-table.md b/src/current/_includes/v24.1/ui/statements-table.md
index ea89ec91e6d..321d3f06f80 100644
--- a/src/current/_includes/v24.1/ui/statements-table.md
+++ b/src/current/_includes/v24.1/ui/statements-table.md
@@ -13,7 +13,7 @@ Application Name | The name specified by the [`application_name`]({{ link_prefix
Statement Time | Average [planning and execution time]({{ link_prefix }}architecture/sql-layer.html#sql-parser-planner-executor) of statements with this statement fingerprint within the time interval.
The gray bar indicates the mean latency. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values.
% of All Runtime | The percentage of execution time taken by this statement fingerprint compared to all other statements executed within the time period, including those not displayed. Runtime is calculated as the mean execution latency multiplied by the execution count.
Note: The sum of the values in this column may not equal 100%. Each fingerprint's percentage is calculated by dividing the fingerprint's runtime by the sum of the runtimes for all statement fingerprints in the time interval. "All statement fingerprints" means all user statement fingerprints (not only those displayed by the [search criteria](#search-criteria)), as well as internal statement fingerprints that are never included in the displayed result set. The search criteria are applied after the `% of All Runtime` calculation.
Contention Time | Average time statements with this fingerprint were [in contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention) with other transactions within the time interval.
The gray bar indicates mean contention time. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values.
-CPU Time | Average CPU time spent executing within the specified time interval. The gray bar indicates mean CPU time. The blue bar indicates one standard deviation from the mean.
The CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html).
+SQL CPU Time | Average SQL CPU time spent executing within the specified time interval. It does not include SQL planning time or KV execution time. The gray bar indicates mean SQL CPU time. The blue bar indicates one standard deviation from the mean.
The SQL CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html).
P50 Latency | The 50th latency percentile for sampled statement executions with this fingerprint.
P90 Latency | The 90th latency percentile for sampled statement executions with this fingerprint.
P99 Latency | The 99th latency percentile for sampled statement executions with this fingerprint.
diff --git a/src/current/images/v24.1/ui_statement_fingerprint_charts.png b/src/current/images/v24.1/ui_statement_fingerprint_charts.png
index fd65961ceb81fe0a5f33451dc2b96b49178c762f..5ab63bfe0fb3fb14ef7b04a13b8cd9f706bfe9cf 100644
GIT binary patch
literal 288755
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