web-dev-qa-db-ja.com

AWS RDSインスタンスのデータベースのタイムゾーンを設定する方法

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

US-Eastで実行されているAWS RDSインスタンスがPSTタイムゾーンを指すように指定する方法はありますか?これにより、日付の永続性は値をESTではなくPSTに保存します。 (つまり、オブジェクトを午前10時頃に格納する場合、db列は午前7時を反映する必要があります)。

14
Rpj

残りの回答の前に、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を使用する必要があります。

35
Ryan Weir