2017-10-17 92 views
1

我的团队拥有一个本地开发环境,其中包含一个Ruby on Rails应用程序,该应用程序连接到Postgres数据库以检索有关机场的一些信息,并使用它进行进一步查询。本地环境意味着复制我们的生产环境(都运行在相同的码头集装箱中)。为什么此Postgres Select Query在本地Docker容器中工作,但不在Amazon RDS Postgres上工作?

本地Postgres的容器使用官方的Postgres:9.6高山容器这里找到:https://hub.docker.com/_/postgres/

有问题的查询:

SELECT airports.iata FROM "routes" INNER JOIN "regions" ON "regions"."id" = "routes"."origin_id" INNER JOIN "airports_regions" ON "airports_regions"."region_id" = "regions"."id" INNER JOIN "airports" ON "airports"."id" = "airports_regions"."airport_id"; 

本地查询执行

  1. 以上命令在我们的rails应用程序本地调用时执行正确。
  2. 我也可以在本地将“docker exec -it'ing”放入Postgres容器后使用psql运行命令。

亚马逊RDS Postgres的查询执行

  1. 在生产我们的Rails应用程序尝试运行有问题的查询,但返回一个空的数据集:{}

应当注意它成功地连接到数据库和 “成功”使正确验证后的查询,所以 真的这里的问题是,查询不正确返回/匹配数据。

  • 当我手动连接到我们的亚马逊RDS Postgres数据库使用PSQL,我可以正确地认证,我可以执行查询,但我再次接收空/ {}的结果。所有其他查询似乎都起作用。
  • 在上述两种情况下,查询都能正确执行。当手动执行它专门返回下列信息:

    iata 
    ------ 
    (0 rows) 
    

    其他有趣的事实

    1. 点本地轨容器在生产RDS Postgres的 - 结果:Postgres的返回{}即使Postgres的容器可以执行相同的查询并在指向本地数据库时返回预期的数据列表。在这种情况下,返回的结果再现了生产行为:{}
    2. SSH到Amazon EC2实例相同VPC /安全组连接到RDS数据库和运行上面的命令,以确保它不是一个权限问题 - 结果:同远程查询:{}
    3. 指望两个实例表(均返回相同的结果〜5880): $ SELECT COUNT(*)FROM机场;
    4. 清单表返回两个亚马逊RDS和相同的表列表本地的Postgres

    展望未来

    在这一点上,我的假设下运行,必须有与亚马逊RDS Postgres的是如何处理的数据差异vs当地的Postgres 9.6分贝,但我一直没有能够在谷歌上找到任何迹象。希望有些人遇到类似的事情。

    Postgres版本

    SELECT version();返回如下:

    RDS的Postgres版

    的PostgreSQL 9.6.2在x86_64-Linux PC的GNU的,由GCC编译(GCC)4.8.2 20140120(红帽4.8.2-16) ,64位(1行)

    本地的Postgres版

    在x86_64-PC-Linux的MUSL,与gcc编译的PostgreSQL 9.6.3(高山 6.2.1)6.2.1 20160822 ,64位(1行)

    StackOverflow的建议W /结果

    从@Aleroot修改查询到:

    SELECT a.iata FROM routes ru JOIN regions re ON re.id = ru.origin_id JOIN airports_regions ar ON ar.region_id = re.id JOIN airports a ON a.id = ar.airport_id; 
    

    结果:(同)

    iata 
    ------ 
    (0 rows) 
    
    +0

    你怎么ssh到RDS? –

    +0

    @vao你不能SSH到RDS,但你可以SSH连接到RDS的ec2实例,然后使用psql命令连接到数据库,一旦你进入ec2实例它位于虚拟私有云/安全组中(据我所知,这是最接近的)。 – Necevil

    +0

    只是* ssh到ec2/rds *看起来不好 - 很抱歉挑剔 –

    回答

    0

    为我们说话在评论中,你可以检查结果是否不受影响由其他表格引用。如果将INNER JOIN更改为OUTER JOIN,则会在空行中添加缺失键的行,因此机场表的行数将会填满。无论是从结果中,还是仅通过检查regions, airports_regions, routes上的计数值,都可以揭示RDS和本地数据库之间的差异。

    0

    自@ VaoTsun的评论原本让我在正确的道路上我接受了他的答案(在这里也发现)。

    真正的问题,这是我应该一直在问,实际上最终是“我怎样才能确保我导入亚马逊RDS Postgres的一个数据库转储是完整的?”

    相当的混乱这里源于一个事实,即亚马逊RDS没有抛出任何错误,当我进口的转储,而面对我的Rails应用程序的部分网页显示正常,几乎所有的数据。

    这是因为大多数表用所有的数据正确导入和创建所有表。因此,列出表/模式导致所有内容看起来都正确,而除了一个表之外的所有查询都会得出正确的答案。

    我终于回去了,并选择了DB中的每个表上的所有内容: SELECT * FROM each_table_name;

    一个特定的表在远程RDS数据库上未返回任何结果,但它在本地返回了预期结果。一旦发生这种情况,我将数据库从Amazon RDS中删除并重新导入所有内容。导入过程中没有错误(与上次一样),但是在每个表中逐一选择所有表后,所有表都与数据一起存在,以验证导入的数据是否正确。

    相关问题