当一台服务器不可用时如何克服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问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PremiumV2 不可用时将应用程序服务从 PremiumV2 扩展到 PremiumV3

Oracle中DBLink的使用

当数据库不可用时如何使 sqlplus 退出?

当源代码不可用时,有啥好的分析工具可以使用?

导入文件不可用时如何避免崩溃?..IOS 7

允许用户在 iCloud 不可用时编辑/查看现有文档