Отличие timezone в двух БД
Есть проект, который мы переписываем. Со старого проекта мы делаем дамп таблицы по одному из старых функционалов, но после залива дампа к нам на сервер, мы заметили, что время отличается от нашего. Различные проверки на их стороне и на нашей, мы пришли к выводу, что у них в БД стоит дефолтная таймзона на +3 часа, а у нас же уже давно стоит на дефолте +0, и если поменять таймзону на +3 часа, то соответственно все даты будут на 3 часа больше чем должны быть (ну конечно кроме той таблицы, которую мы тянем со старого проекта). Исходя из этих знаний нам нужно сделать дамп старой таблицы, но чтобы данные в дампе были с +3 часами как у них на БД. Можно ли это сделать при дампе таблицы, или придется использовать какие-то махинации, чтобы подружить этот дамп с нашей БД?
Ответы (1 шт):
Поскольку у вас возникла описываемая проблема, то поле, с которым возникла проблема, имеет тип TIMESTAMP. В это поле значение сохраняется строго в GMT. То есть во время сохранения от значения было отнято смещение в соответствии с установленной @@time_zone
, и затем записано в таблицу. А вот при выгрузке в дамп значение без вариантов выгружается "как есть" - то есть в GMT. И соответственно после загрузки вы имеете 3-часовое смещение.
Поскольку значение УЖЕ записано с учётом зоны времени в момент записи, то никакой хитрой схемы выполнения дампа, увы нет - в дамп пишется строго то, что находится в таблице, никакие настройки не учитываются. Так что без "махинаций" - не обойдётся.
Навскидку вижу как минимум два возможных варианта (если думать, наберётся ещё, но смысл?):
Загрузить дамп как есть, после чего все проблемные поля обновить с использованием
CONVERT_TZ()
. Это позволит восстановить значения на правильную зону.Вместо дампа данных использовать дамп структуры плюс программные выгрузку (SELECT INTO OUTFILE) и загрузку (LOAD DATA INFILE). При выгрузке значения будут выгружены с учётом ТОЙ зоны, а загружены с учётом ЭТОЙ.