2017-10-17 41 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中刪除並重新導入所有內容。導入過程中沒有錯誤(與上次一樣),但是在每個表中逐一選擇所有表後,所有表都與數據一起存在,以驗證導入的數據是否正確。

    相關問題