如何将数据从本地 SQL Server 推送到 AWS 上的 Tableau Server

Posted

技术标签:

【中文标题】如何将数据从本地 SQL Server 推送到 AWS 上的 Tableau Server【英文标题】:How to push data from local SQL Server to Tableau Server on AWS 【发布时间】:2017-09-05 20:38:04 【问题描述】:

我们正在开发 Tableau 仪表板并将工作簿部署在 AWS 中的 EC2 Windows 实例上。数据源之一是防火墙内的公司 SQL 服务器。服务器由 IT 管理,我们只有其中一个数据库的读取权限。现在的解决方案是通过连接到公司 SQL Server 在本地 Tableau Desktop 上构建工作簿。在将工作簿发布到 Tableau Server 之前,会从数据源中提取数据。静态数据在发布时与工作簿一起上传。

我们想在 AWS 上建立一个数据库(例如 Postgresql),而不是链接到 Tableau 服务器上的静态提取数据,可能在同一个实例上,并将数据从公司 SQL 服务器推送到 AWS 数据库。

可能有一种方法可以直接从 SQL 服务器推送到 AWS 上的 postgres。但由于我们对服务器没有太多控制权,而且 IT 人员可能不愿意将数据推送到外部,所以这不是一个选择。我能想到的如下:

    在 AWS 实例上设置 Postgres 并创建与 SQL 服务器中的表具有相同架构的表。 从 SQL Server 中提取数据并保存为 CSV 文件。每个文件一张表。 在 AWS windows 实例上启用文件系统共享。所以实例可以直接从本地文件系统中读取文件。 将数据从 CSV 加载到 Postgres 表中。 在 AWS 上的 Tableau Server 上设置数据连接以从 Postgres 读取数据。

我不知道其他人是否遇到过这样的情况以及他们的解决方案是什么。但我认为这并不少见。一项更改是让本地 Tableau Desktop 和 AWS Tableau Server 都连接到 AWS 上的 Postgres。不确定本地 Tableau 是否可以访问 AWS 上的 Postgres。

我们还希望尽可能地自动化整个过程。在本地服务器上,我可能可以将 Python 脚本作为 cron 作业运行,以频繁地从 SQL 服务器导出数据并保存到 CSV。在服务器端,将运行类似的东西将数据从 CSV 加载到 Postgres。但是,如果文件很大,将数据从 CSV 导入到 postgres 可能会很慢。但是没有更好的方式以编程方式将文件从本地传输到 AWS EC2 实例,因为它是 Windows 实例。

我愿意接受任何建议。

【问题讨论】:

第一个建议:如果您的源数据库是 SQL Sever,不要使复制的数据库成为一个完全不同的平台!让它成为 SQL Server!根据数据量,SQL Express 是免费的。请注意,您正在这里构建“影子 IT”。尽管 IT 可能看起来无用且笨拙,但它们所做的事情有充分的理由。 我不知道你最后一句话是什么意思:但是没有更好的方法以编程方式将文件从本地传输到 AWS EC2 实例,因为它是 Windows 实例。有很多是将数据从本地 SQL 实例推送到 SQL 云实例。从本地推送数据意味着您不必向外界打开任何防火墙(IT 练习),所以这是您最好的选择。例如,您可以运行计划的 Windows 作业,将数据提取为原生 BCP 格式,然后将其推送到云端(再次使用 BCP)(这只是一个批处理文件) 这是一个使用 BCP 将数据从一个 SQL Server 传输到另一个 SQL Server 的示例:techrepublic.com/article/…。请记住:如果您从本地推送,则不必打开任何防火墙。如果你想在云中写一些东西来提取数据,你需要为你的本地 SQL Server 打开一个传入端口(这是 IT 永远不会做的) @Nick.McDermaid 从 BCP 链接来看,这个工具似乎是 MS SQL 服务器附带的。但是我无法登录到服务器来运行这个命令。我们只提供了一个数据库连接。我使用 Sql Server Management Studio 在我的机器上查看数据。 @Nick.McDermaid 我的意思是如果 EC2 实例是 Linux,您可以使用 scp 命令来推送文件。您对如何将文件从本地上传到 Windows AWS 实例有什么建议吗? 【参考方案1】:

A.平台选择

如果您在 AWS 上使用 SQL Server 以外的数据库(例如 Postgres),则需要执行一次(或可能两次)转换:

    在从本地 SQl 服务器到 AWS 数据库的集成中,您需要从 SQL Server 数据类型映射到 postgres 数据类型

    我对 Tableau 了解不多,但如果它当前指向 SQL Server,您可能需要进行某种转换才能将其指向 Postgres

仅这两个步骤就可能值得您花时间研究 SQL Express RDS。 SQL Express 没有许可成本,但显然 Windows 有。您还可以在 Linux 上运行 SQL Express,这不会产生任何许可费用,但需要大量的操作才能运行(即我怀疑是否有可用的 SQL Express Linux RDS)

B.集成方法

从网络中提取数据的网络外部(即云上)的任何进程都需要打开防火墙。假设这不是一个选项,那么我们只能从本地选项中推送

顺便说一句,Power BI 通过使用协调数据传输的桌面“网关”来实现其桌面数据集成,这意味着云 Power BI 无需打开端口即可获得它需要,它使用桌面网关将其推出

鉴于我们只有推送选项,那么我们需要一些本地的东西来推送数据。是的,这可能是 Linux 上的 cron 作业或 Windows 计划任务。请注意,这是您开始创建影子 IT 的地方

要从 SQL Server 中获取数据以推送到云端,最简单的方法是使用 BCP.EXE 生成平面文件。如果这些要进入 SQL Server,它们应该是本机格式(以节省复杂性)。如果这些要发送到 Postgres,它们应该是制表符分隔的

如果这些文件正在上传到 SQL Server,那么将本机文件推送到 SQL Server 的表中只是另一个 BCP 命令(在此之前,您需要运行 SQLCMD.EXE 命令来截断目标表

因此,对于三个表,假设您安装了免费的* SQL Server 客户端工具,您将有一个类似这样的批处理文件:

REM STEP 1:  Clear staging folder
DEL /Y C:\Staging\*.TXT

REM STEP 2: Generate the export files
BCP database.dbo.Table1 OUT C:\Staging\Table1.TXT -E -S LocalSQLServer -N
BCP database.dbo.Table2 OUT C:\Staging\Table2.TXT -E -S LocalSQLServer -N
BCP database.dbo.Table3 OUT C:\Staging\Table3.TXT -E -S LocalSQLServer -N


REM STEP 3: Clear target tables
REM Your SQL RDS is unlikely to support single sign on 
REM so need to use user/pass here
SQLCMD -U username -P password -S RDSSQLServerName -d databasename -Q"TRUNCATE TABLE Table1; TRUNCATE TABLE Table2; TRUNCATE TABLE Table3;"

REM STEP 4: Push data in
BCP database.dbo.Table1 IN C:\Staging\Table1.TXT -U username -P password -S RDSSQLServerName-N
BCP database.dbo.Table2 IN C:\Staging\Table2.TXT -U username -P password -S RDSSQLServerName-N
BCP database.dbo.Table3 IN C:\Staging\Table3.TXT -U username -P password -S RDSSQLServerName-N

(我相当确定 BCP 和 SQLCMD 是免费的...不确定,但您当然可以下载免费的 SQL Server 工具并查看)

如果您想改为推送到 Postgres SQL,

在第 2 步中,您需要删除 -N 选项,这将使文件文本、制表符分隔、任何内容都可读 在第 3 步和第 4 步中,您需要使用相关的 Postgres 命令行工具,但您需要处理数据类型等(这可能很麻烦 - 仅含糊不清的日期格式总是一个大问题)

另外请注意,AWS RDS 实例只是另一个具有主机名、登录名和密码的数据库。您唯一需要做的就是确保在 AWS 端打开防火墙以接受来自您的 IP 地址的传入连接

您可以在集成中构建更多复杂层次:差异复制、重试等,但考虑到“影子 IT 状态”,这可能不值得

另外请注意,我认为 AWS 会为数据上传收费,因此如果您每天复制 1G 数据库,那将会增加。 (Azure 不收取上传费用,但我相信你会以其他方式付费!)

【讨论】:

在这种情况下是否可以进行增量加载而不是数据库复制?即仅从源数据库中检索新记录并将它们加载到 AWS 中的目标数据库。 您需要知道新记录是什么。因此,您需要在源代码中使用递增键或日期戳。【参考方案2】:

对于这类问题,我强烈建议使用 SymmetricDS - https://www.symmetricds.org/

主要需要注意的是 SQL Server 需要添加一些触发器来跟踪更改,但此时 SymmetricDS 将处理数据的推送。

与您建议的类似,另一种方法是让脚本将数据导出到 CSV 文件,将它们上传到 S3,然后在 S3 存储桶上触发存储桶事件,启动 Lambda 以加载数据到达时。

【讨论】:

以上是关于如何将数据从本地 SQL Server 推送到 AWS 上的 Tableau Server的主要内容,如果未能解决你的问题,请参考以下文章

计划的 SQL Server 实例推送到 Azure SQL 数据库

使用 ADO.NET 将数据表从内存推送到 SQL Server

如何将本地分支 A 中的多个本地提交推送到远程分支 B 并从本地分支 A 中清除它们?

如何将 Excel 数据从不同的工作表导出到 SQL-SERVER 数据库?

提问关于客户公司在SAP中下单后,数据如何同时推送到我方公司系统的数据库(SQL Server 2K)

如何在set_identity关闭时将Spark数据帧推送到Sql Server表?