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