Как установить часовую зону базы данных для экземпляра AWS RDS

Мы используем последний сервер MySQL на экземпляре AWS RDS, и мы настроили его запуск на дата-центр US-East. Мы предполагаем, что любое новое событие Date() или Time.now() будет хранить дату в часовом поясе, в котором работает сервер базы данных.

Есть ли способ указать мой экземпляр AWS RDS, работающий на US-East, чтобы указать на часовой пояс PST, чтобы любое сохранение даты сохраняло значения в PST вместо EST. (т.е. если хранить объект вокруг 10 AM EST, столбец db должен отражать 7 AM EST).

Ответ 1

Перед остальным моим ответом я просто хотел бы рекомендовать прямо сейчас, если у вас есть возможность изменить ваше приложение для использования UTC, это сэкономит вам много горя сейчас и в будущем.

Однако, учитывая контекст вашего вопроса, я предполагаю, что это не вариант, и вы адаптируете систему, предназначенную для использования MySQL в традиционной серверной среде, где вы можете просто изменить часовой пояс, и что там которая ожидает этот часовой пояс и не может быть легко адаптирована для использования UTC.

Но если вам действительно нужно хранить его как PST, читайте дальше.


Вы правы, что mySql по умолчанию будет использовать часовой пояс сервера для хранилища timestamp, однако ваше предположение о том, что экземпляры RDS имеют свои временные метки, установленные на основе области AWS, в которой они запущены, неверны - все экземпляры RDS запускаются со своим часовым поясом, установленным как UTC, и эту конфигурацию нельзя изменить:

Часовой пояс в настоящее время не поддается изменению. Действительно, существует Значение параметра в rds-describe-db-parameters называется "default_time_zone", но он помечается как не изменяемый.

Таким образом, ваш единственный вариант - установить часовой пояс для каждого соединения, которое ваше приложение делает для экземпляра базы данных в PST. Вы можете использовать запрос SET SESSION time_zone = 'PST' для выполнения в каждом соединении, которое делает приложение, выполнив следующие шаги здесь:

  • Создайте следующую хранимую процедуру (UTC-8 - PST):

    DELIMITER |  
    CREATE PROCEDURE mysql.store_time_zone ()  
       IF NOT (POSITION('[email protected]' IN CURRENT_USER()) = 1) THEN     
           SET SESSION time_zone = '-8:00';  
       END IF 
    |
    DELIMITER ;
    
  • Подключите к вашему экземпляру и выполните следующую команду:

    $ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate"
    
  • Вам может потребоваться предоставить разрешения EXECUTE для пользователей, которые будут подключаться к базе данных, иначе вы можете получить ошибку подключения:

    GRANT EXECUTE ON PROCEDURE mysql.store_time_zone TO 'user'@'host';
    

Теперь каждый запрос, выполненный против вашего экземпляра RDS любым клиентом, должен использовать PST без изменения любой логики приложения и без необходимости обновления ранее сохраненных временных меток в базе данных.