2013-03-04 97 views
12

我們使用AWS RDS實例上的最新MySQL服務器,並且已配置爲在US-East數據中心上運行它。我們假設任何新的Date()或Time.now()調用都會將日期存儲在運行數據庫服務器的時區中。如何爲AWS RDS實例設置數據庫時區

有沒有辦法指示我的AWS RDS實例在US-East上運行指向PST時區,以便日期的任何持久性都可以將值存儲在PST而不是EST中。 (即,如果將對象存儲在美國東部時間上午10點左右,那麼數據庫列應反映上午7點EST)。

回答

35

在我的其他答案之前,我只想現在推薦如果您有任何選擇將您的應用程序更改爲使用UTC,那麼現在和將來都會爲您節省很多痛苦。

但是,考慮到您的問題的上下文,我假設這不是一個選項,並且您正在適應在傳統服務器環境中使用MySQL的系統,您只需更改時區即可有代碼邏輯需要這個時區,並且不能輕易適應使用UTC。

但是,如果你真的需要它作爲PST存儲,請繼續閱讀。


你是正確的,MySQL將使用服務器的時區默認情況下爲時間戳存儲,但是你的假設,即RDS實例有自己的時區基於它們所推出的AWS區域設置不正確, - 所有RDS實例與他們的時區設置爲UTC推出,and this configuration can't be changed:

The time zone is currently not modifiable. There is indeed a Parameter value in rds-describe-db-parameters called "default_time_zone" but it's marked as not modifiable.

所以你唯一的選擇是設置時區您的應用程序對數據庫實例PST每個連接上。您可以使用SET SESSION time_zone = 'PST'查詢每一個應用程序,使通過以下兩個步驟found here連接執行:

  1. 創建以下存儲過程(UTC-8是PST):

    DELIMITER | 
    CREATE PROCEDURE mysql.store_time_zone() 
        IF NOT (POSITION('[email protected]' IN CURRENT_USER()) = 1) THEN  
         SET SESSION time_zone = '-8:00'; 
        END IF 
    | 
    DELIMITER ; 
    
  2. 連接到您的實例,並運行以下命令:

    $ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate" 
    
  3. 您可能需要授予EXECUTE個權限將被連接到數據庫的用戶,否則你可能會得到一個連接錯誤:

    GRANT EXECUTE ON PROCEDURE mysql.store_time_zone TO 'user'@'host'; 
    

現在,通過任何客戶對你的RDS實例執行應該使用PST每個查詢,而無需修改任何應用程序邏輯而無需更新數據庫中以前存儲的任何時間戳。

+13

更好的解決方案是將您的指定時區設置爲處理夏令時。我建議將該行改爲:SET SESSION time_zone ='US/Pacific'; – 2013-05-15 19:07:46

+0

我想強調之前的評論,名爲timezone確實節省了夏令時的痛苦,同時也意識到了GMT,因爲它沒有保留夏令時抵消 – Zavael 2015-04-09 12:22:23

+0

@ThomasPaine我唯一對此解決方案的擔心是,似乎每個新用戶添加到這個數據庫中的數據庫將不得不訪問這個數據庫函數,否則它將無法正常工作?其他數據庫及其用戶呢?我可以使用此存儲過程創建數據庫,並確保每個人都可以默認訪問它嗎? – Neo 2015-08-06 17:29:21

相關問題