当一台服务器不可用时如何克服dblink问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当一台服务器不可用时如何克服dblink问题相关的知识,希望对你有一定的参考价值。
我创建这样的视图
CREATE view zaliha as
SELECT * FROM public.dblink
('meteor','SELECT z.skladiste,ar.sifra,z.velicina,z.kolicina,z.rezervacija,z.kolicina - z.rezervacija
as raspolozivo
from zaliha z, artikli ar
where ar.id=z.artikal
and (kolicina <> 0 or kolicina <> 0)')
AS DATA(skladiste CHARACTER VARYING, sifra CHARACTER VARYING, velicina CHARACTER VARYING, kolicina NUMERIC,
rezervacija NUMERIC, raspolozivo NUMERIC)
union
SELECT * FROM public.dblink
('dorcol','SELECT z.skladiste,ar.sifra,z.velicina,z.kolicina,z.rezervacija,z.kolicina - z.rezervacija
as raspolozivo
from zaliha z, artikli ar
where ar.id=z.artikal
and (kolicina <> 0 or kolicina <> 0)')
AS DATA(skladiste CHARACTER VARYING, sifra CHARACTER VARYING, velicina CHARACTER VARYING, kolicina NUMERIC,
rezervacija NUMERIC, raspolozivo NUMERIC)
union
SELECT * FROM public.dblink
('uzice','SELECT z.skladiste,ar.sifra,z.velicina,z.kolicina,z.rezervacija,z.kolicina - z.rezervacija
as raspolozivo
from zaliha z, artikli ar
where ar.id=z.artikal
and (kolicina <> 0 or kolicina <> 0)')
AS DATA(skladiste CHARACTER VARYING, sifra CHARACTER VARYING, velicina CHARACTER VARYING, kolicina NUMERIC,
rezervacija NUMERIC, raspolozivo NUMERIC)
实际上这是3个相同选择的联合,但来自不同的服务器。我需要的是获得所有可用服务器的结果,如果1台服务器出现错误,则排除该结果。例如,服务器流星和dorcol可用,而服务器uzice则不可用,我只想查看流星和dorcol的此视图结果,并排除uzice的错误。
当一台服务器不可用时出现错误:
ERROR: could not establish connection
DETAIL: could not connect to server: Connection timed out
Is the server running on host "x.x.x.x" and accepting
TCP/IP connections on port 5432?
有可能吗?
答案
您无法使用视图执行此操作,但是可以使用设置的返回函数来执行此操作。
为了简单起见,我已将其更改为使用pgbench_branches表。
CREATE OR REPLACE FUNCTION public.fail_tolerant()
RETURNS SETOF pgbench_branches
LANGUAGE plpgsql
AS $function$
declare
connections text[]='{host=127.0.0.1,host=192.168.0.bad}';
conn text;
begin
foreach conn in array connections loop
begin
return query SELECT * FROM public.dblink (conn,'SELECT * from pgbench_branches') AS DATA(bid integer, bbalance integer, filler character(88));
EXCEPTION when others then
RAISE NOTICE 'exception caught';
END;
end loop;
end $function$;
这不具有UNION的重复数据删除功能,因此您需要单独添加:
select distinct * from fail_tolerant();
您可能想要比我在这里做的更好的日志记录。如果有任何连接尝试被拒绝,而不是立即被接受或拒绝,则可能需要很长时间才能完成。因此,您可能需要在每个连接字符串中设置一个connect_timeout。
以上是关于当一台服务器不可用时如何克服dblink问题的主要内容,如果未能解决你的问题,请参考以下文章