16

AWS RDS インスタンスで最新の MySQL サーバーを使用し、米国東部のデータ センターで実行するように構成しました。新しい Date() または Time.now() の呼び出しでは、データベース サーバーが実行されているタイムゾーンで日付が格納されると想定しています。

米国東部で実行されている AWS RDS インスタンスが PST タイムゾーンを指すようにする方法はありますか? (つまり、EST の午前 10 時頃にオブジェクトを格納する場合、db 列は代わりに EST の午前 7 時を反映する必要があります)。

4

1 に答える 1

37

私の回答の残りの部分の前に、UTC を使用するようにアプリケーションを変更するオプションがあれば、現在および将来の多くの悲しみを救うことをお勧めしたいと思います。

ただし、質問のコンテキストを考えると、これはオプションではなく、タイムゾーンを変更できる従来のサーバー環境でMySQLを使用するように設計されたシステムを適応させており、コードロジックがあると想定していますはこのタイムゾーンを想定しており、UTC を使用するように簡単に適応させることはできません。

ただし、PST として保存する必要がある場合は、読み進めてください。


mySql がデフォルトでタイムスタンプ ストレージにサーバーのタイムゾーンを使用することは正しいですが、RDS インスタンスが起動される AWS リージョンに基づいてタイムゾーンが設定されているという仮定は正しくありません。すべての RDS インスタンスはタイムゾーンが次のように設定されて起動されます。 UTC であり、この構成は変更できません。

タイムゾーンは現在変更できません。確かにrds-describe-db-parameters「default_time_zone」というパラメーター値がありますが、変更不可としてマークされています。

したがって、唯一のオプションは、アプリケーションがデータベース インスタンスに対して行う各接続のタイムゾーンを PST に設定することです。ここSET SESSION time_zone = 'PST'にある 2 つの手順に従って、アプリケーションが作成するすべての接続でクエリを実行できます。

  1. 次のストアド プロシージャを作成します (UTC-8 は PST)。

    DELIMITER |  
    CREATE PROCEDURE mysql.store_time_zone ()  
       IF NOT (POSITION('rdsadmin@' 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 を使用する必要があります。

于 2013-03-04T09:33:28.733 に答える