Пользователь
0,0
рейтинг
20 октября 2014 в 14:25

Разработка → Обновление tzdata для России (системное и java в Ubuntu/Debian, а также в MySQL) из песочницы

Предисловие


Как многие помнят, в этом году был принят закон, в связи с которым поменялись часовые пояса в России с 26 октября 2014 г. Само собой, сразу после принятия закона я поставил в календарь напоминалку на начало октября «обязательно обновить tzdata». Каково же было моё удивление, когда я не обнаружил апдейтов tzdata в debian и ubuntu. Решил подождать еще немного, наткнулся на открытые баги в дистрибутивах (Ubuntu #1377813, #1371758, Debian #761267). Коллеги усиленно напоминали о необходимости апдейтов, но мейнтейнеры не реагировали. Чтобы не устроить себе аврал к концу месяца, решил собрать пакеты и проапдейтить вручную. Важно отметить, что информацию о зонах в некотором софте, например, в MySQL, потребуется обновить вручную. Далее последует короткий мануал.

Ubuntu 12.04 / 14.04, Debian 7


К моменту, когда я решился собрать апдейты, в debian wheezy и почти сразу в ubuntu utopic появился пакет 2014h, поэтому я просто взял tzdata_2014h-2.dsc, tzdata_2014h.orig.tar.gz, tzdata_2014h-2.debian.tar.xz и собрал без особых изменений.

Поставил компиляторы:

apt-get install devscripts dpkg-dev debhelper build-essential


Распаковал исходники:

dpkg-source -x tzdata_2014h-2.dsc
cd tzdata-2014h


Поставил зависимости, подправил версию и собрал:

apt-get install default-jre-headless rdfind symlinks 
dch -i
dpkg-buildpackage -rfakeroot
cd ../


Осталось установить:

dpkg -i tzdata*deb


Ubuntu 10.04, Debian 6


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

Исходники были взяты в debian packages.debian.org/wheezy/rdfind, установлены зависимости и собран deb пакет.

dpkg-source -x rdfind_1.3.1-1.dsc
apt-get install nettle-dev
cd rdfind-1.3.0/
dpkg-buildpackage -rfakeroot
cd ../
dpkg -i rdfind*deb


Обновление в MySQL



UPD: Не сработает, если  time_zone = SYSTEM .
Решение без перезапуска -  SET GLOBAL time_zone = 'Europe/Moscow'; или 
 SET GLOBAL time_zone = '+03:00' , если таблицы не обновлены;


После обновления системной tzdata нужно получить tzinfo для MySQL скриптом из комплекта:

mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/tzinfo-mysql-2014h-2.sql


Далее, этот файлик заливаем в MySQL. Подключаемся с правами root, например, так:

mysql --defaults-file=/etc/mysql/debian.cnf


Выбираем базу, кодировку и файл:

use mysql
set names utf8;
source /tmp/tzinfo-mysql-2014h-2.sql


На момент окончания написания этого поста мейнтейнеры ubuntu, вероятно, среагировали на моё письмо в ubuntu-devel-discuss и протолкнули апдейты в proposed. Вероятно, в ближайшие дни апдейты tzdata прилетят из официальных репозиториев, но MySQL всё равно понадобится обновлять вручную.

UPD. Для OpenJDK апдейты поставятся вместе с системными, а для Sun/Oracle Java нужно воспользоваться «фирменной» утилитой.

UPD2. Инструкция от Ernillew, как настроить proposed: habrahabr.ru/post/240937/#comment_8080009.

UPD3. В trusty появилось 2014i, которое включает предыдущие изменения и новые для Беларуси.
«tzdata» versions published in Ubuntu

По состоянию на 2014-10-23 09:31 +0400 (инфа из launchpad.net/ubuntu/+source/tzdata/+bugs )

Trusty-security (2014i-0ubuntu0.14.04): main/libs 
Trusty-updates (2014i-0ubuntu0.14.04): main/libs 
Precise-security (2014i-0ubuntu0.12.04): main/libs 
Precise-updates (2014i-0ubuntu0.12.04): main/libs 
Lucid-security (2014i-0ubuntu0.10.04): main/libs 
Lucid-updates (2014i-0ubuntu0.10.04): main/libs 
Utopic-proposed (2014i-0ubuntu0.14.10): main/libs 
Trusty-proposed (2014i-0ubuntu0.14.04): main/libs 
Precise-proposed (2014i-0ubuntu0.12.04): main/libs 
Lucid-proposed (2014i-0ubuntu0.10.04): main/libs 
Utopic (2014h-2): main/libs 
Trusty (2014b-1): main/libs 
Precise (2012b-1): main/libs 
Lucid (2010i-1): main/libs 


UPD4. Для PHP в некоторых конфигурациях может понадобиться

pecl install timezonedb
echo "extension=timezonedb.so" > /etc/php5/conf.d/timezonedb.ini

# или, если уже было установлено
pecl upgrade timezonedb
@motienko
карма
6,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (58)

  • +2
    debian 7 (wheezy) — вчера приехало 2014h, в котором для России все в порядке.
    packages.debian.org/source/wheezy/tzdata

    Ubuntu — 12.04 LTS — действительно, еще нет.

  • 0
    Перевод часов в 2014 году затронет и многих хозяев смартфонов с Android, купленных на китайских сайтах, а также владельцев других устройств, не получающих автоматически обновления tzdata (планшетов, телевизоров, медиа-плееров, компьютеров с windows xp и т.д.).

    Для московского времени я предлагаю быстрый фикс проблемы: поменять временную зону на азиатскую (например, 'Asia/Baghdad') или африканскую (например, 'Africa/Mogadishu'). Для остальных регионов можно подобрать подходящую таймзону из регионов ближе к экватору или соседних областей России.
    • +3
      Для рутованных телефонов есть замечательная утилитка Timezone Fixer в маркете. Нерутованный китайский андроид, на мой взгляд, права на жизнь не имеет.
      • 0
        Пока что там только 2014f обновление.
        • 0
          Обновления 2014g и 2014f правила расчета времени после 26 октября для РФ не меняют. www.iana.org/time-zones/repository/releases/tzdata2014h.tar.gz, смотреть NEWS в архиве.
          • 0
            А мужики-то и не знают
            Release 2014f — 2014-08-05 17:42:36 -0700

            Changes affecting future time stamps

            Russia will subtract an hour from most of its time zones on 2014-10-26
            at 02:00 local time. (Thanks to Alexander Krivenyshev.)
            There are a few exceptions: Magadan Oblast (Asia/Magadan) and Zabaykalsky
            Krai are subtracting two hours; conversely, Chukotka Autonomous Okrug
            (Asia/Anadyr), Kamchatka Krai (Asia/Kamchatka), Kemerovo Oblast
            (Asia/Novokuznetsk), and the Samara Oblast and the Udmurt Republic
            (Europe/Samara) are not changing their clocks. The changed zones are
            Europe/Kaliningrad, Europe/Moscow, Europe/Simferopol, Europe/Volgograd,
            Asia/Yekaterinburg, Asia/Omsk, Asia/Novosibirsk, Asia/Krasnoyarsk,
            Asia/Irkutsk, Asia/Yakutsk, Asia/Vladivostok, Asia/Khandyga,
            Asia/Sakhalin, and Asia/Ust-Nera; Asia/Magadan will have two hours
            subtracted; and Asia/Novokuznetsk's time zone abbreviation is affected,
            but not its UTC offset. Two zones are added: Asia/Chita (split
            from Asia/Yakutsk, and also with two hours subtracted) and
            Asia/Srednekolymsk (split from Asia/Magadan, but with only one hour
            subtracted). (Thanks to Tim Parenti for much of the above.)
            • 0
              Да ё-моё, 2014h, конечно, там же по контексту понятно, что я имел в виду не то, что написал ;)
        • 0
          В 2014h — изменения только в прошлых годах. Не думаю, что кому-то на Андроиде важно, что было в Новокузнецке в 1920-ом году. Если только эстетам :) 2014g — тоже самое, только прошлые даты.
    • 0
      … или место проживания. Не обязательно на Africa/Mogadishu :D
  • 0
    Для Solaris 11 есть смысл запросить в поддержке IDR 1418.1, который апдейтит пакет timezone до версии 2014f. В SRU обновление таймзоны, по словам той же поддержки, появится не раньше декабря… В RHEL уже 2014h доступно, но Оракл не торопится.

    Пока готовился к переходу, обнаружился вот такой прекрасный баг в Солярке, причем он там с незапамятных времен: stackoverflow.com/questions/26401133/weird-mktime-behavior-in-solaris-11-2-bug-or-something-else Поддержку Оракла я известил, но им, похоже, пофигу.
    • 0
      Есть в наличии патч idr1417.1.p5p и idr1418.1.p5p.
      Они только под Solaris 11.2 sparc (под 11 и 11.1 не подойдут, саппорт обещает позднее).

      Также Оракл выпустил временный патч IDR151591-01 для перехода на зимнее время в Solaris 10. По заявлениям самморта, этот патч устанавливается заказчиками на свой страх и риск. Никаких гарантий Оракл не дает. Полноценных проверок не проводилось.
      Постоянный патч будет выпущен позднее. По предварительной информации от Оракл вовремя он выпущен не будет.
      Для установки данного временного патча требуется патч 148559-10 (или 142909-17).

      Под 10 sparc патч лично опробовал, проблем не возникло. Под 11.2 лично не проверял, нет таких серверов, жду под 11.1.

      Если кому надо, поделюсь.
      • 0
        А можно пока просто файл таймзоны скопировать с той системы, для которой есть патч, на ту, где патча нет…
        • 0
          Только что из саппорта поступил Набор IDR для Solaris 11.1 FCS (sparc).

          Пишут «Выход финальных патчей запланирован на период после 26-го Октября, Мало вероятно, что патчи будут до этой даты, пожалуйста воспользуйтесь IDR. »

          В наличии патч idr1444.1.p5p
  • –1
    Так же надо будет не забыть обновить таймзоны в PostgreSQL, я, к сожалению, его пока не знаю настолько, чтобы предлагать рабочий способ
  • 0
    А если в одно строчку:

    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
    
  • +1
    Я конечно извиняюсь, но зачем что-то собирать?
    wget http://mirror.yandex.ru/debian/pool/main/t/tzdata/tzdata_2014h-2_all.deb
    dpkg -i tzdata_2014h-2_all.deb
    


    На убунте тоже работает (12.04/14.04)
  • 0
    Зачем вы пересобирали пакеты для Debian/Ubuntu? Можно же просто поставить обновления
    • 0
      Когда ТС писал статью и обновлялся обновлений еще не было. Я сам сидел в готовности в свой репозиторий пакет собирать, но раз в proposed пришло, то
      sudo sh -c «echo 'deb archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-proposed restricted main multiverse universe' >> /etc/apt/sources.list»
      sudo apt-get update
      sudo apt-get install tzdata
      или как-то так.
      • 0
        Всё верно, так и было. Обновлений не было, на баги не реагировали.
        • 0
          Ну я просто сам в таком же состоянии сидел.
          Отдельное спасибо за напоминание про MySQL, а то бы мог и забыть.
        • 0
          В апдейт можно вынести помимо того, что появилось в proposed краткую инструкцию типа

          sudo sh -c «echo 'deb archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-proposed restricted main multiverse universe' >> /etc/apt/sources.list»

          В файл /etc/apt/preferences пишем

          Package: *
          Pin: release a=trusty-proposed
          Pin-Priority: 400

          И

          sudo apt-get update && sudo apt-get -t -y trusty-proposed install tzdata && sudo apt-get -y dist-upgrade

          В /etc/apt/preferences пишем, что бы все из proposed не притащило, а можно было оттуда ставить только то, что нам нужно.
          Для precise меняем trusty на precise.

          Ну или можно допилить инструкцию еще засунув в echo содержимое /etc/apt/preferences
          Просто дабы те, кто столкнутся первый раз с проблемами не мучались.

          P.S. Злой хабр кавычки заменил в первой команде с нужных на елочки.
          • 0
            добавил ссылку на этот камент.
  • 0
    Я так понял, MySQL использует существующие tzdata из системы если иное не указано в соответствующих таблицах. И все эксторты-импорты в sql ни к чему. Достаточно перезапустить MySQL после обновления системных tzdata. Попправьте меня, если я не прав.
    • 0
      Возможно вы правы, но экспериментировать на продакшне не хотелось бы. Когда «отменяли» переход в 2011 г., у нас был mysql 5.1 и точно пришлось обновлять таблицы. Возможно, в свежих версиях mysql что-то изменилось. К вопросу перезапуска — у нас, например, плановый перезапуск возможен только ночью в выходной день, с предварительным оповещениям о работах. Обновить же данные в таблицах можно в рабочем порядке.
      • 0
        Кстати. В документации по 5.6 сказано, раздел 4.4.6:
        After running mysql_tzinfo_to_sql, it is best to restart the server so that it does not continue to use any previously cached time zone data
        , т.е. сервер всё-таки нужно перезапустить дабы случайно не начали использоваться ранее закешированные данные.
        Похоже, сервер может работать и без этих таблиц. Но в данном случае нельзя указать часовой пояс (Вроде Asia/Yekaterinburg) при работе с MySQL, т.е. не будет работать SET timezone и SET GLOBAL timezone.
        • 0
          Спасибо, действительно, рекомендуют перезапускать. Но в нашей конкретной конфигурации мы, вероятно, будем считать, что если обновились tz за неделю до события, то кеши к моменту перевода уже почистятся.
          • 0
            В итоге не отработало правильно. Пришлось сделать SET GLOBAL time_zone = '+03:00';
  • 0
    Статья полезна, но в общем-то не очень нужна, поскольку и в debian (6-lts, 7, 8) и в ubuntu (10.04-lts, 12.04-lts и 14.04-lts) обновления пришли.
    • 0
      А покажи где у тебя видно?, у меня:
      root@tk-wordpress-01v:~# apt-cache policy tzdata
      tzdata:
        Installed: 2014c-0ubuntu0.12.04
        Candidate: 2014e-0ubuntu0.12.04
        Version table:
           2014e-0ubuntu0.12.04 0
      
      root@tk-wordpress-01v:~# lsb_release -a
      No LSB modules are available.
      Distributor ID: Ubuntu
      Description:    Ubuntu 12.04.4 LTS
      Release:        12.04
      Codename:       precise
      
      

      apt-get update понятное дело сделано
      • 0
        sudo sh -c «echo 'deb archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-proposed restricted main multiverse universe' >> /etc/apt/sources.list»
        sudo apt-get update
        apt-cache policy tzdata

        P.S. Парсер заменяет кавычки на елки и сжирает http:// перед адресом, сами исправьте.
        Обновление в proposed
        • 0
          Про proposed видел выше, спасибо. Ожидал что в стандартные приехало.
          • 0
            К сожалению нет. Сам сегодня обновлял все что под руку попало, потому и привел построчную инструкцию :)
            • 0
              В trusty появилось 2014i, которое включает предыдущие изменения и новые для Беларуси.
            • 0
              Прилетело таки
              tzdata (2014i-0ubuntu0.12.04) precise; urgency=critical

              * New upstream release with zone changes in 4 days for Belarus.

              — Adam Conrad <adconrad@ubuntu.com> Wed, 22 Oct 2014 17:22:43 -0600

              tzdata (2014h-0ubuntu0.12.04) precise; urgency=critical

              * New upstream release, critical urgency for Russian zone
              changes coming up on October 26th, 2014 (LP: #1377813)

              — Adam Conrad <adconrad@ubuntu.com> Fri, 17 Oct 2014 13:32:38 +0200


              packages.ubuntu.com/precise/tzdata
  • –1
    Скажите, а не проще ли сейчас делать примерно так по обновлению tzdata:
    wget скачиваем самый свежий deb пакет отсюда: launchpad.net/ubuntu/+source/tzdata
    потом sudo dpkg -i <самый свежий пакет tzdata>.deb

    Я пробовал на 12 lts через aptitude найти и поставить нужный пакет tzdata, но там самый свежий только с литерой 'e' ставится.
    • +1
      Сейчас проще поставить из proposed, как я предложил. Нормально aptом, из убунтовского репозитория.
  • 0
    MySQL как-то не хочет с этим фиксом работать. select now() выдает старое время, а рестартовать все базы не хочется, пусть даже и ночью.
    Проверял так — обновляю tzdata, делаю mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql и перевожу время date -u -s «25 oct 2014 21:55:55»
    И чуда не случилось…
    • 0
      Аналогично, для 5.5, 5.6 не сработало.
      Для runtime помогло руками выставить смещение относительно UTC:

      SET time_zone = '+03:00';
      • 0
        От этого отказались, т.к. база переставала понимать правильно таймштампы дат ДО перехода. В итоге в ночи рестартанули :(
        • 0
          Да, не отработало. Пришлось сделать SET GLOBAL time_zone = '+03:00';
          • 0
            А что у вас не так? У нас все даты записанные с воскресенья отображаются правильно, а те, которые были записаны до 26.10, но на числа >26.10 отображаются на час меньше, т.е.:

            2014-10-23 00:00:00
            2014-10-26 23:00:00 (должно быть 2014-10-27 00:00:00)

            Поидее в обоих случаях должна быть полночь.
    • 0
      В mysql надо данные tzdata особым образом перерилить. читайте документацию!

      dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
  • 0
    Появилось 2014i, см. UPD3.
    • 0
      Сейчас проверял эту версию пакета на Ubuntu 12.04 в VirtualBox'е.
      sudo apt-get update
      sudo apt-get install --only-upgrade tzdata
      sudo date --set «26 Oct 2014 01:59:55»

      И в 2 ночи не откатывается время на час назад :(

      P.S. Синхронизацию времени виртуалки с хостом выключил. Временная зона — «Europe/Moscow».
      • 0
        А нет, все работает верно.
        Правильный способ проверки описан тут.
  • 0
    Господа, имеется Debian stable.
    Системная tzdata — понятно.
    Мускульные tz таблицы на основе новой системной tzdata — понятно.

    А кто скажет за PHP? Там в PHP для Debian'а информация о часовых поясах юзается системная или своя, вшитая в PHP?
    • 0
      Вопрос интересный. Нашлось вот такое pecl.php.net/package/timezonedb
      • 0
        php.net/manual/en/function.timezone-version-get.php
        For a newer version, you must upgrade via the PECL extension (sudo pecl install timezonedb)
        • 0
          Добавил UPD4
      • 0
        В исходниках пакета PHP на Debian, в changelog'е написано, что с 5.2.6 юзается системный tzdata.
        Так что, думаю, можно не переживать.

        Однако, стоит упомянуть, что если по криворукости кто-то на сервере использует, скажем, Etc/GMT-4, вместо нормального Europe/Moscow, то бегом менять на правильный. Иначе в час Х у Вас ничего не произойдёт.
        • 0
          Не знаю, как дефолтный, но если собирать под свои нужды самому — то можети не юзать.
          Если собран с опцией --with-system-tzdata то использует системную, если нет — то нужен модуль timezonedb
  • 0
    Для Ubuntu Saucy 13.10 tzdata так и не обновили до 2014i так что решил проблему установкой вручную пакета из Ubuntu Trusty 14.04 вот так:
    wget http://launchpadlibrarian.net/187931384/tzdata_2014i-0ubuntu0.14.04_all.deb
    dpkg -i ./tzdata_2014i-0ubuntu0.14.04_all.deb
    
  • 0
    Мне кажется, что это всё — ненужные танцы, уж простите.
    Проще жить по UTC, а танцы с переводом стрелок оставить энергетикам, железнодорожникам и лично Президенту.
    • +1
      Я тоже хочу в вашу страну розовых поней, где можно жить по UTC и не обращать внимание на изменения поясов. Там, наверное, здорово.
      А вы не думали, что здесь сидят и те, кто админят сервера энергетиков и железнодорожников? Что точное время нужно для биржевиков, баннерных систем и онлайн игр?
      А жить по UTC здорово, пока продукты вам покупают родители и админите вы свой локалхост. А вот как только пойдете в магазин по UTC, то узнаете, что когда в Лондоне 20 часов и магазин должен вроде работать в Мск уже 23 часа и магазин закрыт.
      • 0
        Вот и хочется ответить нечто вида «Мой локалхост в твою стойку не влезет, парниша» — не я начал оскорблять ).
        Ну почему вроде бы умные люди так держатся за стандарт каких-то абсолютных поясов, когда мыслят все равно относительными («магазин закроется через два часа»), учитывают это в коде итд?

        UTC — валидная опция для существования в качестве системы отсчета времени и указать на этот факт порой стоит. А то так и будут все раз в год делать абсолютно ненужные танцы с таймзонами.

        P.S. Около дома 3 открытых 24/7 магазина, время в Лондоне стабильно известно — надо ж знать, чо там клиенты-биржевики, спят или не спят, ЧЯДНТ?

        P.P.S. BREAKING NEWS: 24-часовой день и григорианский календарь — это условности того же порядка. Разница в том, что их не тюнят раз в год, а так, в 1918гг у вас тоже б неслабо бомбануло б при необходимости апдейтить tzdata на всех гроссбухах -_-
        • 0
          Я не оскорблял, просто ваши рассуждения очень напоминают рассуждения того, кто живет в выдуманном мире.
          А я живу в реальном и, увы, вынужден с этим мирится.
          Мне на серверах нужно только время по Москве и с большой точностью.
          При этом я пытался, в свое время, убедить на переход на UTC, но не вышло. Реальная жизнь далека от идеала, увы.
          По мне так пусть будет один часовой пояс на всю страну, как в Китае или на весь мир вообще, а считать будем в unix-time или в «звездных датах». Я-то поддержу. Но нас будет двое.
          • 0
            … но… но ведь UTC — это то, из чего потом округлением получается GMT и Москва GMT+realpolitik… странные они, эти человеки )
  • 0
    Спасибо!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.