【问题标题】:SQL Server to PostgreSQL linked server or best optionSQL Server 到 PostgreSQL 链接服务器或最佳选择
【发布时间】:2020-01-28 20:55:59
【问题描述】:

我搜索了互联网,显然在 SQL Server 2019 的 Linux 版本中,链接服务器只允许在 1 个 SQL Server 到另一个 SQL Server 之间。我需要创建一个从 linux SQL Server 2019 到 postgresql 4.17 的链接服务器,这样我就可以从 SQL Server 查询 PostgreSQL 中的表。

我的 Windows 机器上安装了可以连接的 ODBC 驱动程序,并且我在托管 SQL Server 2019 的 ubuntu 服务器上安装了 odbc 驱动程序。我还可以连接和提取数据并从 SSIS 运行查询。 OPENQUERY、OPENDATASOURCE 和 OPENROWSET 也不起作用。

我不敢相信这是不可能的。任何有关如何执行此操作或最接近的最佳解决方案的建议或想法将不胜感激。

【问题讨论】:

    标签: sql-server postgresql connection odbc


    【解决方案1】:

    编辑

    Linux 版本的 SQL Server 2019 仅支持与其他 SQL Server 的链接服务器连接。

    https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-editions-and-components-2019?view=sql-server-linux-2017

    不幸的是,我建议寻找其他导入数据的方法,例如 BCP 和 SSIS。

    编辑结束

    您的声明:“显然在 SQL Server 2019 的 Linux 版本中,链接服务器只允许在 1 个 SQL Server 到另一个 SQL Server 之间。”您能否链接到 Microsoft 文档中的说明?

    release notes for SQL Server 2019 on Linux 我看到提到链接服务器(没有声明您只能连接到其他 SQL Server)。

    您是否收到了错误消息,或者您能否向我们提供更多信息,说明您已采取哪些步骤以及您已完成故障排除?根据文档,需要一些配置来确保 linux 上的通信:

    涉及来自 sqlservr 的出站 TCP 连接的功能 进程(例如链接服务器或可用性组)可能无法正常工作 如果同时满足以下两个条件:

    目标服务器被指定为主机名而不是 IP 地址。

    源实例在内核中禁用了 IPv6。验证您的 系统在内核中启用了 IPv6,以下所有测试都必须 通过:

    • cat /proc/cmdline 将打印当前内核的引导命令行。 输出不得包含 ipv6.disable=1。
    • /proc/sys/net/ipv6/ 目录必须存在。
    • 调用socket(AF_INET6, SOCK_STREAM, IPPROTO_IP) 应该成功 - 系统调用必须返回一个 fd != -1 并且不会因 EAFNOSUPPORT 而失败。确切的错误取决于 该功能。对于链接服务器,这表现为登录超时 错误。对于可用性组,ALTER AVAILABILITY GROUP JOIN DDL 下载后 5 分钟后在辅助服务器上将失败 配置超时错误。

    要解决此问题,请执行以下操作之一:

    • 使用 IP 而不是主机名来指定 TCP 的目标 连接。

    • 通过从引导中删除 ipv6.disable=1 在内核中启用 IPv6 命令行。执行此操作的方法取决于 Linux 发行版和 引导加载程序,例如 grub。如果您确实希望禁用 IPv6,您可以 仍然通过设置 net.ipv6.conf.all.disable_ipv6 = 1 来禁用它 sysctl 配置(例如,/etc/sysctl.conf)。这仍将 阻止系统的网络适配器获取 IPv6 地址,但 允许 sqlservr 功能工作。

    【讨论】:

    • 我找不到我阅读此内容的链接,但无论哪种方式,当尝试在 SSMS 中的 Linux Sql Server 中创建链接服务器时,其他数据源显示为灰色。只能选择 Sql Server 选项。所以没有错误信息。
    • 从命令行运行以下命令:
      SELECT a.*
      FROM OPENROWSET('MSDASQL',
      'Driver=PostgreSQL AMD64A;uid=username;Server =IPAddress;port=5432;
      database=dbname;pwd=password',
      'SELECT top 100 * FROM mytable')
      AS a;
      我收到以下错误:
      消息 7222,级别 16,状态 255,第 44 行
      此实例上只允许使用 SQL Server 提供程序。
    • 找到了,你是对的,不支持非sql服务器连接。 docs.microsoft.com/en-us/sql/linux/…
    • 感谢您的意见。我会对此进行测试并告诉你结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2011-01-13
    • 2017-02-21
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多