Миграция Битрикс на PostgreSQL

Миграция Битрикс на PostgreSQL

Существует два способа миграции: вручную и с помощью мастера.

Для обоих необходимо учитывать, что не все модули поддерживаются и после миграции какой-то функционал будет отключен.
Так же перед началом миграции надо убедиться, что у вас есть лицензионный ключ подходящий для редакции с поддержкой PostgreSQL иначе не будут доступны обновления Битрикс.

[spoiler]

Требования:

Перед миграцией необходимо установить и обновить модуль "Монитор производительности".
Так же необходимым требованием является использование кодировки UTF-8 на установке.
Учтите, что на время копирования данных из базы данных MySQL нужно будет закрыть доступ к сайту для посетителей чтобы избежать внесения изменений в данных в процессе копирования.
Важным является так же то, что после миграции, тестирования работы и включения PostgreSQL в штатную работу обратный процесс переключения на MySQL (перенос данных из PostgreSQL) возможен только вручную.

Первый способ: с помощью мастера миграции:

Идём в админку: Рабочий стол -> Настройки -> Настройки продукта -> Список мастеров (/bitrix/admin/wizard_list.php?lang=ru) и запускаем мастер.


На первом шаге проверяются минимально достаточные требования:


При наличии модулей не поддерживающих PostgreSQL необходимо их деинсталлировать на странице Рабочий стол > Настройки > Настройки продукта > Модули "Управление модулями".

Нажимаем "Далее".

На втором шаге выбираем способ которым будет (или уже) создана база данных PostgreSQL


Указываем логин и пароль администратора для создания пользователя и базы мастером:


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


В случае возникновения ошибки она будет показана и после её исправления надо будет нажать "Далее".


Если создание и подключение к базе данных прошли успешно, то будет предложено добавить это подключение в файл /bitrix/.settings.php


Щёлкаем по ссылке и в новой вкладке откроется файл для редактирования.
Должно получиться что-то вроде:

 'connections' => 
  array (
    'value' => 
    array (
      'default' => 
      array (
        'className' => '\\Bitrix\\Main\\DB\\MysqliConnection',
        'host' => 'localhost',
        'database' => 'cp',
        'login' => 'cp',
        'password' => 'cp',
        'options' => 2,
        'charset' => 'utf8',
        'include_after_connected' => '',
      ),
      'default_pgsql' =>
       array (
         'className' => '\\Bitrix\\Main\\DB\\PgsqlConnection',
          'host' => 'localhost',
          'database' => 'portal',
          'login' => 'bitrix',
          'password' => 'passwd',
           'options' => 2,
           'charset' => 'utf-8',
       ),
    ),
    'readonly' => true,
  ),
Вкладку можно не закрывать она нам ещё пригодится.



На следующем шаге мастера выбираем добавленное подключение


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



После нажатия на кнопку "Далее".
Сайт (публичная часть) будет закрыт для посетителей в настройках Главного модуля:


И начнётся процесс копирования данных:



Дожидаемся сообщения об окончании копирования:


Отредактируйте .settings.php переименовав подключения:


Поздравляем! Всё готово:


Второй способ из консоли:


Создаём пользователя и базу PostgreSQL
root@cp:/var/www/html# sudo -u postgres createuser bitrix 
root@cp:/var/www/html# sudo -u postgres psql -c 'grant create on schema public to "bitrix"' 
GRANT 
root@cp:/var/www/html# sudo -u postgres createdb portaldb --owner bitrix --lc-ctype C.UTF-8 --template=template0 
root@cp:/var/www/html# sudo -u postgres psql -d portaldb -c 'CREATE EXTENSION IF NOT EXISTS pgcrypto' 
CREATE EXTENSION 
root@cp:/var/www/html# sudo -u postgres psql -d portaldb -c 'ALTER USER "bitrix" WITH PASSWORD '\''passwd'\'''  
ALTER ROLE

Останавливаем cron и веб-сервер, чтобы избежать модификации данных во время переноса.
root@cp:/var/www/html# systemctl stop cron 
root@cp:/var/www/html# systemctl stop apache2 
root@cp:/var/www/html# systemctl stop php-fpm 
root@cp:/var/www/html# systemctl stop nginx

Делаем дамп базы данных MySQL
root@cp:/var/www/html# mysqldump --opt --skip-extended-insert --hex-blob -u root portaldb > /tmp/mysql_dump.sql

Конвертируем его в PostgreSQL
root@cp:/var/www/html# php -f bitrix/modules/perfmon/tools/mysql_to_pgsql.php -- --mysqldump=/tmp/mysql_dump.sql > /tmp/pgsql_dump.sql

Убеждаемся, что всё получилось
root@cp:/var/www/html# less /tmp/pgsql_dump.sql

Заливаем дамп в PostgreSQL
root@cp:/var/www/html# sudo -u www-data psql -b -q --user bitrix -d portaldb -f /tmp/pgsql_dump.sql

Дополнительные функции в PostgreSQL
root@cp:/var/www/html# 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

Редактируем .settings.php
root@cp:/var/www/html# vi bitrix/.settings.php
'connections' =>
  array (
    'value' => 
    array (
      'default' =>
      array (
        'className' => '\\Bitrix\\Main\\DB\\PgsqlConnection',
        'host' => 'localhost',
        'database' => 'portaldb',
        'login' => 'bitrix',
        'password' => 'passwd',
        'options' => 2,
        'charset' => 'utf-8', 
        'include_after_connected' => '',
      ),
    ),


Удаляем модули без поддержки PostgreSQL
root@cp:/home/max/sites/php74cp1251.cp/html# 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 || 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
........

Запускаем сервисы

root@cp:/var/www/html# systemctl start cron
root@cp:/var/www/html# systemctl start apache2
root@cp:/var/www/html# systemctl start php-fpm
root@cp:/var/www/html# systemctl start nginx
0
01.04.2024 19:26:37
Максим, а для каких редакций доступен Postgres?
Ссылка 0
0
02.04.2024 15:20:25
Там сейчас обновления модулей выходят, в описании обновлений указано "Добавлена поддержка PostgreSQL", в Бизнес поддержка точно есть
Родитель Ссылка 0
2
02.04.2024 15:31:17
Привет!
Совсем скоро выйдет специальный дистрибутив с поддержкой PostgreSQL.
Следите за анонсами.
Родитель Ссылка 2
0
02.04.2024 15:30:37
Как получить данного мастера по миграции, если его нет?
Ссылка 0
1
02.04.2024 17:32:22
Мастер выйдет в обновлении perfmon 24.0.0 которое сейчас тестируется.
Скоро скоро
Родитель Ссылка 1

Яндекс.Метрика