Re: PL/pgSQL question about EXCEPTION clause & corrupt records
От | Achilleas Mantzios |
---|---|
Тема | Re: PL/pgSQL question about EXCEPTION clause & corrupt records |
Дата | |
Msg-id | e6e294b0-ef53-8315-e757-88241621b902@matrix.gatewaynet.com обсуждение исходный текст |
Ответ на | PL/pgSQL question about EXCEPTION clause & corrupt records ("Nick Renders" <postgres@arcict.com>) |
Список | pgsql-general |
On 14/2/20 2:39 μ.μ., Nick Renders wrote: > > Hello, > > We recently suffered a database crash which resulted in some corrupt records. > > I thought I would write a little PL script that would loop through all the data and report any inconsistencies. However,I can't get it to work properly. > > For instance, if I run the following statement in pgAdmin: > > SELECT * FROM f_gsxws_transaction WHERE gwta_number = 762513 > > I get the following message: > > ERROR: missing chunk number 0 for toast value 8289525 in pg_toast_5572299 > > > So, as a test, I created a function that would just retrieve that one record: > > DECLARE > rcontent f_gsxws_transaction%ROWTYPE; > BEGIN > SELECT * INTO rcontent FROM f_gsxws_transaction where gwta_number = 762513; > RETURN rcontent; > EXCEPTION WHEN OTHERS THEN > RAISE NOTICE 'Record 762513 is corrupt'; > END; > > > Now, when I run this function, I have noticed two things: > > 1) The function has no problem executing the SELECT statement. It is only when "rcontents" is returned, that the functionfails. This is a problem, because the ultimate goal is to loop through all > records and only return/alert something in case of an error. > > 2) The function never enters the EXCEPTION clause. Instead, when it hits the RETURN command, it breaks and shows the samemessage as in pgAdmin: missing chunk number 0 for toast value 8289525 in > pg_toast_5572299. Does the table have any PKs or UKs? do something like FOR vid IN SELECT <somepkid> FROM f_gsxws_transaction where gwta_number = 762513 ORDER BY <somepkid> LOOP RAISE NOTICE 'examining row with <somepkid>= %',vid; select * into rcontent FROM f_gsxws_transaction where <somepkid> = vid; RAISE NOTICE 'content of row <somepkid>= % , is % ',vid,rcontent; END LOOP; > > > Is it possible to check for these kind of errors with a PL script? Or is there perhaps a better way to check for corruptrecords in a database? > > Best regards, > > Nick Renders > > -- Achilleas Mantzios IT DEV Lead IT DEPT Dynacom Tankers Mgmt
В списке pgsql-general по дате отправления: