тлдр;
Создайте «общую» схему, к которой все ваши пользователи имеют доступ 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