Настройка часового пояса по умолчанию в RDS

Недавно мы перешли на экземпляр RDS и заметили, что ряд задач нашей базы данных запускается на 4 часа раньше, чем нужно. При дальнейшем изучении проблема вызвана настройкой часового пояса по умолчанию (UTC) в экземпляре RDS. Поскольку этот параметр нельзя изменить, мы хотели бы решить проблему на уровне кода глобально во всех наших приложениях, использующих этот экземпляр базы данных. Я попытался установить часовой пояс в экземпляре БД, который я создаю, на «США/Восточный», используя

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

Но это генерирует ошибку «Ошибка базы данных: неизвестный или неверный часовой пояс:« США / Восточный »»

Как вы думаете, что я делаю неправильно здесь? Кто-нибудь использовал какие-либо другие решения?


person newbie    schedule 15.11.2011    source источник
comment
Что это за база данных? MySQL?   -  person Michael    schedule 10.11.2012


Ответы (5)


К сожалению, невозможно установить default_timezone в группе параметров БД RDS, поэтому ваша попытка уже была в правильном направлении.

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

Чтобы установить глобальное значение с помощью SET GLOBAL, вам необходимо иметь привилегию SUPER, которая не предоставляется вам как пользователю RDS.

Единственный способ установить 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...

Вы должны устанавливать часовой пояс каждый раз, когда вы подключаетесь к серверу базы данных.

Например, если вы используете расширение 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>' Query сразу после подключения к базе данных.

person Michel Feldheim    schedule 16.11.2012
comment
Если вы просто измените SET time_zone = 'US/Eastern' на SET time_zone = '-5:00', вы сможете избежать проблемы, связанной с тем, что mySql не распознает часовые пояса по имени в RDS по умолчанию. - person Ryan Weir; 04.03.2013
comment
@RyanWeir, будьте осторожны с переходом на летнее/летнее время и т. д., если вы используете необработанные часовые смещения. - person indivisible; 05.07.2017

Параметр time_zone для экземпляров базы данных RDS теперь можно изменить: https://aws.amazon.com/de/premiumsupport/knowledge-center/rds-change-time-zone/

person janpio    schedule 16.02.2016
comment
Важно отметить, что это должно быть изменено в группе параметров кластера (по крайней мере, для aurora mysql). Группа параметров БД имеет только значение default_time_zone, которое нельзя изменить. - person D2TheC; 07.06.2018

тлдр;

Создайте «общую» схему, к которой все ваши пользователи имеют доступ EXECUTE, создайте SPROC, который изменяет часовой пояс сеанса, и измените параметр init_connect MySQL для его вызова.


Как отметил Райан Вейр в своем превосходном ответ в повторяющемся вопросе этого, вероятно, следует избегать, если это возможно. Однако, если вы похожи на меня и хотите реализовать это для удобства и здравомыслия, я взял решение Райана и внес несколько изменений.

Если у вас есть несколько пользователей, настроенных в 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;

Я предпочитаю устанавливать «США/Тихоокеанский регион» для обработки перехода на летнее время, но вы должны проверить это, чтобы убедиться, что ваш экземпляр MySQL сначала распознает его. Просто выполните следующий запрос SET SESSION time_zone = 'US/Pacific';, чтобы убедиться, что он работает. Чтобы узнать свой часовой пояс, выполните SELECT * FROM mysql.time_zone_name;

На этом этапе я рекомендую протестировать разрешения, прежде чем вы начнете изменять группу параметров и потенциально сломаете все. Просто подключитесь к БД (желательно с пользователем, который имеет разрешения низкого уровня и/или обычно используется) и выполните следующие запросы.

CALL shared.store_time_zone;
select now();

Надеюсь, вы не получили никаких ошибок и правильное время появилось.

Далее вам нужно будет изменить параметр init_connect в группе параметров БД, которую использует ваш экземпляр RDS. Вы можете сделать это в веб-консоли RDS, через API или утилиту командной строки. Если вы используете командную строку, это будет выглядеть так:

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

Если вы делаете это через веб-консоль, вам просто нужно изменить значение init_connect.

CALL shared.store_time_zone

Вернитесь к своему экземпляру RDS в веб-консоли и прокрутите панель сведений до группы параметров БД. Должно быть что-то вроде (применяется) или (синхронно). Как только это будет (синхронизировано), проверьте все, чтобы убедиться в отсутствии проблем.

Если на этом этапе вы столкнетесь с проблемами и вам нужно откатить все назад, я рекомендую установить значение init_connect на что-то безобидное, например:

SET SESSION time_zone = '-00:00';

Установить его обратно на пустое невозможно из веб-консоли. Подробнее о том, почему один не может восстановить пустое значение для Параметр БД

person Thomas Paine    schedule 15.05.2013
comment
Я смог заставить это работать только с помощью user() вместо current_user(), знаете ли вы, почему ваше решение, кажется, работает для всех, кроме меня, с current_user(); странно то, что current_user() возвращает то же самое из командной строки только в контексте init_connect, он фактически возвращает начального главного пользователя, которого вы создаете с помощью RDS, независимо от пользователя, который подключается к MySQL. Я проверил это, изменив процедуру для вставки записи со значением current_user(); - person Neo; 13.08.2015

Я сделал следующие шаги, чтобы я мог изменить часовой пояс

  1. Войдите в RDS и создайте новую группу параметров.

  2. Отредактируйте только что созданную группу параметров

  3. Установите часовой пояс Ex:Asia/Calcutta и сохраните изменения

  4. Измените экземпляр RDS, измените группу параметров БД на вновь созданную группу параметров.

  5. Сохранить и перезагрузить экземпляр RDS

person pbms    schedule 24.07.2017
comment
когда я пытаюсь это сделать, time_zone не является опцией, а default_time_zone не поддается изменению... (даже в моей недавно созданной группе параметров) - в aurora - person iewebguy; 30.10.2017
comment
@iewebguy вы пытаетесь в группе параметров БД, вы должны попробовать в группе параметров кластера. - person Deepak Chaudhary; 06.12.2017
comment
Это сработало, но на самом деле мне пришлось редактировать кластер, а не сам экземпляр на шаге 4. - person iewebguy; 12.03.2019

Решение @Thomas Paine работает для меня, за исключением того, что мне пришлось использовать пользователя user() вместо current_user(), поскольку внутри контекста init_connect current_user() возвращает главного пользователя RDS. (Под мастером я подразумеваю не rdsadmin, который является настоящим пользователем root, а пользователя, созданного с помощью экземпляра БД с большинством привилегий.)

person Neo    schedule 13.08.2015