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

时间:2017-09-05 20:38:05

标签: sql-server postgresql amazon-ec2 tableau

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

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

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

  1. 在AWS实例上设置Postgres,并使用与SQL Server中相同的模式创建表。
  2. 从SQL Server提取数据并另存为CSV文件。每个文件一个表。
  3. 在AWS Windows实例上启用文件系统共享。因此实例可以直接从本地文件系统读取文件。
  4. 将数据从CSV加载到Postgres表格。
  5. 在AWS上的Tableau Server上设置数据连接以从Postgres读取数据。
  6. 我不知道其他人是否遇到过这样的情况以及他们的解决方案是什么。但我认为这不是一个不常见的情况。一个变化是将本地Tableau Desktop和AWS Tableau Server连接到AWS上的Postgres。不确定本地Tableau是否可以访问AWS上的Postgres。

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

    我愿意接受任何建议。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

:一种。平台选择

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

  1. 在从内部部署SQl Server到AWS数据库的集成中,您需要从SQL Server数据类型映射到postgres数据类型

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

  3. 单独这两个步骤可能会让您值得研究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,

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

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

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

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