2013-03-04 4 views
12

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

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

ответ

35

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

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

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


Вы правы, что MySql будет использовать часовой пояс сервера для хранения временных меток по умолчанию, однако вашего предположения, что RDS экземпляров имеют свои временные зоны установлены на основании AWS региона, в котором они запускаются неверен - весь RDS экземпляры запускаются с их часовой пояс установлен в UTC, and this configuration can't be changed:

The time zone is currently not modifiable. There is indeed a Parameter value in rds-describe-db-parameters called "default_time_zone" but it's marked as not modifiable.

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

  1. Создать следующую хранимую процедуру (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 ; 
    
  2. Connect к экземпляру, и выполните следующую команду:

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

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

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

+13

Лучшим решением было бы установить именованный часовой пояс для управления дневным сбережением. Я предлагаю изменить линию: SET SESSION time_zone = 'US/Pacific'; –

+0

Я хочу подчеркнуть предыдущий комментарий, названный часовой пояс действительно экономит боль при дневном свете, также помните о GMT, так как он не удерживает смещение дневного света – Zavael

+0

@ThomasPaine Мой единственный страх перед этим решением состоит в том, что каждый новый пользователь который добавляется в эту базу данных, должен будет иметь доступ к этой функции базы данных, иначе она не будет работать, исправить? Что касается других баз данных и их пользователей.Могу ли я создать базу данных с этой хранимой процедурой и как-то убедиться, что каждый может получить к ней доступ по умолчанию? – Neo

Смежные вопросы