43 lines
1.1 KiB
PL/PgSQL
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;
|
|
$$;
|