AWS RDSインスタンスで最新のMySQLサーバーを使用し、US-Eastデータセンターで実行するように設定しました。新しいDate()またはTime.now()の呼び出しは、データベースサーバーが実行されているタイムゾーンに日付を格納すると想定しています。
US-Eastで実行されているAWS RDSインスタンスがPSTタイムゾーンを指すように指定する方法はありますか?これにより、日付の永続性は値をESTではなくPSTに保存します。 (つまり、オブジェクトを午前10時頃に格納する場合、db列は午前7時を反映する必要があります)。
残りの回答の前に、UTCを使用するようにアプリケーションを変更するオプションがある場合に、現在および将来、多くの悲しみを救うことをお勧めします。
しかし、あなたの質問のコンテキストを考えると、これはオプションではなく、タイムゾーンを変更するだけの従来のサーバー環境でMySQLを使用するように設計されたシステムを適合させており、そのコードロジックがあることを前提としていますこのタイムゾーンを想定しており、UTCを使用するように簡単に調整することはできません。
ただし、PSTとして保存するために本当に必要な場合は、読み進めてください。
MySqlがデフォルトでタイムスタンプストレージにサーバーのタイムゾーンを使用することは正しいですが、RDSインスタンスのタイムゾーンが、それらが起動されるAWSリージョンに基づいて設定されているという仮定は正しくありません-すべてのRDSインスタンスは、タイムゾーンをUTCに設定して起動されます およびこの構成は変更できません:
タイムゾーンは現在変更できません。実際、
rds-describe-db-parameters
には「default_time_zone」というパラメーター値がありますが、変更不可とマークされています。
したがって、唯一のオプションは、アプリケーションがデータベースインスタンスに対して行う各接続のタイムゾーンをPSTに設定することです。 SET SESSION time_zone = 'PST'
クエリを使用して、アプリケーションが行うすべての接続で次の2つの手順を実行することで実行できます ここにあります :
次のストアドプロシージャを作成します(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 ;
インスタンスに接続し、次のコマンドを実行します。
$ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate"
データベースに接続するユーザーにEXECUTE
権限を付与する必要がある場合があります。そうしないと、接続エラーが発生する可能性があります。
GRANT EXECUTE ON PROCEDURE mysql.store_time_zone TO 'user'@'Host';
これで、クライアントによってRDSインスタンスに対して実行されるすべてのクエリは、アプリケーションロジックを変更することなく、また以前にデータベースに格納されたタイムスタンプを更新する必要なく、PSTを使用する必要があります。