Настройка для настройки часового пояса по умолчанию в RDS - PullRequest
10 голосов
/ 15 ноября 2011

Мы недавно переключились на экземпляр RDS и заметили, что куча задач нашей базы данных запускалась на 4 часа раньше, чем требовалось. При дальнейших исследованиях проблема вызвана настройкой часового пояса по умолчанию (UTC) в экземпляре RDS. Поскольку этот параметр нельзя изменить, мы хотели бы решить проблему на уровне кода глобально во всех наших приложениях, использующих этот экземпляр базы данных. Я попытался установить часовой пояс для экземпляра БД, который я создаю, в 'US / Eastern' с помощью

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

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

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

Ответы [ 5 ]

9 голосов
/ 17 ноября 2012

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

$ 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;

На моих машинах я успешно пробовал в США / Восточнойно у меня работает довольно старое поколение.

Чтобы определить доступные часовые пояса, войдите в свой ящик

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>' сразу после того, как выo ваша база данных

5 голосов
/ 16 февраля 2016

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

3 голосов
/ 16 мая 2013

tldr;

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


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

Если в MySQL настроено несколько пользователей с различными разрешениями, то простое помещение sproc в схему mysql может вызвать проблемы. Чтобы решить эту проблему, я создал новую схему с именем «shared» и дал всем своим пользователям 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';

Сбросить значение до пустого невозможно в веб-консоли. См. Эту ветку для получения дополнительной информации о том, почему один не может восстановить пустое значение для параметра DB

1 голос
/ 24 июля 2017

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

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

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

  3. Установка часового пояса Пример: Азия / Калькутта и сохранение изменений

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

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

0 голосов
/ 13 августа 2015

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

...