如何避免postgresql检查某个chunk

问题描述 投票:0回答:1

这听起来很奇怪,但我想解决问题而不修复丢失或损坏的块。

我不维护数据库,所以我对它的理解有点模糊。但据我了解,旧块存档在 NAS 上,而不是存储在生产 SSD 上。因此,由于磁盘磨损和操作速度较慢,不希望/不希望有任何功能来检查这些旧块上的数据。

这将导致在一个时间范围内修复或限制一堆功能。 虽然我知道必须修复此类错误,但我也希望避免由于功能不需要的块而导致我的功能被破坏。

更大的问题是我试图理解为什么它试图寻找不应该的地方以及如何限制它。

时间以毫秒为单位存储为纪元。

我得到的错误是:

错误:无法打开文件“pg_tblspc/16400/PG_14_202107181/17549/134380077”:没有这样的文件或目录 上下文:PL/pgSQL 分配“temperatura := (SELECT value FROM kepware_messages WHERE tag_id = 94824 AND "timestamp" >= timestamp_from - 1209600000 AND "timestamp" <= item.timestamp ORDER BY "timestamp" DESC LIMIT 1)" PL/pgSQL function cto_pec(bigint,bigint) line 28 at assignment

- 1209600000 是将时间范围限制为所选时间范围之前的 2 周。 如果我尝试通过选择句子在该时间范围内查找,则丢失的文件不在该时间范围内。

剧本:

CREATE OR REPLACE FUNCTION CTO_pec(timestamp_from bigint, timestamp_to bigint)
    RETURNS TABLE (cas bigint, ciljna_temp decimal) AS $$
DECLARE
    temperatura decimal;
    item record;
    last_item_temperatura decimal;
BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS myTempTable(
        time bigint,  
        ciljna_temp decimal
    );

    -- UNION to draw line on graph from start of graph
    FOR item IN
        (SELECT CAST(value AS integer), timestamp FROM kepware_messages WHERE tag_id = 94828 AND timestamp >= timestamp_from AND timestamp <= timestamp_to UNION
        (SELECT CAST(value AS integer), timestamp_from  AS "timestamp" FROM kepware_messages WHERE tag_id = 94828 AND
        timestamp >= timestamp_from - 1209600000  AND timestamp <= timestamp_from  ORDER BY "timestamp" DESC LIMIT 1))
    LOOP
        CASE item.value
            WHEN 1 THEN
                temperatura := (SELECT value FROM kepware_messages WHERE tag_id = 94816 AND "timestamp" >= timestamp_from - 1209600000 AND "timestamp" <= item.timestamp  ORDER BY "timestamp" DESC LIMIT 1);
            WHEN 2 THEN
                temperatura := (SELECT value FROM kepware_messages WHERE tag_id = 94818 AND "timestamp" >= timestamp_from - 1209600000 AND "timestamp" <= item.timestamp  ORDER BY "timestamp" DESC LIMIT 1);
            WHEN 3 THEN
                temperatura := (SELECT value FROM kepware_messages WHERE tag_id = 94820 AND "timestamp" >= timestamp_from - 1209600000 AND "timestamp" <= item.timestamp  ORDER BY "timestamp" DESC LIMIT 1);
            WHEN 4 THEN
                temperatura := (SELECT value FROM kepware_messages WHERE tag_id = 94822 AND "timestamp" >= timestamp_from - 1209600000 AND "timestamp" <= item.timestamp  ORDER BY "timestamp" DESC LIMIT 1);
            WHEN 5 THEN
                temperatura := (SELECT value FROM kepware_messages WHERE tag_id = 94824 AND "timestamp" >= timestamp_from - 1209600000 AND "timestamp" <= item.timestamp  ORDER BY "timestamp" DESC LIMIT 1);
            WHEN 6 THEN
                temperatura := (SELECT value FROM kepware_messages WHERE tag_id = 94826 AND "timestamp" >= timestamp_from - 1209600000 AND "timestamp" <= item.timestamp  ORDER BY "timestamp" DESC LIMIT 1);
        END CASE;

        last_item_temperatura := temperatura;
        INSERT INTO myTempTable VALUES (item.timestamp, temperatura);
    END LOOP;

    INSERT INTO myTempTable VALUES (timestamp_to, last_item_temperatura);
   
    RETURN QUERY SELECT * FROM myTempTable;
    DROP TABLE IF EXISTS myTempTable;
END;
$$ LANGUAGE plpgsql;

尽管以下脚本在联合中运行在相同的时间范围内但工作正常:

CREATE OR REPLACE FUNCTION CTO_pec(timestamp_from bigint, timestamp_to bigint)
    RETURNS TABLE (cas bigint, ciljna_temp decimal) AS $$
DECLARE
    temperatura decimal;
    item record;
    last_item_temperatura decimal;
BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS myTempTable(
        time bigint,  
        ciljna_temp decimal
    );

    -- UNION to draw line on graph from start of graph
    FOR item IN
        (SELECT CAST(value AS integer), timestamp FROM kepware_messages WHERE tag_id = 94828 AND timestamp >= timestamp_from AND timestamp <= timestamp_to UNION
        (SELECT CAST(value AS integer), timestamp_from  AS "timestamp" FROM kepware_messages WHERE tag_id = 94828 AND
        timestamp >= timestamp_from - 1209600000  AND timestamp <= timestamp_from  ORDER BY "timestamp" DESC LIMIT 1))
    LOOP
        last_item_temperatura := item.value;
        INSERT INTO myTempTable VALUES (item.timestamp, item.value);
        RAISE NOTICE '%, %', item.value, item.timestamp;
    END LOOP;

    INSERT INTO myTempTable VALUES (timestamp_to, last_item_temperatura);
   
    RETURN QUERY SELECT * FROM myTempTable;
    DROP TABLE IF EXISTS myTempTable;
END;
$$ LANGUAGE plpgsql;
postgresql
1个回答
0
投票

你无法避免这个错误。如果表或索引后面的文件丢失,您将收到错误消息。

不过,您可以选择忽略客户端的错误。

我不认为将数据保存在会破坏它们的存储中有何意义。不可靠的数据将给出不可靠的查询结果。您不妨随机生成结果。

© www.soinside.com 2019 - 2024. All rights reserved.