From a6a2148d5e44ec7f3a8f0913101d6ebda814bd76 Mon Sep 17 00:00:00 2001
From: Kyle Wong <37189875+kyle-a-wong@users.noreply.github.com>
Date: Thu, 13 Feb 2025 13:44:58 -0500
Subject: [PATCH] sqlstats: scaffold a new sql activity flush job
This commit creates the scaffolding for a new sql activity
flush job, whose purpose is to do a cluster wide sql
stats flush. This job will run in place of the existing
node local sql stats flush loop.
Note: Moving forward, "sql activity" will be used in place
of "sql stats" to help disambiguate the "sql stats" subsystem
from the original usage of sql stats, which was used for
table statistics and optimizer related code
Resolves: CRDB-47807
Epic: CRDB-45771
Release note: None
---
docs/generated/metrics/metrics.html | 12 ++++
.../settings/settings-for-tenants.txt | 2 +-
docs/generated/settings/settings.html | 2 +-
pkg/BUILD.bazel | 1 +
pkg/cli/testdata/doctor/test_examine_cluster | 2 +-
.../doctor/test_examine_cluster_dropped | 2 +-
.../testdata/doctor/test_examine_cluster_jobs | 2 +-
pkg/clusterversion/cockroach_versions.go | 5 +-
pkg/jobs/jobs_test.go | 1 +
pkg/jobs/jobspb/jobs.proto | 11 ++++
pkg/jobs/jobspb/wrap.go | 16 +++++-
pkg/jobs/registry.go | 2 +
pkg/jobs/registry_test.go | 2 +
pkg/sql/catalog/bootstrap/testdata/testdata | 8 +--
pkg/sql/catalog/systemschema/system.go | 2 +-
.../testdata/bootstrap_system | 6 +-
.../testdata/bootstrap_tenant | 6 +-
.../testdata/logic_test/crdb_internal_catalog | 2 +-
pkg/sql/sqlstats/sqlactivityjob/BUILD.bazel | 15 +++++
.../sqlactivityjob/sql_activity_flush_job.go | 55 +++++++++++++++++++
pkg/upgrade/upgradebase/testing_knobs.go | 2 +
pkg/upgrade/upgrades/BUILD.bazel | 4 ++
...permanent_create_sql_activity_flush_job.go | 39 +++++++++++++
...nent_create_sql_activity_flush_job_test.go | 37 +++++++++++++
pkg/upgrade/upgrades/permanent_upgrades.go | 1 +
pkg/upgrade/upgrades/upgrades.go | 8 +++
.../v25_2_add_sql_activity_flush_job.go | 23 ++++++++
27 files changed, 249 insertions(+), 19 deletions(-)
create mode 100644 pkg/sql/sqlstats/sqlactivityjob/BUILD.bazel
create mode 100644 pkg/sql/sqlstats/sqlactivityjob/sql_activity_flush_job.go
create mode 100644 pkg/upgrade/upgrades/permanent_create_sql_activity_flush_job.go
create mode 100644 pkg/upgrade/upgrades/permanent_create_sql_activity_flush_job_test.go
create mode 100644 pkg/upgrade/upgrades/v25_2_add_sql_activity_flush_job.go
diff --git a/docs/generated/metrics/metrics.html b/docs/generated/metrics/metrics.html
index 37d474edfec6..97446d80ecb2 100644
--- a/docs/generated/metrics/metrics.html
+++ b/docs/generated/metrics/metrics.html
@@ -1508,6 +1508,18 @@
APPLICATION | jobs.schema_change_gc.resume_completed | Number of schema_change_gc jobs which successfully resumed to completion | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
APPLICATION | jobs.schema_change_gc.resume_failed | Number of schema_change_gc jobs which failed with a non-retriable error | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
APPLICATION | jobs.schema_change_gc.resume_retry_error | Number of schema_change_gc jobs which failed with a retriable error | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
+APPLICATION | jobs.sql_activity_flush.currently_idle | Number of sql_activity_flush jobs currently considered Idle and can be freely shut down | jobs | GAUGE | COUNT | AVG | NONE |
+APPLICATION | jobs.sql_activity_flush.currently_paused | Number of sql_activity_flush jobs currently considered Paused | jobs | GAUGE | COUNT | AVG | NONE |
+APPLICATION | jobs.sql_activity_flush.currently_running | Number of sql_activity_flush jobs currently running in Resume or OnFailOrCancel state | jobs | GAUGE | COUNT | AVG | NONE |
+APPLICATION | jobs.sql_activity_flush.expired_pts_records | Number of expired protected timestamp records owned by sql_activity_flush jobs | records | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
+APPLICATION | jobs.sql_activity_flush.fail_or_cancel_completed | Number of sql_activity_flush jobs which successfully completed their failure or cancelation process | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
+APPLICATION | jobs.sql_activity_flush.fail_or_cancel_failed | Number of sql_activity_flush jobs which failed with a non-retriable error on their failure or cancelation process | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
+APPLICATION | jobs.sql_activity_flush.fail_or_cancel_retry_error | Number of sql_activity_flush jobs which failed with a retriable error on their failure or cancelation process | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
+APPLICATION | jobs.sql_activity_flush.protected_age_sec | The age of the oldest PTS record protected by sql_activity_flush jobs | seconds | GAUGE | SECONDS | AVG | NONE |
+APPLICATION | jobs.sql_activity_flush.protected_record_count | Number of protected timestamp records held by sql_activity_flush jobs | records | GAUGE | COUNT | AVG | NONE |
+APPLICATION | jobs.sql_activity_flush.resume_completed | Number of sql_activity_flush jobs which successfully resumed to completion | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
+APPLICATION | jobs.sql_activity_flush.resume_failed | Number of sql_activity_flush jobs which failed with a non-retriable error | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
+APPLICATION | jobs.sql_activity_flush.resume_retry_error | Number of sql_activity_flush jobs which failed with a retriable error | jobs | COUNTER | COUNT | AVG | NON_NEGATIVE_DERIVATIVE |
APPLICATION | jobs.standby_read_ts_poller.currently_idle | Number of standby_read_ts_poller jobs currently considered Idle and can be freely shut down | jobs | GAUGE | COUNT | AVG | NONE |
APPLICATION | jobs.standby_read_ts_poller.currently_paused | Number of standby_read_ts_poller jobs currently considered Paused | jobs | GAUGE | COUNT | AVG | NONE |
APPLICATION | jobs.standby_read_ts_poller.currently_running | Number of standby_read_ts_poller jobs currently running in Resume or OnFailOrCancel state | jobs | GAUGE | COUNT | AVG | NONE |
diff --git a/docs/generated/settings/settings-for-tenants.txt b/docs/generated/settings/settings-for-tenants.txt
index d97e7a34bc85..d417e612ca4a 100644
--- a/docs/generated/settings/settings-for-tenants.txt
+++ b/docs/generated/settings/settings-for-tenants.txt
@@ -405,4 +405,4 @@ trace.span_registry.enabled boolean false if set, ongoing traces can be seen at
trace.zipkin.collector string the address of a Zipkin instance to receive traces, as :. If no port is specified, 9411 will be used. application
ui.database_locality_metadata.enabled boolean true if enabled shows extended locality data about databases and tables in DB Console which can be expensive to compute application
ui.display_timezone enumeration etc/utc the timezone used to format timestamps in the ui [etc/utc = 0, america/new_york = 1] application
-version version 1000025.1-upgrading-to-1000025.2-step-002 set the active cluster version in the format '.' application
+version version 1000025.1-upgrading-to-1000025.2-step-004 set the active cluster version in the format '.' application
diff --git a/docs/generated/settings/settings.html b/docs/generated/settings/settings.html
index 1635546b8ad3..32816c969077 100644
--- a/docs/generated/settings/settings.html
+++ b/docs/generated/settings/settings.html
@@ -364,6 +364,6 @@
trace.zipkin.collector
| string |
| the address of a Zipkin instance to receive traces, as <host>:<port>. If no port is specified, 9411 will be used. | Serverless/Dedicated/Self-Hosted |
ui.database_locality_metadata.enabled
| boolean | true | if enabled shows extended locality data about databases and tables in DB Console which can be expensive to compute | Serverless/Dedicated/Self-Hosted |
ui.display_timezone
| enumeration | etc/utc | the timezone used to format timestamps in the ui [etc/utc = 0, america/new_york = 1] | Serverless/Dedicated/Self-Hosted |
-version
| version | 1000025.1-upgrading-to-1000025.2-step-002 | set the active cluster version in the format '<major>.<minor>' | Serverless/Dedicated/Self-Hosted |
+version
| version | 1000025.1-upgrading-to-1000025.2-step-004 | set the active cluster version in the format '<major>.<minor>' | Serverless/Dedicated/Self-Hosted |
diff --git a/pkg/BUILD.bazel b/pkg/BUILD.bazel
index 7e582bd0fa19..5e1b9d051f1e 100644
--- a/pkg/BUILD.bazel
+++ b/pkg/BUILD.bazel
@@ -2305,6 +2305,7 @@ GO_TARGETS = [
"//pkg/sql/sqlstats/persistedsqlstats/sqlstatsutil:sqlstatsutil_test",
"//pkg/sql/sqlstats/persistedsqlstats:persistedsqlstats",
"//pkg/sql/sqlstats/persistedsqlstats:persistedsqlstats_test",
+ "//pkg/sql/sqlstats/sqlactivityjob:sqlactivityjob",
"//pkg/sql/sqlstats/sslocal:sslocal",
"//pkg/sql/sqlstats/sslocal:sslocal_test",
"//pkg/sql/sqlstats/ssmemstorage:ssmemstorage",
diff --git a/pkg/cli/testdata/doctor/test_examine_cluster b/pkg/cli/testdata/doctor/test_examine_cluster
index 31771dd80998..e8095e95d5a2 100644
--- a/pkg/cli/testdata/doctor/test_examine_cluster
+++ b/pkg/cli/testdata/doctor/test_examine_cluster
@@ -3,5 +3,5 @@ debug doctor examine cluster
debug doctor examine cluster
Examining 69 descriptors and 68 namespace entries...
ParentID 100, ParentSchemaID 101: relation "foo" (105): expected matching namespace entry, found none
-Examining 11 jobs...
+Examining 12 jobs...
ERROR: validation failed
diff --git a/pkg/cli/testdata/doctor/test_examine_cluster_dropped b/pkg/cli/testdata/doctor/test_examine_cluster_dropped
index 75a6155ec8e2..6a358766fbfc 100644
--- a/pkg/cli/testdata/doctor/test_examine_cluster_dropped
+++ b/pkg/cli/testdata/doctor/test_examine_cluster_dropped
@@ -2,5 +2,5 @@ debug doctor examine cluster
----
debug doctor examine cluster
Examining 68 descriptors and 68 namespace entries...
-Examining 9 jobs...
+Examining 10 jobs...
No problems found!
diff --git a/pkg/cli/testdata/doctor/test_examine_cluster_jobs b/pkg/cli/testdata/doctor/test_examine_cluster_jobs
index a4ca5f9a9538..3fcea224a93b 100644
--- a/pkg/cli/testdata/doctor/test_examine_cluster_jobs
+++ b/pkg/cli/testdata/doctor/test_examine_cluster_jobs
@@ -7,5 +7,5 @@ Examining 68 descriptors and 69 namespace entries...
ParentID 183, ParentSchemaID 381: relation "foo" (104): expected matching namespace entry, found none
ParentID 183, ParentSchemaID 381: relation "foo" (104): mutation job 962952277419655169: job 962952277419655169 not found
ParentID 100, ParentSchemaID 101: namespace entry "foo" (104): mismatched name "foo" in relation descriptor
-Examining 9 jobs...
+Examining 10 jobs...
ERROR: validation failed
diff --git a/pkg/clusterversion/cockroach_versions.go b/pkg/clusterversion/cockroach_versions.go
index eef760b98636..cb3a9e57d8e4 100644
--- a/pkg/clusterversion/cockroach_versions.go
+++ b/pkg/clusterversion/cockroach_versions.go
@@ -225,6 +225,8 @@ const (
V25_2_Start
+ V25_2_AddSqlActivityFlushJob
+
// *************************************************
// Step (1) Add new versions above this comment.
// Do not add new versions to a patch release.
@@ -276,7 +278,8 @@ var versionTable = [numKeys]roachpb.Version{
V25_1: {Major: 25, Minor: 1, Internal: 0},
// v25.2 versions. Internal versions must be even.
- V25_2_Start: {Major: 25, Minor: 1, Internal: 2},
+ V25_2_Start: {Major: 25, Minor: 1, Internal: 2},
+ V25_2_AddSqlActivityFlushJob: {Major: 25, Minor: 1, Internal: 4},
// *************************************************
// Step (2): Add new versions above this comment.
diff --git a/pkg/jobs/jobs_test.go b/pkg/jobs/jobs_test.go
index 45a0a82555c7..203aa1e65905 100644
--- a/pkg/jobs/jobs_test.go
+++ b/pkg/jobs/jobs_test.go
@@ -216,6 +216,7 @@ func (rts *registryTestSuite) setUp(t *testing.T) func() {
SkipUpdateSQLActivityJobBootstrap: true,
SkipMVCCStatisticsJobBootstrap: true,
SkipUpdateTableMetadataCacheBootstrap: true,
+ SkipSqlActivityFlushJobBootstrap: true,
}
args.Knobs.KeyVisualizer = &keyvisualizer.TestingKnobs{SkipJobBootstrap: true}
diff --git a/pkg/jobs/jobspb/jobs.proto b/pkg/jobs/jobspb/jobs.proto
index 1b9da7517845..173cdfb3734a 100644
--- a/pkg/jobs/jobspb/jobs.proto
+++ b/pkg/jobs/jobspb/jobs.proto
@@ -1466,6 +1466,14 @@ message ImportRollbackDetails {
];
}
+message SqlActivityFlushDetails {
+
+}
+
+message SqlActivityFlushProgress {
+
+}
+
message ImportRollbackProgress {}
message Payload {
@@ -1536,6 +1544,7 @@ message Payload {
LogicalReplicationDetails logical_replication_details = 48;
UpdateTableMetadataCacheDetails update_table_metadata_cache_details = 49;
StandbyReadTSPollerDetails standby_read_ts_poller_details = 50;
+ SqlActivityFlushDetails sql_activity_flush_details = 51;
}
reserved 26;
// PauseReason is used to describe the reason that the job is currently paused
@@ -1616,6 +1625,7 @@ message Progress {
LogicalReplicationProgress LogicalReplication = 36;
UpdateTableMetadataCacheProgress table_metadata_cache = 37;
StandbyReadTSPollerProgress standby_read_ts_poller = 38;
+ SqlActivityFlushProgress sql_activity_flush = 39;
}
uint64 trace_id = 21 [(gogoproto.nullable) = false, (gogoproto.customname) = "TraceID", (gogoproto.customtype) = "github.com/cockroachdb/cockroach/pkg/util/tracing/tracingpb.TraceID"];
@@ -1658,6 +1668,7 @@ enum Type {
AUTO_CREATE_PARTIAL_STATS = 28 [(gogoproto.enumvalue_customname) = "TypeAutoCreatePartialStats"];
UPDATE_TABLE_METADATA_CACHE = 29 [(gogoproto.enumvalue_customname) = "TypeUpdateTableMetadataCache"];
STANDBY_READ_TS_POLLER = 30 [(gogoproto.enumvalue_customname) = "TypeStandbyReadTSPoller"];
+ SQL_ACTIVITY_FLUSH = 31 [(gogoproto.enumvalue_customname) = "TypeSQLActivityFlush"];
}
message Job {
diff --git a/pkg/jobs/jobspb/wrap.go b/pkg/jobs/jobspb/wrap.go
index e7cce694a2d3..39a1d70a73e2 100644
--- a/pkg/jobs/jobspb/wrap.go
+++ b/pkg/jobs/jobspb/wrap.go
@@ -46,6 +46,7 @@ var (
_ Details = LogicalReplicationDetails{}
_ Details = UpdateTableMetadataCacheDetails{}
_ Details = StandbyReadTSPollerDetails{}
+ _ Details = SqlActivityFlushDetails{}
)
// ProgressDetails is a marker interface for job progress details proto structs.
@@ -76,6 +77,7 @@ var (
_ ProgressDetails = LogicalReplicationProgress{}
_ ProgressDetails = UpdateTableMetadataCacheProgress{}
_ ProgressDetails = StandbyReadTSPollerProgress{}
+ _ ProgressDetails = SqlActivityFlushProgress{}
)
// Type returns the payload's job type and panics if the type is invalid.
@@ -172,6 +174,7 @@ var AutomaticJobTypes = [...]Type{
TypeAutoUpdateSQLActivity,
TypeMVCCStatisticsUpdate,
TypeUpdateTableMetadataCache,
+ TypeSQLActivityFlush,
}
// DetailsType returns the type for a payload detail.
@@ -239,6 +242,8 @@ func DetailsType(d isPayload_Details) (Type, error) {
return TypeUpdateTableMetadataCache, nil
case *Payload_StandbyReadTsPollerDetails:
return TypeStandbyReadTSPoller, nil
+ case *Payload_SqlActivityFlushDetails:
+ return TypeSQLActivityFlush, nil
default:
return TypeUnspecified, errors.Newf("Payload.Type called on a payload with an unknown details type: %T", d)
}
@@ -292,6 +297,7 @@ var JobDetailsForEveryJobType = map[Type]Details{
TypeLogicalReplication: LogicalReplicationDetails{},
TypeUpdateTableMetadataCache: UpdateTableMetadataCacheDetails{},
TypeStandbyReadTSPoller: StandbyReadTSPollerDetails{},
+ TypeSQLActivityFlush: SqlActivityFlushDetails{},
}
// WrapProgressDetails wraps a ProgressDetails object in the protobuf wrapper
@@ -359,6 +365,8 @@ func WrapProgressDetails(details ProgressDetails) interface {
return &Progress_TableMetadataCache{TableMetadataCache: &d}
case StandbyReadTSPollerProgress:
return &Progress_StandbyReadTsPoller{StandbyReadTsPoller: &d}
+ case SqlActivityFlushProgress:
+ return &Progress_SqlActivityFlush{SqlActivityFlush: &d}
default:
panic(errors.AssertionFailedf("WrapProgressDetails: unknown progress type %T", d))
}
@@ -424,6 +432,8 @@ func (p *Payload) UnwrapDetails() Details {
return *d.UpdateTableMetadataCacheDetails
case *Payload_StandbyReadTsPollerDetails:
return *d.StandbyReadTsPollerDetails
+ case *Payload_SqlActivityFlushDetails:
+ return *d.SqlActivityFlushDetails
default:
return nil
}
@@ -489,6 +499,8 @@ func (p *Progress) UnwrapDetails() ProgressDetails {
return *d.TableMetadataCache
case *Progress_StandbyReadTsPoller:
return *d.StandbyReadTsPoller
+ case *Progress_SqlActivityFlush:
+ return *d.SqlActivityFlush
default:
return nil
}
@@ -578,6 +590,8 @@ func WrapPayloadDetails(details Details) interface {
return &Payload_UpdateTableMetadataCacheDetails{UpdateTableMetadataCacheDetails: &d}
case StandbyReadTSPollerDetails:
return &Payload_StandbyReadTsPollerDetails{StandbyReadTsPollerDetails: &d}
+ case SqlActivityFlushDetails:
+ return &Payload_SqlActivityFlushDetails{SqlActivityFlushDetails: &d}
default:
panic(errors.AssertionFailedf("jobs.WrapPayloadDetails: unknown details type %T", d))
}
@@ -613,7 +627,7 @@ const (
func (Type) SafeValue() {}
// NumJobTypes is the number of jobs types.
-const NumJobTypes = 31
+const NumJobTypes = 32
// ChangefeedDetailsMarshaler allows for dependency injection of
// cloud.SanitizeExternalStorageURI to avoid the dependency from this
diff --git a/pkg/jobs/registry.go b/pkg/jobs/registry.go
index d2b60cf6882f..b1a69d3eb67a 100644
--- a/pkg/jobs/registry.go
+++ b/pkg/jobs/registry.go
@@ -319,6 +319,8 @@ const (
MVCCStatisticsJobID = jobspb.JobID(104)
UpdateTableMetadataCacheJobID = jobspb.JobID(105)
+
+ SqlActivityFlushJobID = jobspb.JobID(106)
)
// MakeJobID generates a new job ID.
diff --git a/pkg/jobs/registry_test.go b/pkg/jobs/registry_test.go
index 9042d84028f2..fb27aa658516 100644
--- a/pkg/jobs/registry_test.go
+++ b/pkg/jobs/registry_test.go
@@ -122,6 +122,7 @@ func TestRegistryGC(t *testing.T) {
SkipJobMetricsPollingJobBootstrap: true,
SkipMVCCStatisticsJobBootstrap: true,
SkipUpdateTableMetadataCacheBootstrap: true,
+ SkipSqlActivityFlushJobBootstrap: true,
},
KeyVisualizer: &keyvisualizer.TestingKnobs{
SkipJobBootstrap: true,
@@ -282,6 +283,7 @@ func TestRegistryGCPagination(t *testing.T) {
SkipUpdateSQLActivityJobBootstrap: true,
SkipMVCCStatisticsJobBootstrap: true,
SkipUpdateTableMetadataCacheBootstrap: true,
+ SkipSqlActivityFlushJobBootstrap: true,
},
KeyVisualizer: &keyvisualizer.TestingKnobs{
SkipJobBootstrap: true,
diff --git a/pkg/sql/catalog/bootstrap/testdata/testdata b/pkg/sql/catalog/bootstrap/testdata/testdata
index 8552a634b53f..6e253d9e652f 100644
--- a/pkg/sql/catalog/bootstrap/testdata/testdata
+++ b/pkg/sql/catalog/bootstrap/testdata/testdata
@@ -1,7 +1,7 @@
-system hash=83be2905828c1e366a584a41efd16d146eda026eccd5160a2a4b54ec3f49b582
+system hash=594e3fbde512dd058e06f2d4924d08774b8fe41d67025ccc098f0eb051990681
----
[{"key":"8b"}
-,{"key":"8b89898a89","value":"0312470a0673797374656d10011a250a0d0a0561646d696e1080101880100a0c0a04726f6f7410801018801012046e6f646518032200280140004a006a0a08d9843d1001180020027000"}
+,{"key":"8b89898a89","value":"0312470a0673797374656d10011a250a0d0a0561646d696e1080101880100a0c0a04726f6f7410801018801012046e6f646518032200280140004a006a0a08d9843d1001180020047000"}
,{"key":"8b898b8a89","value":"030aa0030a0a64657363726970746f721803200128013a0042270a02696410011a0c08011040180030005014600020003000680070007800800100880100980100422f0a0a64657363726970746f7210021a0c08081000180030005011600020013000680070007800800100880100980100480352740a077072696d61727910011801220269642a0a64657363726970746f72300140004a10080010001a00200028003000380040005a0070027a0408002000800100880100900104980101a20106080012001800a80100b20100ba0100c00100c80100d00101e00100e9010000000000000000f2010060026a210a0b0a0561646d696e102018200a0a0a04726f6f741020182012046e6f64651803800101880103980100b201130a077072696d61727910001a02696420012800b201240a1066616d5f325f64657363726970746f7210021a0a64657363726970746f7220022802b80103c20100e80100f2010408001200f801008002009202009a0200b20200b80200c0021dc80200e00200800300880302a80300b00300d00300d80300e00300f80300880400980400a00400a80400"}
,{"key":"8b898c8a89","value":"030adc050a0575736572731804200128013a00422d0a08757365726e616d6510011a0c0807100018003000501960002000300068007000780080010088010098010042330a0e68617368656450617373776f726410021a0c0808100018003000501160002001300068007000780080010088010098010042320a066973526f6c6510031a0c08001000180030005010600020002a0566616c73653000680070007800800100880100980100422c0a07757365725f696410041a0c080c100018003000501a60002000300068007000780080010088010098010048055293010a077072696d617279100118012208757365726e616d652a0e68617368656450617373776f72642a066973526f6c652a07757365725f6964300140004a10080010001a00200028003000380040005a007002700370047a0408002000800100880100900104980101a20106080012001800a80100b20100ba0100c00100c80100d00102e00100e9010000000000000000f201005a770a1175736572735f757365725f69645f696478100218012207757365725f69643004380140004a10080010001a00200028003000380040005a007a0408002000800100880100900103980100a20106080012001800a80100b20100ba0100c00100c80100d00101e00100e9010000000000000000f2010060036a250a0d0a0561646d696e10e00318e0030a0c0a04726f6f7410e00318e00312046e6f64651803800101880103980100b201240a077072696d61727910001a08757365726e616d651a07757365725f6964200120042804b2012c0a1466616d5f325f68617368656450617373776f726410021a0e68617368656450617373776f726420022802b2011c0a0c66616d5f335f6973526f6c6510031a066973526f6c6520032803b80104c20100e80100f2010408001200f801008002009202009a0200b20200b80200c0021dc80200e00200800300880303a80300b00300d00300d80300e00300f80300880400980400a00400a80400"}
,{"key":"8b898d8a89","value":"030a8f030a057a6f6e65731805200128013a0042270a02696410011a0c08011040180030005014600020003000680070007800800100880100980100422b0a06636f6e66696710021a0c08081000180030005011600020013000680070007800800100880100980100480352700a077072696d61727910011801220269642a06636f6e666967300140004a10080010001a00200028003000380040005a0070027a0408002000800100880100900104980101a20106080012001800a80100b20100ba0100c00100c80100d00101e00100e9010000000000000000f2010060026a250a0d0a0561646d696e10e00318e0030a0c0a04726f6f7410e00318e00312046e6f64651803800101880103980100b201130a077072696d61727910001a02696420012800b2011c0a0c66616d5f325f636f6e66696710021a06636f6e66696720022802b80103c20100e80100f2010408001200f801008002009202009a0200b20200b80200c0021dc80200e00200800300880302a80300b00300d00300d80300e00300f80300880400980400a00400a80400"}
@@ -213,10 +213,10 @@ system hash=83be2905828c1e366a584a41efd16d146eda026eccd5160a2a4b54ec3f49b582
,{"key":"d0"}
]
-tenant hash=981e9bbf9d7d899e075eda95cbb8562f522a84ce2e0c4aa7c6a562f24fd47867
+tenant hash=8d28a6a45b97e05312c013d50318bbb60e830e6c2e001a4ed1c451f7184d5fdb
----
[{"key":""}
-,{"key":"8b89898a89","value":"0312470a0673797374656d10011a250a0d0a0561646d696e1080101880100a0c0a04726f6f7410801018801012046e6f646518032200280140004a006a0a08d9843d1001180020027000"}
+,{"key":"8b89898a89","value":"0312470a0673797374656d10011a250a0d0a0561646d696e1080101880100a0c0a04726f6f7410801018801012046e6f646518032200280140004a006a0a08d9843d1001180020047000"}
,{"key":"8b898b8a89","value":"030aa0030a0a64657363726970746f721803200128013a0042270a02696410011a0c08011040180030005014600020003000680070007800800100880100980100422f0a0a64657363726970746f7210021a0c08081000180030005011600020013000680070007800800100880100980100480352740a077072696d61727910011801220269642a0a64657363726970746f72300140004a10080010001a00200028003000380040005a0070027a0408002000800100880100900104980101a20106080012001800a80100b20100ba0100c00100c80100d00101e00100e9010000000000000000f2010060026a210a0b0a0561646d696e102018200a0a0a04726f6f741020182012046e6f64651803800101880103980100b201130a077072696d61727910001a02696420012800b201240a1066616d5f325f64657363726970746f7210021a0a64657363726970746f7220022802b80103c20100e80100f2010408001200f801008002009202009a0200b20200b80200c0021dc80200e00200800300880302a80300b00300d00300d80300e00300f80300880400980400a00400a80400"}
,{"key":"8b898c8a89","value":"030adc050a0575736572731804200128013a00422d0a08757365726e616d6510011a0c0807100018003000501960002000300068007000780080010088010098010042330a0e68617368656450617373776f726410021a0c0808100018003000501160002001300068007000780080010088010098010042320a066973526f6c6510031a0c08001000180030005010600020002a0566616c73653000680070007800800100880100980100422c0a07757365725f696410041a0c080c100018003000501a60002000300068007000780080010088010098010048055293010a077072696d617279100118012208757365726e616d652a0e68617368656450617373776f72642a066973526f6c652a07757365725f6964300140004a10080010001a00200028003000380040005a007002700370047a0408002000800100880100900104980101a20106080012001800a80100b20100ba0100c00100c80100d00102e00100e9010000000000000000f201005a770a1175736572735f757365725f69645f696478100218012207757365725f69643004380140004a10080010001a00200028003000380040005a007a0408002000800100880100900103980100a20106080012001800a80100b20100ba0100c00100c80100d00101e00100e9010000000000000000f2010060036a250a0d0a0561646d696e10e00318e0030a0c0a04726f6f7410e00318e00312046e6f64651803800101880103980100b201240a077072696d61727910001a08757365726e616d651a07757365725f6964200120042804b2012c0a1466616d5f325f68617368656450617373776f726410021a0e68617368656450617373776f726420022802b2011c0a0c66616d5f335f6973526f6c6510031a066973526f6c6520032803b80104c20100e80100f2010408001200f801008002009202009a0200b20200b80200c0021dc80200e00200800300880303a80300b00300d00300d80300e00300f80300880400980400a00400a80400"}
,{"key":"8b898d8a89","value":"030a8f030a057a6f6e65731805200128013a0042270a02696410011a0c08011040180030005014600020003000680070007800800100880100980100422b0a06636f6e66696710021a0c08081000180030005011600020013000680070007800800100880100980100480352700a077072696d61727910011801220269642a06636f6e666967300140004a10080010001a00200028003000380040005a0070027a0408002000800100880100900104980101a20106080012001800a80100b20100ba0100c00100c80100d00101e00100e9010000000000000000f2010060026a250a0d0a0561646d696e10e00318e0030a0c0a04726f6f7410e00318e00312046e6f64651803800101880103980100b201130a077072696d61727910001a02696420012800b2011c0a0c66616d5f325f636f6e66696710021a06636f6e66696720022802b80103c20100e80100f2010408001200f801008002009202009a0200b20200b80200c0021dc80200e00200800300880302a80300b00300d00300d80300e00300f80300880400980400a00400a80400"}
diff --git a/pkg/sql/catalog/systemschema/system.go b/pkg/sql/catalog/systemschema/system.go
index a12a09d48ec4..63676e1ae25b 100644
--- a/pkg/sql/catalog/systemschema/system.go
+++ b/pkg/sql/catalog/systemschema/system.go
@@ -1375,7 +1375,7 @@ const SystemDatabaseName = catconstants.SystemDatabaseName
// release version).
//
// NB: Don't set this to clusterversion.Latest; use a specific version instead.
-var SystemDatabaseSchemaBootstrapVersion = clusterversion.V25_2_Start.Version()
+var SystemDatabaseSchemaBootstrapVersion = clusterversion.V25_2_AddSqlActivityFlushJob.Version()
// MakeSystemDatabaseDesc constructs a copy of the system database
// descriptor.
diff --git a/pkg/sql/catalog/systemschema_test/testdata/bootstrap_system b/pkg/sql/catalog/systemschema_test/testdata/bootstrap_system
index f6cc12c34650..4f8247d15b0f 100644
--- a/pkg/sql/catalog/systemschema_test/testdata/bootstrap_system
+++ b/pkg/sql/catalog/systemschema_test/testdata/bootstrap_system
@@ -715,7 +715,7 @@ schema_telemetry
----
{"database":{"name":"defaultdb","id":100,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2","withGrantOption":"2"},{"userProto":"public","privileges":"2048"},{"userProto":"root","privileges":"2","withGrantOption":"2"}],"ownerProto":"root","version":3},"schemas":{"public":{"id":101}},"defaultPrivileges":{}}}
{"database":{"name":"postgres","id":102,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2","withGrantOption":"2"},{"userProto":"public","privileges":"2048"},{"userProto":"root","privileges":"2","withGrantOption":"2"}],"ownerProto":"root","version":3},"schemas":{"public":{"id":103}},"defaultPrivileges":{}}}
-{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":2}}}
+{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":4}}}
{"table":{"name":"comments","id":24,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"type","id":1,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"object_id","id":2,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"sub_id","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"comment","id":4,"type":{"family":"StringFamily","oid":25}}],"nextColumnId":5,"families":[{"name":"primary","columnNames":["type","object_id","sub_id"],"columnIds":[1,2,3]},{"name":"fam_4_comment","id":4,"columnNames":["comment"],"columnIds":[4],"defaultColumnId":4}],"nextFamilyId":5,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["type","object_id","sub_id"],"keyColumnDirections":["ASC","ASC","ASC"],"storeColumnNames":["comment"],"keyColumnIds":[1,2,3],"storeColumnIds":[4],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"public","privileges":"32"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"database_role_settings","id":44,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"database_id","id":1,"type":{"family":"OidFamily","oid":26}},{"name":"role_name","id":2,"type":{"family":"StringFamily","oid":25}},{"name":"settings","id":3,"type":{"family":"ArrayFamily","arrayElemType":"StringFamily","oid":1009,"arrayContents":{"family":"StringFamily","oid":25}}},{"name":"role_id","id":4,"type":{"family":"OidFamily","oid":26}}],"nextColumnId":5,"families":[{"name":"primary","columnNames":["database_id","role_name","settings","role_id"],"columnIds":[1,2,3,4]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["database_id","role_name"],"keyColumnDirections":["ASC","ASC"],"storeColumnNames":["settings","role_id"],"keyColumnIds":[1,2],"storeColumnIds":[3,4],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":2,"vecConfig":{}},"indexes":[{"name":"database_role_settings_database_id_role_id_key","id":2,"unique":true,"version":3,"keyColumnNames":["database_id","role_id"],"keyColumnDirections":["ASC","ASC"],"storeColumnNames":["settings"],"keyColumnIds":[1,4],"keySuffixColumnIds":[2],"storeColumnIds":[3],"foreignKey":{},"interleave":{},"partitioning":{},"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}}],"nextIndexId":3,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":3}}
{"table":{"name":"descriptor","id":3,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"id","id":1,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"descriptor","id":2,"type":{"family":"BytesFamily","oid":17},"nullable":true}],"nextColumnId":3,"families":[{"name":"primary","columnNames":["id"],"columnIds":[1]},{"name":"fam_2_descriptor","id":2,"columnNames":["descriptor"],"columnIds":[2],"defaultColumnId":2}],"nextFamilyId":3,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["id"],"keyColumnDirections":["ASC"],"storeColumnNames":["descriptor"],"keyColumnIds":[1],"storeColumnIds":[2],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"32","withGrantOption":"32"},{"userProto":"root","privileges":"32","withGrantOption":"32"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
@@ -784,7 +784,7 @@ schema_telemetry
schema_telemetry snapshot_id=7cd8a9ae-f35c-4cd2-970a-757174600874 max_records=10
----
{"database":{"name":"defaultdb","id":100,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2","withGrantOption":"2"},{"userProto":"public","privileges":"2048"},{"userProto":"root","privileges":"2","withGrantOption":"2"}],"ownerProto":"root","version":3},"schemas":{"public":{"id":101}},"defaultPrivileges":{}}}
-{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":2}}}
+{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":4}}}
{"table":{"name":"eventlog","id":12,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"timestamp","id":1,"type":{"family":"TimestampFamily","oid":1114}},{"name":"eventType","id":2,"type":{"family":"StringFamily","oid":25}},{"name":"targetID","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"reportingID","id":4,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"info","id":5,"type":{"family":"StringFamily","oid":25},"nullable":true},{"name":"uniqueID","id":6,"type":{"family":"BytesFamily","oid":17},"defaultExpr":"uuid_v4()"}],"nextColumnId":7,"families":[{"name":"primary","columnNames":["timestamp","uniqueID"],"columnIds":[1,6]},{"name":"fam_2_eventType","id":2,"columnNames":["eventType"],"columnIds":[2],"defaultColumnId":2},{"name":"fam_3_targetID","id":3,"columnNames":["targetID"],"columnIds":[3],"defaultColumnId":3},{"name":"fam_4_reportingID","id":4,"columnNames":["reportingID"],"columnIds":[4],"defaultColumnId":4},{"name":"fam_5_info","id":5,"columnNames":["info"],"columnIds":[5],"defaultColumnId":5}],"nextFamilyId":6,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["timestamp","uniqueID"],"keyColumnDirections":["ASC","ASC"],"storeColumnNames":["eventType","targetID","reportingID","info"],"keyColumnIds":[1,6],"storeColumnIds":[2,3,4,5],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"external_connections","id":53,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"connection_name","id":1,"type":{"family":"StringFamily","oid":25}},{"name":"created","id":2,"type":{"family":"TimestampFamily","oid":1114},"defaultExpr":"now():::TIMESTAMP"},{"name":"updated","id":3,"type":{"family":"TimestampFamily","oid":1114},"defaultExpr":"now():::TIMESTAMP"},{"name":"connection_type","id":4,"type":{"family":"StringFamily","oid":25}},{"name":"connection_details","id":5,"type":{"family":"BytesFamily","oid":17}},{"name":"owner","id":6,"type":{"family":"StringFamily","oid":25}},{"name":"owner_id","id":7,"type":{"family":"OidFamily","oid":26}}],"nextColumnId":8,"families":[{"name":"primary","columnNames":["connection_name","created","updated","connection_type","connection_details","owner","owner_id"],"columnIds":[1,2,3,4,5,6,7]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["connection_name"],"keyColumnDirections":["ASC"],"storeColumnNames":["created","updated","connection_type","connection_details","owner","owner_id"],"keyColumnIds":[1],"storeColumnIds":[2,3,4,5,6,7],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"protected_ts_meta","id":31,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"singleton","id":1,"type":{"oid":16},"defaultExpr":"true"},{"name":"version","id":2,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"num_records","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"num_spans","id":4,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"total_bytes","id":5,"type":{"family":"IntFamily","width":64,"oid":20}}],"nextColumnId":6,"families":[{"name":"primary","columnNames":["singleton","version","num_records","num_spans","total_bytes"],"columnIds":[1,2,3,4,5]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["singleton"],"keyColumnDirections":["ASC"],"storeColumnNames":["version","num_records","num_spans","total_bytes"],"keyColumnIds":[1],"storeColumnIds":[2,3,4,5],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"32","withGrantOption":"32"},{"userProto":"root","privileges":"32","withGrantOption":"32"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"checks":[{"expr":"singleton","name":"check_singleton","columnIds":[1],"constraintId":2}],"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":3}}
@@ -797,7 +797,7 @@ schema_telemetry snapshot_id=7cd8a9ae-f35c-4cd2-970a-757174600874 max_records=10
schema_telemetry snapshot_id=7cd8a9ae-f35c-4cd2-970a-757174600874 max_records=10
----
{"database":{"name":"defaultdb","id":100,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2","withGrantOption":"2"},{"userProto":"public","privileges":"2048"},{"userProto":"root","privileges":"2","withGrantOption":"2"}],"ownerProto":"root","version":3},"schemas":{"public":{"id":101}},"defaultPrivileges":{}}}
-{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":2}}}
+{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":4}}}
{"table":{"name":"eventlog","id":12,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"timestamp","id":1,"type":{"family":"TimestampFamily","oid":1114}},{"name":"eventType","id":2,"type":{"family":"StringFamily","oid":25}},{"name":"targetID","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"reportingID","id":4,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"info","id":5,"type":{"family":"StringFamily","oid":25},"nullable":true},{"name":"uniqueID","id":6,"type":{"family":"BytesFamily","oid":17},"defaultExpr":"uuid_v4()"}],"nextColumnId":7,"families":[{"name":"primary","columnNames":["timestamp","uniqueID"],"columnIds":[1,6]},{"name":"fam_2_eventType","id":2,"columnNames":["eventType"],"columnIds":[2],"defaultColumnId":2},{"name":"fam_3_targetID","id":3,"columnNames":["targetID"],"columnIds":[3],"defaultColumnId":3},{"name":"fam_4_reportingID","id":4,"columnNames":["reportingID"],"columnIds":[4],"defaultColumnId":4},{"name":"fam_5_info","id":5,"columnNames":["info"],"columnIds":[5],"defaultColumnId":5}],"nextFamilyId":6,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["timestamp","uniqueID"],"keyColumnDirections":["ASC","ASC"],"storeColumnNames":["eventType","targetID","reportingID","info"],"keyColumnIds":[1,6],"storeColumnIds":[2,3,4,5],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"external_connections","id":53,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"connection_name","id":1,"type":{"family":"StringFamily","oid":25}},{"name":"created","id":2,"type":{"family":"TimestampFamily","oid":1114},"defaultExpr":"now():::TIMESTAMP"},{"name":"updated","id":3,"type":{"family":"TimestampFamily","oid":1114},"defaultExpr":"now():::TIMESTAMP"},{"name":"connection_type","id":4,"type":{"family":"StringFamily","oid":25}},{"name":"connection_details","id":5,"type":{"family":"BytesFamily","oid":17}},{"name":"owner","id":6,"type":{"family":"StringFamily","oid":25}},{"name":"owner_id","id":7,"type":{"family":"OidFamily","oid":26}}],"nextColumnId":8,"families":[{"name":"primary","columnNames":["connection_name","created","updated","connection_type","connection_details","owner","owner_id"],"columnIds":[1,2,3,4,5,6,7]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["connection_name"],"keyColumnDirections":["ASC"],"storeColumnNames":["created","updated","connection_type","connection_details","owner","owner_id"],"keyColumnIds":[1],"storeColumnIds":[2,3,4,5,6,7],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"protected_ts_meta","id":31,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"singleton","id":1,"type":{"oid":16},"defaultExpr":"true"},{"name":"version","id":2,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"num_records","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"num_spans","id":4,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"total_bytes","id":5,"type":{"family":"IntFamily","width":64,"oid":20}}],"nextColumnId":6,"families":[{"name":"primary","columnNames":["singleton","version","num_records","num_spans","total_bytes"],"columnIds":[1,2,3,4,5]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["singleton"],"keyColumnDirections":["ASC"],"storeColumnNames":["version","num_records","num_spans","total_bytes"],"keyColumnIds":[1],"storeColumnIds":[2,3,4,5],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"32","withGrantOption":"32"},{"userProto":"root","privileges":"32","withGrantOption":"32"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"checks":[{"expr":"singleton","name":"check_singleton","columnIds":[1],"constraintId":2}],"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":3}}
diff --git a/pkg/sql/catalog/systemschema_test/testdata/bootstrap_tenant b/pkg/sql/catalog/systemschema_test/testdata/bootstrap_tenant
index f6cc12c34650..4f8247d15b0f 100644
--- a/pkg/sql/catalog/systemschema_test/testdata/bootstrap_tenant
+++ b/pkg/sql/catalog/systemschema_test/testdata/bootstrap_tenant
@@ -715,7 +715,7 @@ schema_telemetry
----
{"database":{"name":"defaultdb","id":100,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2","withGrantOption":"2"},{"userProto":"public","privileges":"2048"},{"userProto":"root","privileges":"2","withGrantOption":"2"}],"ownerProto":"root","version":3},"schemas":{"public":{"id":101}},"defaultPrivileges":{}}}
{"database":{"name":"postgres","id":102,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2","withGrantOption":"2"},{"userProto":"public","privileges":"2048"},{"userProto":"root","privileges":"2","withGrantOption":"2"}],"ownerProto":"root","version":3},"schemas":{"public":{"id":103}},"defaultPrivileges":{}}}
-{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":2}}}
+{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":4}}}
{"table":{"name":"comments","id":24,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"type","id":1,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"object_id","id":2,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"sub_id","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"comment","id":4,"type":{"family":"StringFamily","oid":25}}],"nextColumnId":5,"families":[{"name":"primary","columnNames":["type","object_id","sub_id"],"columnIds":[1,2,3]},{"name":"fam_4_comment","id":4,"columnNames":["comment"],"columnIds":[4],"defaultColumnId":4}],"nextFamilyId":5,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["type","object_id","sub_id"],"keyColumnDirections":["ASC","ASC","ASC"],"storeColumnNames":["comment"],"keyColumnIds":[1,2,3],"storeColumnIds":[4],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"public","privileges":"32"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"database_role_settings","id":44,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"database_id","id":1,"type":{"family":"OidFamily","oid":26}},{"name":"role_name","id":2,"type":{"family":"StringFamily","oid":25}},{"name":"settings","id":3,"type":{"family":"ArrayFamily","arrayElemType":"StringFamily","oid":1009,"arrayContents":{"family":"StringFamily","oid":25}}},{"name":"role_id","id":4,"type":{"family":"OidFamily","oid":26}}],"nextColumnId":5,"families":[{"name":"primary","columnNames":["database_id","role_name","settings","role_id"],"columnIds":[1,2,3,4]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["database_id","role_name"],"keyColumnDirections":["ASC","ASC"],"storeColumnNames":["settings","role_id"],"keyColumnIds":[1,2],"storeColumnIds":[3,4],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":2,"vecConfig":{}},"indexes":[{"name":"database_role_settings_database_id_role_id_key","id":2,"unique":true,"version":3,"keyColumnNames":["database_id","role_id"],"keyColumnDirections":["ASC","ASC"],"storeColumnNames":["settings"],"keyColumnIds":[1,4],"keySuffixColumnIds":[2],"storeColumnIds":[3],"foreignKey":{},"interleave":{},"partitioning":{},"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}}],"nextIndexId":3,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":3}}
{"table":{"name":"descriptor","id":3,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"id","id":1,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"descriptor","id":2,"type":{"family":"BytesFamily","oid":17},"nullable":true}],"nextColumnId":3,"families":[{"name":"primary","columnNames":["id"],"columnIds":[1]},{"name":"fam_2_descriptor","id":2,"columnNames":["descriptor"],"columnIds":[2],"defaultColumnId":2}],"nextFamilyId":3,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["id"],"keyColumnDirections":["ASC"],"storeColumnNames":["descriptor"],"keyColumnIds":[1],"storeColumnIds":[2],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"32","withGrantOption":"32"},{"userProto":"root","privileges":"32","withGrantOption":"32"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
@@ -784,7 +784,7 @@ schema_telemetry
schema_telemetry snapshot_id=7cd8a9ae-f35c-4cd2-970a-757174600874 max_records=10
----
{"database":{"name":"defaultdb","id":100,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2","withGrantOption":"2"},{"userProto":"public","privileges":"2048"},{"userProto":"root","privileges":"2","withGrantOption":"2"}],"ownerProto":"root","version":3},"schemas":{"public":{"id":101}},"defaultPrivileges":{}}}
-{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":2}}}
+{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":4}}}
{"table":{"name":"eventlog","id":12,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"timestamp","id":1,"type":{"family":"TimestampFamily","oid":1114}},{"name":"eventType","id":2,"type":{"family":"StringFamily","oid":25}},{"name":"targetID","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"reportingID","id":4,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"info","id":5,"type":{"family":"StringFamily","oid":25},"nullable":true},{"name":"uniqueID","id":6,"type":{"family":"BytesFamily","oid":17},"defaultExpr":"uuid_v4()"}],"nextColumnId":7,"families":[{"name":"primary","columnNames":["timestamp","uniqueID"],"columnIds":[1,6]},{"name":"fam_2_eventType","id":2,"columnNames":["eventType"],"columnIds":[2],"defaultColumnId":2},{"name":"fam_3_targetID","id":3,"columnNames":["targetID"],"columnIds":[3],"defaultColumnId":3},{"name":"fam_4_reportingID","id":4,"columnNames":["reportingID"],"columnIds":[4],"defaultColumnId":4},{"name":"fam_5_info","id":5,"columnNames":["info"],"columnIds":[5],"defaultColumnId":5}],"nextFamilyId":6,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["timestamp","uniqueID"],"keyColumnDirections":["ASC","ASC"],"storeColumnNames":["eventType","targetID","reportingID","info"],"keyColumnIds":[1,6],"storeColumnIds":[2,3,4,5],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"external_connections","id":53,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"connection_name","id":1,"type":{"family":"StringFamily","oid":25}},{"name":"created","id":2,"type":{"family":"TimestampFamily","oid":1114},"defaultExpr":"now():::TIMESTAMP"},{"name":"updated","id":3,"type":{"family":"TimestampFamily","oid":1114},"defaultExpr":"now():::TIMESTAMP"},{"name":"connection_type","id":4,"type":{"family":"StringFamily","oid":25}},{"name":"connection_details","id":5,"type":{"family":"BytesFamily","oid":17}},{"name":"owner","id":6,"type":{"family":"StringFamily","oid":25}},{"name":"owner_id","id":7,"type":{"family":"OidFamily","oid":26}}],"nextColumnId":8,"families":[{"name":"primary","columnNames":["connection_name","created","updated","connection_type","connection_details","owner","owner_id"],"columnIds":[1,2,3,4,5,6,7]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["connection_name"],"keyColumnDirections":["ASC"],"storeColumnNames":["created","updated","connection_type","connection_details","owner","owner_id"],"keyColumnIds":[1],"storeColumnIds":[2,3,4,5,6,7],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"protected_ts_meta","id":31,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"singleton","id":1,"type":{"oid":16},"defaultExpr":"true"},{"name":"version","id":2,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"num_records","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"num_spans","id":4,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"total_bytes","id":5,"type":{"family":"IntFamily","width":64,"oid":20}}],"nextColumnId":6,"families":[{"name":"primary","columnNames":["singleton","version","num_records","num_spans","total_bytes"],"columnIds":[1,2,3,4,5]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["singleton"],"keyColumnDirections":["ASC"],"storeColumnNames":["version","num_records","num_spans","total_bytes"],"keyColumnIds":[1],"storeColumnIds":[2,3,4,5],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"32","withGrantOption":"32"},{"userProto":"root","privileges":"32","withGrantOption":"32"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"checks":[{"expr":"singleton","name":"check_singleton","columnIds":[1],"constraintId":2}],"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":3}}
@@ -797,7 +797,7 @@ schema_telemetry snapshot_id=7cd8a9ae-f35c-4cd2-970a-757174600874 max_records=10
schema_telemetry snapshot_id=7cd8a9ae-f35c-4cd2-970a-757174600874 max_records=10
----
{"database":{"name":"defaultdb","id":100,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2","withGrantOption":"2"},{"userProto":"public","privileges":"2048"},{"userProto":"root","privileges":"2","withGrantOption":"2"}],"ownerProto":"root","version":3},"schemas":{"public":{"id":101}},"defaultPrivileges":{}}}
-{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":2}}}
+{"database":{"name":"system","id":1,"modificationTime":{"wallTime":"0"},"version":"1","privileges":{"users":[{"userProto":"admin","privileges":"2048","withGrantOption":"2048"},{"userProto":"root","privileges":"2048","withGrantOption":"2048"}],"ownerProto":"node","version":3},"systemDatabaseSchemaVersion":{"majorVal":1000025,"minorVal":1,"internal":4}}}
{"table":{"name":"eventlog","id":12,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"timestamp","id":1,"type":{"family":"TimestampFamily","oid":1114}},{"name":"eventType","id":2,"type":{"family":"StringFamily","oid":25}},{"name":"targetID","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"reportingID","id":4,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"info","id":5,"type":{"family":"StringFamily","oid":25},"nullable":true},{"name":"uniqueID","id":6,"type":{"family":"BytesFamily","oid":17},"defaultExpr":"uuid_v4()"}],"nextColumnId":7,"families":[{"name":"primary","columnNames":["timestamp","uniqueID"],"columnIds":[1,6]},{"name":"fam_2_eventType","id":2,"columnNames":["eventType"],"columnIds":[2],"defaultColumnId":2},{"name":"fam_3_targetID","id":3,"columnNames":["targetID"],"columnIds":[3],"defaultColumnId":3},{"name":"fam_4_reportingID","id":4,"columnNames":["reportingID"],"columnIds":[4],"defaultColumnId":4},{"name":"fam_5_info","id":5,"columnNames":["info"],"columnIds":[5],"defaultColumnId":5}],"nextFamilyId":6,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["timestamp","uniqueID"],"keyColumnDirections":["ASC","ASC"],"storeColumnNames":["eventType","targetID","reportingID","info"],"keyColumnIds":[1,6],"storeColumnIds":[2,3,4,5],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"external_connections","id":53,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"connection_name","id":1,"type":{"family":"StringFamily","oid":25}},{"name":"created","id":2,"type":{"family":"TimestampFamily","oid":1114},"defaultExpr":"now():::TIMESTAMP"},{"name":"updated","id":3,"type":{"family":"TimestampFamily","oid":1114},"defaultExpr":"now():::TIMESTAMP"},{"name":"connection_type","id":4,"type":{"family":"StringFamily","oid":25}},{"name":"connection_details","id":5,"type":{"family":"BytesFamily","oid":17}},{"name":"owner","id":6,"type":{"family":"StringFamily","oid":25}},{"name":"owner_id","id":7,"type":{"family":"OidFamily","oid":26}}],"nextColumnId":8,"families":[{"name":"primary","columnNames":["connection_name","created","updated","connection_type","connection_details","owner","owner_id"],"columnIds":[1,2,3,4,5,6,7]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["connection_name"],"keyColumnDirections":["ASC"],"storeColumnNames":["created","updated","connection_type","connection_details","owner","owner_id"],"keyColumnIds":[1],"storeColumnIds":[2,3,4,5,6,7],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"480","withGrantOption":"480"},{"userProto":"root","privileges":"480","withGrantOption":"480"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":2}}
{"table":{"name":"protected_ts_meta","id":31,"version":"1","modificationTime":{},"parentId":1,"unexposedParentSchemaId":29,"columns":[{"name":"singleton","id":1,"type":{"oid":16},"defaultExpr":"true"},{"name":"version","id":2,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"num_records","id":3,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"num_spans","id":4,"type":{"family":"IntFamily","width":64,"oid":20}},{"name":"total_bytes","id":5,"type":{"family":"IntFamily","width":64,"oid":20}}],"nextColumnId":6,"families":[{"name":"primary","columnNames":["singleton","version","num_records","num_spans","total_bytes"],"columnIds":[1,2,3,4,5]}],"nextFamilyId":1,"primaryIndex":{"name":"primary","id":1,"unique":true,"version":4,"keyColumnNames":["singleton"],"keyColumnDirections":["ASC"],"storeColumnNames":["version","num_records","num_spans","total_bytes"],"keyColumnIds":[1],"storeColumnIds":[2,3,4,5],"foreignKey":{},"interleave":{},"partitioning":{},"encodingType":1,"sharded":{},"geoConfig":{},"constraintId":1,"vecConfig":{}},"nextIndexId":2,"privileges":{"users":[{"userProto":"admin","privileges":"32","withGrantOption":"32"},{"userProto":"root","privileges":"32","withGrantOption":"32"}],"ownerProto":"node","version":3},"nextMutationId":1,"formatVersion":3,"checks":[{"expr":"singleton","name":"check_singleton","columnIds":[1],"constraintId":2}],"replacementOf":{"time":{}},"createAsOfTime":{},"nextConstraintId":3}}
diff --git a/pkg/sql/logictest/testdata/logic_test/crdb_internal_catalog b/pkg/sql/logictest/testdata/logic_test/crdb_internal_catalog
index d8d2a4e770e7..27f752090b47 100644
--- a/pkg/sql/logictest/testdata/logic_test/crdb_internal_catalog
+++ b/pkg/sql/logictest/testdata/logic_test/crdb_internal_catalog
@@ -110,7 +110,7 @@ skipif config local-mixed-24.3 local-mixed-25.1
query IT
SELECT id, strip_volatile(descriptor) FROM crdb_internal.kv_catalog_descriptor WHERE id IN (1, 2, 3, 29, 4294966962) OR (id > 100 and id < 200) ORDER BY id
----
-1 {"database": {"id": 1, "name": "system", "privileges": {"ownerProto": "node", "users": [{"privileges": "2048", "userProto": "admin", "withGrantOption": "2048"}, {"privileges": "2048", "userProto": "root", "withGrantOption": "2048"}], "version": 3}, "systemDatabaseSchemaVersion": {"internal": 2, "majorVal": 1000025, "minorVal": 1}, "version": "1"}}
+1 {"database": {"id": 1, "name": "system", "privileges": {"ownerProto": "node", "users": [{"privileges": "2048", "userProto": "admin", "withGrantOption": "2048"}, {"privileges": "2048", "userProto": "root", "withGrantOption": "2048"}], "version": 3}, "systemDatabaseSchemaVersion": {"internal": 4, "majorVal": 1000025, "minorVal": 1}, "version": "1"}}
3 {"table": {"columns": [{"id": 1, "name": "id", "type": {"family": "IntFamily", "oid": 20, "width": 64}}, {"id": 2, "name": "descriptor", "nullable": true, "type": {"family": "BytesFamily", "oid": 17}}], "formatVersion": 3, "id": 3, "name": "descriptor", "nextColumnId": 3, "nextConstraintId": 2, "nextIndexId": 2, "nextMutationId": 1, "parentId": 1, "primaryIndex": {"constraintId": 1, "encodingType": 1, "foreignKey": {}, "geoConfig": {}, "id": 1, "interleave": {}, "keyColumnDirections": ["ASC"], "keyColumnIds": [1], "keyColumnNames": ["id"], "name": "primary", "partitioning": {}, "sharded": {}, "storeColumnIds": [2], "storeColumnNames": ["descriptor"], "unique": true, "vecConfig": {}, "version": 4}, "privileges": {"ownerProto": "node", "users": [{"privileges": "32", "userProto": "admin", "withGrantOption": "32"}, {"privileges": "32", "userProto": "root", "withGrantOption": "32"}], "version": 3}, "replacementOf": {"time": {}}, "unexposedParentSchemaId": 29, "version": "1"}}
29 {"schema": {"defaultPrivileges": {"type": "SCHEMA"}, "id": 29, "name": "public", "privileges": {"ownerProto": "node", "users": [{"privileges": "2", "userProto": "admin", "withGrantOption": "2"}, {"privileges": "516", "userProto": "public"}, {"privileges": "2", "userProto": "root", "withGrantOption": "2"}], "version": 3}, "version": "1"}}
101 {"schema": {"id": 101, "name": "public", "parentId": 100, "privileges": {"ownerProto": "root", "users": [{"privileges": "2", "userProto": "admin", "withGrantOption": "2"}, {"privileges": "516", "userProto": "public"}, {"privileges": "2", "userProto": "root", "withGrantOption": "2"}], "version": 3}, "version": "1"}}
diff --git a/pkg/sql/sqlstats/sqlactivityjob/BUILD.bazel b/pkg/sql/sqlstats/sqlactivityjob/BUILD.bazel
new file mode 100644
index 000000000000..e1c6a25faab7
--- /dev/null
+++ b/pkg/sql/sqlstats/sqlactivityjob/BUILD.bazel
@@ -0,0 +1,15 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+ name = "sqlactivityjob",
+ srcs = ["sql_activity_flush_job.go"],
+ importpath = "github.com/cockroachdb/cockroach/pkg/sql/sqlstats/sqlactivityjob",
+ visibility = ["//visibility:public"],
+ deps = [
+ "//pkg/jobs",
+ "//pkg/jobs/jobspb",
+ "//pkg/settings/cluster",
+ "//pkg/util/log",
+ "@com_github_cockroachdb_errors//:errors",
+ ],
+)
diff --git a/pkg/sql/sqlstats/sqlactivityjob/sql_activity_flush_job.go b/pkg/sql/sqlstats/sqlactivityjob/sql_activity_flush_job.go
new file mode 100644
index 000000000000..da600f42e91a
--- /dev/null
+++ b/pkg/sql/sqlstats/sqlactivityjob/sql_activity_flush_job.go
@@ -0,0 +1,55 @@
+// Copyright 2025 The Cockroach Authors.
+//
+// Use of this software is governed by the CockroachDB Software License
+// included in the /LICENSE file.
+
+package sqlactivityjob
+
+import (
+ "context"
+
+ "github.com/cockroachdb/cockroach/pkg/jobs"
+ "github.com/cockroachdb/cockroach/pkg/jobs/jobspb"
+ "github.com/cockroachdb/cockroach/pkg/settings/cluster"
+ "github.com/cockroachdb/cockroach/pkg/util/log"
+ "github.com/cockroachdb/errors"
+)
+
+type sqlActivityFlushJob struct {
+ job *jobs.Job
+}
+
+var _ jobs.Resumer = &sqlActivityFlushJob{}
+
+// Resume implements the jobs.Resumer interface.
+func (j *sqlActivityFlushJob) Resume(ctx context.Context, execCtxI interface{}) (jobErr error) {
+ // TODO(kyle.wong): implement job
+ return nil
+}
+
+// OnFailOrCancel implements the jobs.Resumer interface.
+func (r *sqlActivityFlushJob) OnFailOrCancel(
+ ctx context.Context, _ interface{}, jobErr error,
+) error {
+ if jobs.HasErrJobCanceled(jobErr) {
+ err := errors.NewAssertionErrorWithWrappedErrf(jobErr,
+ "sql activity is not cancelable")
+ log.Errorf(ctx, "%v", err)
+ }
+ return nil
+}
+
+// CollectProfile implements the jobs.Resumer interface.
+func (r *sqlActivityFlushJob) CollectProfile(_ context.Context, _ interface{}) error {
+ return nil
+}
+
+func init() {
+ jobs.RegisterConstructor(
+ jobspb.TypeSQLActivityFlush,
+ func(job *jobs.Job, settings *cluster.Settings) jobs.Resumer {
+ return &sqlActivityFlushJob{job: job}
+ },
+ jobs.DisablesTenantCostControl,
+ )
+}
diff --git a/pkg/upgrade/upgradebase/testing_knobs.go b/pkg/upgrade/upgradebase/testing_knobs.go
index 48bc4d55466a..2b23178e27fa 100644
--- a/pkg/upgrade/upgradebase/testing_knobs.go
+++ b/pkg/upgrade/upgradebase/testing_knobs.go
@@ -71,6 +71,8 @@ type TestingKnobs struct {
SkipUpdateTableMetadataCacheBootstrap bool
+ SkipSqlActivityFlushJobBootstrap bool
+
// ForceCheckLicenseViolation is true if we want the v24_3_check_license_violation.go
// task to continue even though we are in a test environment.
ForceCheckLicenseViolation bool
diff --git a/pkg/upgrade/upgrades/BUILD.bazel b/pkg/upgrade/upgrades/BUILD.bazel
index b2f252cd8417..c68b4dab551d 100644
--- a/pkg/upgrade/upgrades/BUILD.bazel
+++ b/pkg/upgrade/upgrades/BUILD.bazel
@@ -6,6 +6,7 @@ go_library(
"descriptor_utils.go",
"first_upgrade.go",
"permanent_create_jobs_metrics_polling_job.go",
+ "permanent_create_sql_activity_flush_job.go",
"permanent_create_update_table_metadata_cache_job.go",
"permanent_key_visualizer_migration.go",
"permanent_maybe_setup_pcr_reader.go",
@@ -17,6 +18,7 @@ go_library(
"upgrades.go",
"v25_1_add_jobs_tables.go",
"v25_1_prepared_transactions_table.go",
+ "v25_2_add_sql_activity_flush_job.go",
],
importpath = "github.com/cockroachdb/cockroach/pkg/upgrade/upgrades",
visibility = ["//visibility:public"],
@@ -48,6 +50,7 @@ go_library(
"//pkg/sql/isql",
"//pkg/sql/sem/tree",
"//pkg/sql/sessiondata",
+ "//pkg/sql/sqlstats/sqlactivityjob",
"//pkg/sql/tablemetadatacache",
"//pkg/upgrade",
"//pkg/upgrade/upgradebase",
@@ -72,6 +75,7 @@ go_test(
"helpers_test.go",
"main_test.go",
"permanent_create_jobs_metrics_polling_job_test.go",
+ "permanent_create_sql_activity_flush_job_test.go",
"permanent_mvcc_statistics_migration_test.go",
"permanent_sql_stats_ttl_test.go",
"permanent_system_activity_update_job_test.go",
diff --git a/pkg/upgrade/upgrades/permanent_create_sql_activity_flush_job.go b/pkg/upgrade/upgrades/permanent_create_sql_activity_flush_job.go
new file mode 100644
index 000000000000..36a9ae8edd6a
--- /dev/null
+++ b/pkg/upgrade/upgrades/permanent_create_sql_activity_flush_job.go
@@ -0,0 +1,39 @@
+// Copyright 2024 The Cockroach Authors.
+//
+// Use of this software is governed by the CockroachDB Software License
+// included in the /LICENSE file.
+
+package upgrades
+
+import (
+ "context"
+
+ "github.com/cockroachdb/cockroach/pkg/clusterversion"
+ "github.com/cockroachdb/cockroach/pkg/jobs"
+ "github.com/cockroachdb/cockroach/pkg/jobs/jobspb"
+ "github.com/cockroachdb/cockroach/pkg/security/username"
+ "github.com/cockroachdb/cockroach/pkg/sql/isql"
+ _ "github.com/cockroachdb/cockroach/pkg/sql/sqlstats/sqlactivityjob" // Ensure job implementation is linked.
+ "github.com/cockroachdb/cockroach/pkg/upgrade"
+)
+
+func createSqlActivityFlushJob(
+ ctx context.Context, _ clusterversion.ClusterVersion, d upgrade.TenantDeps,
+) error {
+ if d.TestingKnobs != nil && d.TestingKnobs.SkipSqlActivityFlushJobBootstrap {
+ return nil
+ }
+
+ return d.DB.Txn(ctx, func(ctx context.Context, txn isql.Txn) error {
+ jr := jobs.Record{
+ JobID: jobs.SqlActivityFlushJobID,
+ Description: jobspb.TypeSQLActivityFlush.String(),
+ Details: jobspb.SqlActivityFlushDetails{},
+ Progress: jobspb.SqlActivityFlushProgress{},
+ CreatedBy: &jobs.CreatedByInfo{Name: username.NodeUser, ID: username.NodeUserID},
+ Username: username.NodeUserName(),
+ NonCancelable: true,
+ }
+ return d.JobRegistry.CreateIfNotExistAdoptableJobWithTxn(ctx, jr, txn)
+ })
+}
diff --git a/pkg/upgrade/upgrades/permanent_create_sql_activity_flush_job_test.go b/pkg/upgrade/upgrades/permanent_create_sql_activity_flush_job_test.go
new file mode 100644
index 000000000000..3aaac8fe6357
--- /dev/null
+++ b/pkg/upgrade/upgrades/permanent_create_sql_activity_flush_job_test.go
@@ -0,0 +1,37 @@
+// Copyright 2025 The Cockroach Authors.
+//
+// Use of this software is governed by the CockroachDB Software License
+// included in the /LICENSE file.
+
+package upgrades
+
+import (
+ "context"
+ "fmt"
+ "testing"
+
+ "github.com/cockroachdb/cockroach/pkg/base"
+ "github.com/cockroachdb/cockroach/pkg/jobs"
+ "github.com/cockroachdb/cockroach/pkg/testutils/serverutils"
+ "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils"
+ "github.com/cockroachdb/cockroach/pkg/util/leaktest"
+ "github.com/cockroachdb/cockroach/pkg/util/log"
+ "github.com/stretchr/testify/require"
+)
+
+func TestCreateSqlStatsFlushJob(t *testing.T) {
+ defer leaktest.AfterTest(t)()
+ defer log.Scope(t).Close(t)
+
+ ctx := context.Background()
+ ts, db, _ := serverutils.StartServer(t, base.TestServerArgs{})
+ defer ts.Stopper().Stop(ctx)
+ conn := sqlutils.MakeSQLRunner(db)
+
+ row := conn.QueryRow(t,
+ fmt.Sprintf("SELECT count(*) FROM system.public.jobs WHERE id = %d", jobs.SqlActivityFlushJobID))
+ require.NotNil(t, row)
+ var count int
+ row.Scan(&count)
+ require.Equal(t, 1, count)
+}
diff --git a/pkg/upgrade/upgrades/permanent_upgrades.go b/pkg/upgrade/upgrades/permanent_upgrades.go
index 1eab368bb191..9d3e18db7749 100644
--- a/pkg/upgrade/upgrades/permanent_upgrades.go
+++ b/pkg/upgrade/upgrades/permanent_upgrades.go
@@ -72,6 +72,7 @@ func bootstrapCluster(
{"create mvcc stats job", createMVCCStatisticsJob},
{"create update cached table metadata job", createUpdateTableMetadataCacheJob},
{"maybe initialize replication standby read-only catalog", maybeSetupPCRStandbyReader},
+ {"create sql activity flush job", createSqlActivityFlushJob},
} {
log.Infof(ctx, "executing bootstrap step %q", u.name)
if err := u.fn(ctx, cv, deps); err != nil {
diff --git a/pkg/upgrade/upgrades/upgrades.go b/pkg/upgrade/upgrades/upgrades.go
index 5116f546e7be..f0cc715c64d8 100644
--- a/pkg/upgrade/upgrades/upgrades.go
+++ b/pkg/upgrade/upgrades/upgrades.go
@@ -93,6 +93,14 @@ var upgrades = []upgradebase.Upgrade{
newFirstUpgrade(clusterversion.V25_2_Start.Version()),
+ upgrade.NewTenantUpgrade(
+ "add new sql activity flush job",
+ clusterversion.V25_2_AddSqlActivityFlushJob.Version(),
+ upgrade.NoPrecondition,
+ addSqlActivityFlushJob,
+ upgrade.RestoreActionNotRequired("cluster restore does not restore this job"),
+ ),
+
// Note: when starting a new release version, the first upgrade (for
// Vxy_zStart) must be a newFirstUpgrade. Keep this comment at the bottom.
}
diff --git a/pkg/upgrade/upgrades/v25_2_add_sql_activity_flush_job.go b/pkg/upgrade/upgrades/v25_2_add_sql_activity_flush_job.go
new file mode 100644
index 000000000000..6438d34d5667
--- /dev/null
+++ b/pkg/upgrade/upgrades/v25_2_add_sql_activity_flush_job.go
@@ -0,0 +1,23 @@
+// Copyright 2025 The Cockroach Authors.
+//
+// Use of this software is governed by the CockroachDB Software License
+// included in the /LICENSE file.
+
+package upgrades
+
+import (
+ "context"
+
+ "github.com/cockroachdb/cockroach/pkg/clusterversion"
+ "github.com/cockroachdb/cockroach/pkg/upgrade"
+)
+
+// addSqlActivityFlushJob creates the sql stats flush job.
+func addSqlActivityFlushJob(
+ ctx context.Context, version clusterversion.ClusterVersion, d upgrade.TenantDeps,
+) error {
+ if err := createSqlActivityFlushJob(ctx, version, d); err != nil {
+ return err
+ }
+ return nil
+}