Перейти к содержанию

Как перейти с MySQL на PostgreSQL

Перед переносом данных из MySQL в PostgreSQL подготовьте окружение, проверьте ограничения и выберите способ миграции: через мастер или командную строку.

PostgreSQL поддерживается в лицензии Битрикс24 Энтерпрайз для Постгрес и в лицензии 1С-Битрикс: Управление сайтом Энтерпрайз для Постгрес.

Подготовить окружение

Перед миграцией установите и настройте PostgreSQL. Используйте BitrixVM или инструкцию по настройке окружения для вашей операционной системы. Для локального окружения на macOS используйте статью Установка PostgreSQL на macOS.

BitrixVM

BitrixVM версии 9.0.8 и выше включает PostgreSQL 13.x по умолчанию. Обновите PostgreSQL до версии 15.x или 16.x через меню виртуальной машины.

macOS

Установите PostgreSQL по официальной инструкции.

Другие операционные системы

Инструкции по установке и настройке PostgreSQL для Debian, Альт СП, Альт и РОСА доступны в главе Установка БУС/КП на другие окружения.

Как выполнить миграцию

  • Перед началом убедитесь, что срок действия вашей текущей лицензии покрывает период тестирования (до 6 месяцев) и момент финального перехода. Если лицензия истекает раньше, продлите ее до начала работ.
  • Перейдите на лицензию «Энтерпрайз для Постгрес». После приобретения перехода вы получите:
  • купон для перехода на лицензию «Энтерпрайз для Постгрес». Активируйте купон после тестирования миграции,
  • ключ для тестирования миграции работающего сайта на отдельной установке продукта. Максимальный срок тестирования — 6 месяцев с момента приобретения лицензии. В течение этих 6 месяцев основной рабочий сайт продолжает работать на MySQL с вашей текущей действующей лицензией. Тестовый ключ используется только на тестовом контуре.
  • Перед миграцией установите и обновите модуль Монитор производительности до версии 24.0.0.
  • Проект должен использовать кодировку UTF-8. Подробнее в статье Кодировка.
  • На время миграции закройте доступ к сайту для посетителей, чтобы избежать изменений в данных в процессе копирования.

Важно учитывать

  • Вернуться на MySQL после миграции, тестирования и запуска PostgreSQL в рабочем контуре можно только вручную.
  • Если на проекте используются модули из маркетплейса, проверьте их совместимость с новой СУБД или обратитесь к разработчикам модуля.
  • Кастомизированный проект может потребовать доработок для новой СУБД. Перед миграцией проверьте измененный код.

Выбрать способ миграции

  1. Вручную с консоли сервера.
  2. С помощью мастера, встроенного в продукт.

Не все модули поддерживают PostgreSQL. После миграции функции таких модулей будут отключены. Список отключаемых модулей отображается на первом шаге мастера конвертации.

При ручной миграции получите список из командной строки.

for mysql in `ls bitrix/modules/*/install/mysql/install.sql bitrix/modules/*/install/db/mysql/install.sql`;
do
pgsql=`echo $mysql|sed 's#/mysql/#/pgsql/#'`;
test -e $pgsql || echo $pgsql
done

Порядок действий для миграции

  1. Проверьте перенос на тестовом контуре:
  2. сделайте резервную копию проекта,
  3. разверните резервную копию на тестовом контуре,
  4. обновите тестовую версию проекта до последних версий продукта,
  5. проверьте кастомизированный сайт на совместимость доработок с СУБД PostgreSQL,
  6. поменяйте лицензионный ключ на ключ для тестирования миграции, предоставленный после приобретения перехода на лицензию «Энтерпрайз для Постгрес»,
  7. выполните тестовую миграцию выбранным способом,
  8. проверьте проект.
  9. Обновите рабочую версию проекта до последних версий продукта.
  10. Активируйте купон перехода на новую версию продукта в продуктивном контуре.
  11. Выполните миграцию.
  12. Проверьте проект.

Миграция через мастер

Перейдите в административный раздел Рабочий стол > Настройки > Настройки продукта > Список мастеров и запустите мастер Миграция в PostgreSQL bitrix:perfon.pgsql. Начнется пошаговый процесс миграции.

  1. Сначала мастер проверяет минимальные требования. Модули, не поддерживающие PostgreSQL, нужно деинсталлировать на странице «Управление модулями» в разделе Рабочий стол > Настройки > Настройки продукта > Модули.

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

  1. Задайте имя пользователя, пароль и базу данных для миграции.

Если возникнет ошибка, система ее отобразит. Исправьте ошибку и нажмите «Далее».

  1. После создания базы данных и проверки подключения добавьте подключение в файл /bitrix/.settings.php. Откройте ссылку в окне мастера, чтобы отредактировать файл в новой вкладке. В файле должен появиться блок подключения:

'connections' => [
    'value' => [
        'default' => [
            'className' => '\\Bitrix\\Main\\DB\\MysqliConnection',
            'host' => 'localhost',
            'database' => 'cp',
            'login' => 'cp',
            'password' => 'cp',
            'options' => 2,
            'charset' => 'utf8',
            'include_after_connected' => '',
        ],
        'default_pgsql' => [
            'className' => '\\Bitrix\\Main\\DB\\PgsqlConnection',
            'host' => 'localhost',
            'database' => 'portal',
            'login' => 'bitrix',
            'password' => 'passwd',
            'options' => 2,
            'charset' => 'utf-8',
            'include_after_connected' => '',
        ],
    ],
    'readonly' => true,
]
5. На следующем шаге мастера выберите добавленное подключение.

На время копирования таблиц из MySQL сайт будет закрыт от посетителей. Данные не должны изменяться во время копирования, иначе целостность базы данных может быть нарушена.

После этого начнется процесс копирования данных.

  1. Дождитесь сообщения об окончании копирования. Время выполнения процесса зависит от объема данных, мощности сервера и настроек базы данных.

  1. Отредактируйте .settings.php: переименуйте подключения в разделе connections.
  2. default в default_mysql.
  3. default_pgsql в default.

Миграция через мастер завершена.

Примечание

Сайт для доступа откроется автоматически после завершения миграции.

Миграция через командную строку

  1. Создайте пользователя и базу PostgreSQL.

bash prompt="$" $ sudo -u postgres createuser bitrix $ sudo -u postgres psql -c 'grant create on schema public to "bitrix"' GRANT $ sudo -u postgres createdb portaldb --owner bitrix --lc-ctype C.UTF-8 --template=template0 $ sudo -u postgres psql -d portaldb -c 'CREATE EXTENSION IF NOT EXISTS pgcrypto' CREATE EXTENSION $ sudo -u postgres psql -d portaldb -c 'ALTER USER "bitrix" WITH PASSWORD '\''passwd'\''' ALTER ROLE 2. Остановите cron и веб-сервер, чтобы данные не изменялись во время переноса.

bash prompt="$" $ systemctl stop cron $ systemctl stop apache2 $ systemctl stop php-fpm $ systemctl stop nginx 3. Сделайте дамп базы данных MySQL.

bash prompt="$" $ mysqldump --opt --skip-extended-insert --hex-blob -u root portaldb > /tmp/mysql_dump.sql 4. Сконвертируйте его в PostgreSQL.

bash prompt="$" $ php -f bitrix/modules/perfmon/tools/mysql_to_pgsql.php -- --mysqldump=/tmp/mysql_dump.sql > /tmp/pgsql_dump.sql 5. Убедитесь, что все получилось.

bash prompt="$" $ less /tmp/pgsql_dump.sql 6. Добавьте дамп в PostgreSQL.

bash prompt="$" $ sudo -u www-data psql -b -q --user bitrix -d portaldb -f /tmp/pgsql_dump.sql 7. Добавьте дополнительные функции в PostgreSQL.

bash prompt="$" $ grep -v 'ALTER TABLE b_group' bitrix/modules/main/install/pgsql/install_add.sql | sudo -u www-data psql -b -q --user bitrix -d portaldb 8. Отредактируйте файл .settings.php.

```bash prompt="$" $ vi bitrix/.settings.php

```php
'connections' => [
    'value' => [
        'default' => [
            'className' => '\\Bitrix\\Main\\DB\\PgsqlConnection',
            'host' => 'localhost',
            'database' => 'portaldb',
            'login' => 'bitrix',
            'password' => 'passwd',
            'options' => 2,
            'charset' => 'utf-8',
            'include_after_connected' => '',
        ],
    ],
],
9. Удалите модули без поддержки PostgreSQL.

``bash prompt="$" $ for mysql inls bitrix/modules//install/mysql/install.sql bitrix/modules//install/db/mysql/install.sql; do pgsql=echo $mysql|sed 's#/mysql/#/pgsql/#'; test -e $pgsql || sudo -u postgres psql -d portaldb -a -c "delete from b_module where id='echo $pgsql|cut -d '/' -f 3`'"; done

delete from b_module where id='abtest' DELETE 0 delete from b_module where id='advertising' DELETE 0 delete from b_module where id='b24connector' DELETE 0 delete from b_module where id='biconnector' DELETE 0 ........ ``` 10. Запустите сервисы.

```bash prompt="$"
$ systemctl start cron
$ systemctl start apache2
$ systemctl start php-fpm
$ systemctl start nginx
```