dalsi fixly
This commit is contained in:
@@ -1,7 +1,88 @@
|
|||||||
-- OTE import (fn_ote_import_from_json) používá ON CONFLICT (market_source, interval_start).
|
-- OTE import (fn_ote_import_from_json) používá ON CONFLICT (market_source, interval_start).
|
||||||
-- Bez odpovídajícího UNIQUE/PK PostgreSQL hlásí:
|
-- Bez PK PostgreSQL hlásí chybu o ON CONFLICT.
|
||||||
-- "there is no unique or exclusion constraint matching the ON CONFLICT specification"
|
--
|
||||||
-- Některé instalace (ruční DB, nestandardní pořadí migrací, restore) mohly zůstat bez PK.
|
-- Na TimescaleDB hypertable může ALTER TABLE … ADD PRIMARY KEY selhat s:
|
||||||
|
-- ERROR: chunk not found … _timescaledb_internal._hyper_*_chunk
|
||||||
|
-- když v _timescaledb_catalog.chunk zůstaly řádky pro child tabulky, které fyzicky neexistují
|
||||||
|
-- (časté po pg_restore s paralelizací -j nebo neúplné obnově; viz timescale/timescaledb#4101).
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION ems._repair_ts_orphan_chunk_rows(
|
||||||
|
p_namespace name,
|
||||||
|
p_rel name
|
||||||
|
)
|
||||||
|
RETURNS integer
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
SECURITY DEFINER
|
||||||
|
SET search_path = pg_catalog, public
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
hid integer;
|
||||||
|
chunk_ids integer[];
|
||||||
|
n integer;
|
||||||
|
BEGIN
|
||||||
|
SELECT h.id
|
||||||
|
INTO hid
|
||||||
|
FROM _timescaledb_catalog.hypertable h
|
||||||
|
WHERE h.schema_name = p_namespace
|
||||||
|
AND h.table_name = p_rel;
|
||||||
|
|
||||||
|
IF hid IS NULL THEN
|
||||||
|
RETURN 0;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM pg_proc p
|
||||||
|
JOIN pg_namespace n ON n.oid = p.pronamespace
|
||||||
|
WHERE n.nspname = '_timescaledb_functions'
|
||||||
|
AND p.proname = 'remove_dropped_chunk_metadata'
|
||||||
|
) THEN
|
||||||
|
PERFORM _timescaledb_functions.remove_dropped_chunk_metadata(hid);
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT coalesce(array_agg(c.id ORDER BY c.id), ARRAY[]::integer[])
|
||||||
|
INTO chunk_ids
|
||||||
|
FROM _timescaledb_catalog.chunk c
|
||||||
|
WHERE c.hypertable_id = hid
|
||||||
|
AND NOT c.dropped
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM pg_catalog.pg_class cl
|
||||||
|
JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
|
||||||
|
WHERE ns.nspname = c.schema_name
|
||||||
|
AND cl.relname = c.table_name
|
||||||
|
);
|
||||||
|
|
||||||
|
n := coalesce(array_length(chunk_ids, 1), 0);
|
||||||
|
IF n = 0 THEN
|
||||||
|
RETURN 0;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
UPDATE _timescaledb_catalog.chunk ch
|
||||||
|
SET compressed_chunk_id = NULL
|
||||||
|
WHERE ch.compressed_chunk_id = ANY (chunk_ids);
|
||||||
|
|
||||||
|
DELETE FROM _timescaledb_catalog.compression_chunk_size cs
|
||||||
|
WHERE cs.chunk_id = ANY (chunk_ids)
|
||||||
|
OR cs.compressed_chunk_id = ANY (chunk_ids);
|
||||||
|
|
||||||
|
DELETE FROM _timescaledb_catalog.chunk_constraint cc
|
||||||
|
WHERE cc.chunk_id = ANY (chunk_ids);
|
||||||
|
|
||||||
|
DELETE FROM _timescaledb_catalog.chunk_column_stats ccs
|
||||||
|
WHERE ccs.chunk_id = ANY (chunk_ids);
|
||||||
|
|
||||||
|
DELETE FROM _timescaledb_internal.bgw_policy_chunk_stats b
|
||||||
|
WHERE b.chunk_id = ANY (chunk_ids);
|
||||||
|
|
||||||
|
DELETE FROM _timescaledb_catalog.chunk c
|
||||||
|
WHERE c.id = ANY (chunk_ids);
|
||||||
|
|
||||||
|
RETURN n;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
SELECT ems._repair_ts_orphan_chunk_rows('ems', 'market_interval_price');
|
||||||
|
|
||||||
DO $$
|
DO $$
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -25,3 +106,5 @@ BEGIN
|
|||||||
ADD CONSTRAINT market_interval_price_pkey PRIMARY KEY (market_source, interval_start);
|
ADD CONSTRAINT market_interval_price_pkey PRIMARY KEY (market_source, interval_start);
|
||||||
END IF;
|
END IF;
|
||||||
END $$;
|
END $$;
|
||||||
|
|
||||||
|
-- Funkci znovu použije V033 pro telemetrické hypertably; drop až tam.
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
-- telemetry_collector: INSERT … ON CONFLICT vyžaduje UNIQUE/PK odpovídající cíli konfliktu.
|
-- telemetry_collector: INSERT … ON CONFLICT vyžaduje UNIQUE/PK odpovídající cíli konfliktu.
|
||||||
-- Stejná třída problému jako u market_interval_price (V032): DB bez primárních klíčů z V001.
|
-- Stejná třída problému jako u market_interval_price (V032): DB bez primárních klíčů z V001.
|
||||||
|
-- Před ADD PK na hypertable voláme opravu katalogu chunků z V032 (funkce vytvořená tam).
|
||||||
|
|
||||||
|
SELECT ems._repair_ts_orphan_chunk_rows('ems', 'telemetry_inverter');
|
||||||
|
|
||||||
DO $$
|
DO $$
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -18,6 +21,8 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
END $$;
|
END $$;
|
||||||
|
|
||||||
|
SELECT ems._repair_ts_orphan_chunk_rows('ems', 'telemetry_ev_charger');
|
||||||
|
|
||||||
DO $$
|
DO $$
|
||||||
BEGIN
|
BEGIN
|
||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
@@ -35,6 +40,8 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
END $$;
|
END $$;
|
||||||
|
|
||||||
|
SELECT ems._repair_ts_orphan_chunk_rows('ems', 'telemetry_heat_pump');
|
||||||
|
|
||||||
DO $$
|
DO $$
|
||||||
BEGIN
|
BEGIN
|
||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
@@ -56,3 +63,5 @@ END $$;
|
|||||||
CREATE UNIQUE INDEX IF NOT EXISTS uidx_ev_session_charger_open
|
CREATE UNIQUE INDEX IF NOT EXISTS uidx_ev_session_charger_open
|
||||||
ON ems.ev_session (charger_id)
|
ON ems.ev_session (charger_id)
|
||||||
WHERE session_end IS NULL;
|
WHERE session_end IS NULL;
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS ems._repair_ts_orphan_chunk_rows(name, name);
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
# Poznámky:
|
# Poznámky:
|
||||||
# - Záloha musí být z podobného stacku (Postgres 16 + Timescale). Jiná major verze může selhat.
|
# - Záloha musí být z podobného stacku (Postgres 16 + Timescale). Jiná major verze může selhat.
|
||||||
# - Dump by měl obsahovat i Flyway metadata (tabulku historie), jinak při dalším startu Flyway znovu spustí migrace a může spadnout.
|
# - Dump by měl obsahovat i Flyway metadata (tabulku historie), jinak při dalším startu Flyway znovu spustí migrace a může spadnout.
|
||||||
|
# - TimescaleDB: u pg_restore nepoužívejte paralelizaci (-j); může zůstat nekonzistentní katalog chunků
|
||||||
|
# (chyba „chunk not found“ / selhání ADD PK na hypertable). Viz dokumentace Timescale backup/restore.
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user