10

最近、RDS インスタンスに切り替えたところ、多数のデータベース タスクが必要よりも 4 時間早くトリガーされていることに気付きました。さらに調査すると、問題は RDS インスタンスのデフォルトのタイムゾーン設定 (UTC) によって引き起こされます。この設定は変更できないため、このデータベース インスタンスを使用するすべてのアプリケーションでコード レベルの問題をグローバルに修正したいと考えています。を使用して、作成したdbインスタンスのタイムゾーンを「米国/東部」に設定しようとしました

set GLOBAL time_zone = 'US/Eastern'" OR
set time_zone = 'US/Eastern'"

ただし、「データベース エラー: 不明または正しくないタイム ゾーン: 'US/Eastern'」というエラーが生成されます。

ここで私が間違っていると思いますか?他のソリューションを使用した人はいますか?

4

5 に答える 5

9

残念ながら、RDS DBパラメータグループでdefault_timezoneを設定することはできないため、あなたの試みはすでに正しい方向でした。

$ rds-describe-db-parameters default | grep "time_zone"
DBPARAMETER  default_time_zone                                                                   engine-default  string   static   false

SET GLOBALを使用してグローバル値を設定するには、RDSユーザーとして付与されていないSUPER特権が必要です。

time_zoneを設定する唯一の方法は、接続ごとです。

mysql> SET time_zone = timezone;

私のマシンでは、US / Easternを正常に試しましたが、かなり古い世代を実行しています。

利用可能なタイムゾーンを確認するには、ボックスにログインします

mysql -h yourboxhost.rds.amazonaws.com -u <youruser> -p

とタイプ

mysql> SELECT * FROM mysql.time_zone_name;

インスタンスに設定できるインストール済みの有効なタイムゾーン名のリストを取得する必要があります

+----------------------------------------+--------------+
| Name                                   | Time_zone_id |
+----------------------------------------+--------------+
| Africa/Abidjan                         |            1 |
| Africa/Accra                           |            2 |
| Africa/Addis_Ababa                     |            3 |
| Africa/Algiers                         |            4 |
| Africa/Asmara                          |            5 |
| Africa/Asmera                          |            6 |
| Africa/Bamako                          |            7 |
| Africa/Bangui                          |            8 |
| Africa/Banjul                          |            9 |
| Africa/Bissau                          |           10 |
| Africa/Blantyre                        |           11 |
| Africa/Brazzaville                     |           12 |
| Africa/Bujumbura                       |           13 |
| Africa/Cairo                           |           14 |
etc...

データベースサーバーに接続するたびにtime_zoneを設定する必要があります

たとえば、php Mysqli拡張機能を使用する場合、これを行うことができます

$mysqli = mysqli_init();
mysqli_options($mysqli,MYSQLI_INIT_COMMAND,"SET time_zone = 'Africa/Brazzaville'" );
mysqli_real_connect($mysqli,$host, $user, $pass,$dbName) or die ('Unable to connect');

それ以外の場合は、データベースに接続した直後に手動で(データベースコネクタに実行させるという観点から)SET time_zone = '<YOUR_DESIRED_TIMEZONE>'クエリを実行します。

于 2012-11-16T20:55:28.383 に答える
8

RDS データベース インスタンスの time_zone 設定を変更できるようになりました: https://aws.amazon.com/de/premiumsupport/knowledge-center/rds-change-time-zone/

于 2016-02-16T19:11:00.107 に答える
3

tldr;

すべてのユーザーが EXECUTE アクセスできる「共有」スキーマを作成し、セッションのタイムゾーンを変更する SPROC を作成し、init_connect MySQL パラメータを変更してそれを呼び出します。


Ryan Weirが重複した質問の優れた回答で指摘したように、これは可能であれば避けるべきです。ただし、あなたが私のようで、利便性と健全性のために実装したい場合は、Ryan のソリューションを使用していくつかの変更を加えました。

複数のユーザーがさまざまな権限で MySQL にセットアップされている場合、単に sproc を mysql スキーマに配置すると問題が発生する可能性があります。これを解決するために、「共有」と呼ばれる新しいスキーマを作成し、すべてのユーザーにこのスキーマへの EXECUTE アクセスを許可しました。次に、次のストアド プロシージャを作成しました。

DROP PROCEDURE IF EXISTS shared.store_time_zone;
CREATE PROCEDURE shared.`store_time_zone`()
IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN     
    SET SESSION time_zone = 'US/Pacific';  
END IF;

夏時間を処理するために「US/Pacific」を設定することを好みますが、これをテストして、MySQL インスタンスが最初にそれを認識することを確認する必要があります。次のクエリSET SESSION time_zone = 'US/Pacific';を実行して、機能することを確認してください。タイムゾーンを調べるには、実行しますSELECT * FROM mysql.time_zone_name;

この時点で、パラメーター グループを変更してすべてを壊す可能性がある前に、アクセス許可をテストすることをお勧めします。単純に DB に接続し (できれば、低レベルの権限を持つユーザーや一般的に使用されているユーザーで)、次のクエリを実行します。

CALL shared.store_time_zone;
select now();

エラーが発生せず、正しい時刻が表示されることを願っています。

次に、RDS インスタンスが使用している DB パラメータ グループの init_connect パラメータを変更する必要があります。これは、API またはコマンドライン ユーティリティを使用して、RDS Web コンソールで実行できます。コマンドラインを使用すると、次のようになります。

$ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL shared.store_time_zone', method=immediate"

Web コンソールから行う場合は、init_connect の値を変更するだけです。

CALL shared.store_time_zone

Web コンソールで RDS インスタンスに戻り、詳細ペインを下にスクロールして DB パラメータ グループを表示します。(applying) や (in-sync) のように表示されます。(同期) になったら、すべてをテストして、問題がないことを確認します。

この時点で問題が発生し、元に戻す必要がある場合は、init_connect の値を次のような無害なものに設定することをお勧めします。

SET SESSION time_zone = '-00:00';

空白に戻すことは、Web コンソールから行うことはできません。DB パラメータの空の値を復元できない理由の詳細については、このスレッドを参照してください。

于 2013-05-15T21:30:29.227 に答える
0

@Thomas Paine のソリューションは、 current_user() のコンテキスト内でマスター RDS ユーザーを返すのではuser()なく、ユーザーにする必要があることを除いて、私にとってはうまくいきます。(マスターとは、実際の root ユーザーである rdsadmin を意味するのではなく、ほとんどの権限を持つ DB インスタンスで作成されたユーザーを意味します。)current_user()init_connect

于 2015-08-13T03:15:18.280 に答える