image
В последнее время клиенты нашей компании все чаще обращаются с просьбой осуществить переход с MySQL на PostgreSQL. Действительно, активное развитие PostgreSQL дает повод разработчикам задуматься о смене СУБД. Зачастую при этом встает вопрос о переносе больших объемов данных, которыми «обросла» существующая база под MySQL.

Мы сами являемся активными пользователями Redmine и разработчиками плагинов для него, потому и выбрали эту CRM для иллюстрации процесса миграции.

Ниже описывается один из способов миграции с БД MySQL на PostgreSQL 9.5 для Redmine на ОС CentOS 6.



Итак, начнём:

1. Для начала устанавливаем репозиторий PostgreSQL 9.5

rpm -ihv https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-x86_64/pgdg-centos95-9.5-2.noarch.rpm


2. Устанавливаем сам PostgreSQL 9.5.

yum install postgresql95-server postgresql95-contrib postgresql95-devel
service postgresql-9.5 initdb ru_RU.utf8
chkconfig postgresql-9.5 on

alternatives --install /usr/bin/psql psql /usr/pgsql-9.5/bin/psql 5000
alternatives --install /usr/bin/pg_dump pg_dump /usr/pgsql-9.5/bin/pg_dump 5000
alternatives --install /usr/bin/pg_config pg_config /usr/pgsql-9.5/bin/pg_config 5000
alternatives --install /usr/bin/createdb createdb /usr/pgsql-9.5/bin/createdb 5000
alternatives --install /usr/bin/createuser createuser /usr/pgsql-9.5/bin/createuser 5000
alternatives --install /usr/bin/dropdb dropdb /usr/pgsql-9.5/bin/dropdb 5000
alternatives --install /usr/bin/dropuser dropuser /usr/pgsql-9.5/bin/dropuser 5000
alternatives --install /usr/bin/pg_dumpall pg_dumpall /usr/pgsql-9.5/bin/pg_dumpall 5000
alternatives --install /usr/bin/createuser createuser /usr/pgsql-9.5/bin/createuser 5000


3. Делаем тюнинг PostgreSQL с помощью pgtune.leopard.in.ua, добавляем откорректированные настройки в конец файла.

4. Настраиваем авторизацию PostgreSQL таким образом, чтобы авторизоваться могли только с localhost по сети или через сокет, а root мог ходить под пользователем «postgres» без пароля.

pg_hba.conf:
local   all             postgres        ident                   map=supervisor
host    all             all             127.0.0.1/32            md5


pg_ident.conf:
supervisor      postgres                postgres
supervisor      root                    postgres


5. Создаем пользователя и БД «redmine» в PostgreSQL:
createuser --username=postgres --no-superuser --no-createdb --no-createrole --encrypted redmine
createdb --username=postgres  --encoding=utf-8 --template=template0 --owner=redmine redmine
psql --username=postgres --dbname=postgres --command="ALTER USER \"redmine\" WITH ENCRYPTED PASSWORD 'yourgreatpassword'"


6. Прописываем данные авторизации PostgreSQL, комментируем авторизацию MySQL в redmine/config/database.yml:
# обратите внимание, перед настройками два пробела (!)
production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: "yourgreatpassword"


7. Устанавливаем инструмент для миграции данных.

Мой выбор остановился на py-mysql2pgsql. Инструменты типа yaml_db не дали эффекта — Redmine упорно выдавал ошибку при запуске миграций.

Настраиваем py-mysql2pgsql.

Устанавливаем:
yum install python-pip python-devel
pip install py-mysql2pgsql


Делаем первый запуск, создаем шаблон файла конфигурации:
py-mysql2pgsql


Редактируем py-mysql2pgsql.yml, вносим данные авторизации MySQL и новой базы PostgreSQL.

Выполняем миграцию данных. Для базы данных размером 1 Гб на среднем сервере этот процесс занял порядка 15 минут.
py-mysql2pgsql -v -f mysql2pgsql.yml


Вот и все!

Задавайте любые вопросы, пишите ваши рекомендации. Буду рад обсудить в комментариях.

P.S. Подобным образом мы выполнили миграцию базы данных Zabbix размером 200 Гб с MySQL на PostgreSQL. Работает!

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


  1. chemtech
    05.05.2016 11:21
    +2

    Может быть опишите основные причины, которые, по вашему мнению, подталкивают на миграцию с MySQL на PostgreSQL? Можно добавить в начало статьи.


  1. spartan
    05.05.2016 13:26
    +2

    А в чем конкретно преимущества postgresql над mysql для редмайна?


    1. Sleuthhound
      05.05.2016 19:36
      -2

      По моему — абсолютно никакого, сомневаюсь, что у кого-то база mysql для redmine больше 2-3 Гб.
      У одного моего знакомого, который обслуживает БД, есть база на mysql в 10 Тб и ничего, живут и работают и никуда мигрировать не собираются.


      1. stalkerg
        05.05.2016 23:20
        +3

        А причём тут размер БД? Postgres хорош и на маленьких БД.


        1. Sleuthhound
          06.05.2016 07:36
          -1

          Как правила на Pg мигрируют с платного Oracle, покрайней мере мой знакомый осуществляет такие миграции и в принципе Pg позиционируется как замена Oracle и размер БД как раз имеет значения.
          Попробуйте мигрировать с Oracle на MySQL базу 100Тб, мой знакомый делал миграцию именно на Pg и не потому что на MySQL было невозможно, а потому, что MySQL умрет на таком объеме данных.


  1. bizzonaru
    05.05.2016 13:58

    А как идет миграци индексов, тригеров и прочее? Зачастую индексы при нагрузке кастомизируешь под особенности mysql. Просто перелить данные можно и обычным скриптом.


  1. BasilioCat
    05.05.2016 14:06

    Не менее интересно услышать преимущества PostgreSQL для zabbix. В версиях 2.x заббикс активно апдейтил таблицы (в первую очередь items), что в комплекте с версионностью строк в PostgreSQL приводит к постоянному ваккуумированию. Структуру таблиц изменили в 3.0 (или даже в 2.4), но рекомендуемая БД для Заббикса по-прежнему MySQL.
    PostgreSQL содержит весьма интересные возможности (особенно 9.4+), но обычное ПО редко их использует.


    1. alexvl
      12.05.2016 10:28

      Дело в том, что уже начиная с 2.2 количество аптейтов значитильно снизилось. Практически вся конфигурация кешируется в памяти и в апдейтах нет необходимости. У разработчиков Zabbix нет предпочтений по выбору базы данных, смело используйте то, что лучше знаете: MySQL или PostgreSQL. PostgreSQL отличный выбор.

      Документация устарела, исправим!


  1. Obramko
    05.05.2016 22:43
    -1

    pip install py-mysql2pgsql

    Тогда уж make install, чего мелочиться.
    Используйте virtualenv.


    1. eirnym
      06.05.2016 15:24

      В случае с virtualenv, вы выполните ту же команду с pip.

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