DNSmanager по умолчанию использует в качестве СУБД (системы управления базами данных) SQLite. Эту СУБД удобно использовать при небольших объёмах данных и низких нагрузках, что характерно для DNSmanager. Однако, если в DNSmanager добавлено большое количество доменов и к нему поступает большое количество конкурентных запросов, рекомендуем использовать СУБД MySQL.

Алгоритм перехода с SQLite на MySQL


Алгоритм состоит из шагов:

  1. Установите и запустите MySQL:

    Для CentOS

    yum install mariadb-server
    service mariadb start
    BASH

    Для Debian

    apt-get install mysql-server
    service mysqld start
    BASH
  2. Измените стандартное имя файла core: 

    mv /usr/local/mgr5/bin/core /usr/local/mgr5/bin/core2
    CODE
  3. Остановите процесс core: 

    pkill core
    CODE
  4. Создайте в MySQL базу данных:

    create database dnsmgr default character set utf8mb4;
    BASH
  5. Замените в конфигурационном файле DNSmanager (по умолчанию /usr/local/mgr5/etc/dnsmgr.conf) строку "DBType sqlite" на "DBType mysql".

  6. Также в конфигурационном файле укажите параметры подключения к базе данных:
    • DBHost — адрес сервера с MySQL, на котором находится база данных. По умолчанию — "localhost";
    • DBUser — пользователь базы данных. По умолчанию — "root";
    • DBPassword — пароль пользователя базы данных, заданного параметром DBUser;
    • DBName — имя базы данных. По умолчанию — "dnsmgr".
  7. Если нужно, перенесите данные из SQLite в MySQL:
    1. Создайте дамп базы данных:

      sqlite3 /usr/local/mgr5/etc/dnsmgr.db .dump > /root/dnsmgr.db.sqlite
      BASH
      /root/dnsmgr.db.sqlite — файл, в который будет записан дамп.
    2. Выполните замены в файле дампа:

       replace "BEGIN TRANSACTION" "START TRANSACTION" -- /root/dnsmgr.db.sqlite
       replace "PRAGMA foreign_keys=OFF;" "SET NAMES utf8mb4;" -- /root/dnsmgr.db.sqlite
       replace "ON CONFLICT FAIL" "" -- /root/dnsmgr.db.sqlite
       replace "usage VARCHAR(64)" "\`usage\` VARCHAR(64)" -- /root/dnsmgr.db.sqlite
       replace "noauto VARCHAR(3)" "\`noauto\` VARCHAR(3)" -- /root/dnsmgr.db.sqlite
       replace "DEFAULT \`off\`" "DEFAULT 'off'" -- /root/dnsmgr.db.sqlite
       awk 'FS = "\"" {if($1=="INSERT INTO ") {print($1$2$3)} else {print}}' /root/dnsmgr.db.sqlite > /root/dnsmgr.db.mysql
      BASH
    3. Разверните базу данных для MySQL из дампа:

      mysql -uroot -p dnsmgr < /root/dnsmgr.db.mysql
      BASH
      /root/dnsmgr.db.sqlite — файл дампа.
  8. Перезапустите DNSmanager. Если перенос данных из SQLite в MySQL не был выполнен, то DNSmanager запустится с чистой базой данных.
  9. Верните файлу core стандартное имя: 

    mv /usr/local/mgr5/bin/core2 /usr/local/mgr5/bin/core
    CODE
  10. Перезапустите процесс core: 

    pkill core
    CODE

Скрипт конвертации


Для выполнения пунктов 2–10 алгоритма можно воспользоваться скриптом:

#!/bin/bash
mv /usr/local/mgr5/bin/core /usr/local/mgr5/bin/core2
pkill core
sqlite3 /usr/local/mgr5/etc/dnsmgr.db .dump > /root/dnsmgr.db.sqlite
replace "BEGIN TRANSACTION" "START TRANSACTION" -- /root/dnsmgr.db.sqlite
replace "PRAGMA foreign_keys=OFF;" "SET NAMES utf8mb4;" -- /root/dnsmgr.db.sqlite
replace "ON CONFLICT FAIL" "" -- /root/dnsmgr.db.sqlite
replace "usage VARCHAR(64)" "\`usage\` VARCHAR(64)" -- /root/dnsmgr.db.sqlite
replace "noauto VARCHAR(3)" "\`noauto\` VARCHAR(3)" -- /root/dnsmgr.db.sqlite
replace "DEFAULT \`off\`" "DEFAULT 'off'" -- /root/dnsmgr.db.sqlite
awk 'FS = "\"" {if($1=="INSERT INTO ") {print($1$2$3)} else {print}}' /root/dnsmgr.db.sqlite > /root/dnsmgr.db.mysql
mysql -e "create database dnsmgr default character set utf8mb4;"
mysql -uroot dnsmgr < /root/dnsmgr.db.mysql
grep -qE "DBType sqlite" /usr/local/mgr5/etc/dnsmgr.conf && replace "DBType sqlite" "DBType mysql" -- /usr/local/mgr5/etc/dnsmgr.conf
grep -qE "DBType mysql" /usr/local/mgr5/etc/dnsmgr.conf || echo "DBType mysql" >> /usr/local/mgr5/etc/dnsmgr.conf
rm -f /usr/local/mgr5/var/.db.cache.*
mv /usr/local/mgr5/bin/core2 /usr/local/mgr5/bin/core
pkill core
BASH