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

How to push data from local SQL Server to Tableau Server on AWS

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

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

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

  1. 在 AWS 实例上设置 Postgres 并使用与 SQL 服务器中的模式相同的模式创建 tables。
  2. 从 SQL 服务器提取数据并保存为 CSV 文件。每个文件一个 table。
  3. 在 AWS windows 实例上启用文件系统共享。所以实例可以直接从本地文件系统读取文件。
  4. 将数据从 CSV 加载到 Postgres tables.
  5. 在 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 实例。

我愿意接受任何建议。

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

主要警告是 SQL 服务器需要添加一些触发器来跟踪更改,但此时 SymmetricDS 将处理数据推送。

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

一个。平台选择

如果您使用的数据库不是 SQL AWS 上的服务器(例如 Postgres),您需要执行一次(或可能两次)转换:

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

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

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

乙。整合方法

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

  • 顺便说一句,Power BI通过使用协调数据传输的桌面'gateway'实现了它的桌面数据集成,这意味着云Power BI不需要打开获取所需内容的端口,它使用桌面网关将其推出

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

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

  • 如果这些文件正在上传到 SQL 服务器,那么它只是另一个 BCP 命令,用于将本机文件推送到 tables 到 SQL 服务器(之前为此,您需要 运行 SQLCMD.EXE 命令来 t运行 分类目标 table

所以对于三个 tables,假设你已经安装了免费的* SQL 服务器客户端工具,你会有一个像这样的批处理文件:

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 服务器工具并查看)

如果您想推送到 Postgres SQL,

  • 在第 2 步中,您需要删除 -N 选项,这将使文件文本、制表符分隔、任何人都可读
  • 在第 3 步和第 4 步中,您需要使用相关的 Postgres 命令行工具,但您需要处理数据类型等(这可能很痛苦 - 单独的模糊日期格式总是大问题)

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

您可以在集成中构建更多的复杂层:差异复制、重试等。但是考虑到 'shadow IT status' 这可能不值得

另请注意,我认为 AWS 对数据上传收费,因此如果您每天复制 1G 的数据库,这会加起来。 (Azure 不对上传收费,但我相信您会以其他方式付费!)