Redmine: миграция с MySQL на PostgreSQL 9.5
В последнее время клиенты нашей компании все чаще обращаются с просьбой осуществить переход с 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. Работает!