pg-recover/pg-recover.sql
2025-01-11 16:20:07 -05:00

43 lines
1.1 KiB
PL/PgSQL

CREATE OR REPLACE PROCEDURE pg_recover_proc()
LANGUAGE plpgsql AS $$
DECLARE
cnt BIGINT := 0;
BEGIN
-- Get the maximum page_view_id from the page_views table
cnt := (SELECT MAX(pgr_primary_key) FROM pgr_table);
pgr_start_at
-- Loop through the page_views table in reverse order by page_view_id
LOOP
pgr_skips
BEGIN
-- Insert the row with the current page_view_id into page_views2
INSERT INTO pgr_table_recovery
SELECT * FROM pgr_table WHERE pgr_primary_key = cnt and pgr_nonnull_col is not null;
-- Decrement the counter
cnt := cnt - 1;
-- Exit the loop when cnt < 1
EXIT WHEN cnt < 1;
EXCEPTION
WHEN OTHERS THEN
-- Handle exceptions (e.g., data corruption)
IF POSITION('block' in SQLERRM) > 0 OR POSITION('status of transaction' in SQLERRM) > 0 OR POSITION('memory alloc' in SQLERRM) > 0 OR POSITION('data is corrupt' in SQLERRM) > 0 OR POSITION('MultiXactId' in SQLERRM) > 0 THEN
RAISE WARNING 'PGR_SKIP: %', cnt;
cnt := cnt - 1;
CONTINUE;
ELSE
RAISE;
END IF;
END;
IF MOD(cnt, pgr_commit_size) = 0 THEN
RAISE WARNING 'PGR_COMMIT: %', cnt;
COMMIT;
END IF;
END LOOP;
END;
$$;