Для обоих необходимо учитывать, что не все модули поддерживаются и после миграции какой-то функционал будет отключен.
Так же перед началом миграции надо убедиться, что у вас есть лицензионный ключ подходящий для редакции с поддержкой 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 |
Совсем скоро выйдет специальный дистрибутив с поддержкой PostgreSQL.
Следите за анонсами.
Скоро скоро