我们正在开发Tableau仪表板并在AWS中的EC2 Windows实例上部署工作簿。其中一个数据源是防火墙内的公司SQL服务器。服务器由IT管理,我们只对其中一个数据库具有读取权限。现在解决方案是通过连接到公司SQL服务器在本地构建Tableau桌面上的工作簿。在将工作簿发布到Tableau Server之前,会从数据源中提取数据。静态数据在发布时随工作簿上传。
我们希望在同一个实例上设置AWS(例如Postgresql)上的数据库,并将数据从公司SQL服务器推送到AWS数据库,而不是链接到Tableau服务器上的静态提取数据。
可能有一种方法可以直接从SQL服务器推送到AWS上的postgres。但由于我们对服务器没有多少控制权,而且IT人员可能不愿意将数据推送到外部,因此这不是一个选择。我能想到的是:
我不知道其他人是否遇到过这样的情况以及他们的解决方案是什么。但我认为这不是一个不常见的情况。一个变化是将本地Tableau Desktop和AWS Tableau Server连接到AWS上的Postgres。不确定本地Tableau是否可以访问AWS上的Postgres。
我们也希望尽可能自动化整个过程。在本地服务器上,我可以运行Python脚本作为cron作业,以便经常从SQL服务器导出数据并保存到CSV。在服务器端,将运行类似的东西将数据从CSV加载到Postgres。但是,如果文件很大,将数据从CSV导入到postgres可能会非常慢。但是,没有更好的方法可以以编程方式将文件从本地传输到AWS EC2实例,因为它是Windows实例。
我愿意接受任何建议。
答案 0 :(得分:1)
对于此类问题,我强烈建议您使用SymmetricDS - https://www.symmetricds.org/
主要警告是SQL Server需要添加一些触发器来跟踪更改,但此时SymmetricDS将处理数据推送。
另一种方法,类似于您的建议,将脚本导出数据到CSV文件,将它们上传到S3,然后在S3存储桶上有一个存储桶事件触发器,用于启动Lambda以加载数据到达时。
答案 1 :(得分:1)
:一种。平台选择
如果在AWS上使用SQL Server以外的数据库(比如Postgres),则需要执行一次(或两次)转换:
在从内部部署SQl Server到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 Power BI不需要打开端口来获取它需要,它使用桌面网关将其推出
鉴于我们只有推送选项,那么我们需要在本地推送数据。是的,这可能是Linux或Windows计划任务的cron工作。请注意,这是您开始创建影子IT的地方
要从SQL Server中获取要推送到云端的数据,最简单的方法是使用BCP.EXE生成平面文件。如果它们进入SQL Server,则这些应该是本机格式(以节省复杂性)。如果这些是Postgres,则应该以制表符分隔
如果这些文件正在上传到SQL Server,那么它只是另一个BCP命令将本机文件推送到SQL Server中的表(在此之前,您需要运行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,
另请注意,此处AWS RDS实例只是另一个具有主机名,登录名和密码的数据库。您唯一需要做的就是确保AWS侧的防火墙处于打开状态,以接受来自您IP地址的传入连接
您可以在集成中构建更多层次的复杂性:差异复制,重试等,但考虑到“影子IT状态”,这可能不值得
另外请注意,我认为AWS会对数据上传收费,因此如果您每天复制一个1G数据库,那么这将会增加。 (Azure不会对上传收费,但我相信你会以其他方式付费!)