IPmanager по умолчанию использует в качестве СУБД (системы управления базами данных) SQLite. Эту СУБД удобно использовать при небольших объёмах данных и низких нагрузках, что характерно для IPmanager. Однако, если в IPmanager добавлено большое количество сетей и к нему поступает большое количество запросов на выделение и освобождение IP-адресов, рекомендуем использовать СУБД MySQL.
Алгоритм перехода с SQLite на MySQL
Чтобы перейти с SQLite на MySQL:
-
Установите и запустите MySQL:
Для CentOSyum install mariadb-server service mariadb start
Для Debianapt-get install mysql-server service mysqld start
-
Войдите в MySQL:
mysql -u root -p
-
Создайте в MySQL базу данных:
create database ipmgr default character set utf8;
-
Создайте пользователя ipmgr и предоставьте ему права доступа к базе данных:
use mysql;
CREATE USER 'ipmgr'@'localhost' IDENTIFIED BY '<password>';
Пояснения к командеGRANT ALL PRIVILEGES ON ipmgr . * TO 'ipmgr'@'localhost';
-
Измените пароль пользователя root в MySQL:
update user set password=PASSWORD('<new_pass>') where user='root';
Пояснения к командеflush privileges;
-
Создайте конфигурационный файл /root/.my.cnf следующего содержания:
[client] user = root password = '<root_pass>'
Пояснения -
Создайте скрипт convert.py для конвертации базы данных:
Содержимое скрипта#!/usr/bin/env python import re import fileinput def this_line_is_useless(line): useless_es = [ 'BEGIN TRANSACTION', 'COMMIT', 'sqlite_sequence', 'CREATE UNIQUE INDEX', 'PRAGMA foreign_keys=OFF', ] for useless in useless_es: if re.search(useless, line): return True def has_primary_key(line): return bool(re.search(r'PRIMARY KEY', line)) searching_for_end = False for line in fileinput.input(): if this_line_is_useless(line): continue # this line was necessary because ''); # would be converted to \'); which isn't appropriate if re.match(r".*, ''\);", line): line = re.sub(r"''\);", r'``);', line) if re.match(r'^CREATE TABLE.*', line): searching_for_end = True m = re.search('CREATE TABLE "?(\w*)"?(.*)', line) if m: name, sub = m.groups() line = "DROP TABLE IF EXISTS %(name)s;\nCREATE TABLE IF NOT EXISTS `%(name)s`%(sub)s\n" line = line % dict(name=name, sub=sub) else: m = re.search('INSERT INTO "(\w*)"(.*)', line) if m: line = 'INSERT INTO %s%s\n' % m.groups() line = line.replace('"', r'\"') line = line.replace('"', "'") line = re.sub(r"([^'])'t'(.)", "\1THIS_IS_TRUE\2", line) line = line.replace('THIS_IS_TRUE', '1') line = re.sub(r"([^'])'f'(.)", "\1THIS_IS_FALSE\2", line) line = line.replace('THIS_IS_FALSE', '0') # Add auto_increment if it is not there since sqlite auto_increments ALL # primary keys if searching_for_end: if re.search(r"integer(?:\s+\w+)*\s*PRIMARY KEY(?:\s+\w+)*\s*,", line): line = line.replace("PRIMARY KEY", "PRIMARY KEY AUTO_INCREMENT") # replace " and ' with ` because mysql doesn't like quotes in CREATE commands if line.find('DEFAULT') == -1: line = line.replace(r'"', r'`').replace(r"'", r'`') else: parts = line.split('DEFAULT') parts[0] = parts[0].replace(r'"', r'`').replace(r"'", r'`') line = 'DEFAULT'.join(parts) # And now we convert it back (see above) if re.match(r".*, ``\);", line): line = re.sub(r'``\);', r"'');", line) if searching_for_end and re.match(r'.*\);', line): searching_for_end = False if re.match(r"CREATE INDEX", line): line = re.sub('"', '`', line) if re.match(r"AUTOINCREMENT", line): line = re.sub("AUTOINCREMENT", "AUTO_INCREMENT", line) print line,
-
Сделайте скрипт исполняемым:
chmod +x convert.py
-
Сконвертируйте базу данных:
sqlite3 /usr/local/mgr5/etc/ipmgr.db .dump | python convert.py > /root/ipmgr.db.mysql
replace "ON CONFLICT FAIL" "" -- /root/ipmgr.db.mysql
-
Загрузите созданный дамп в базу данных:
mysql -uroot ipmgr < /root/ipmgr.db.mysql
-
Укажите тип СУБД и параметры подключения к базе данных в конфигурационном файле IPmanager /usr/local/mgr5/etc/ipmgr.conf:
DBType mysql DBHost <mysql_server> DBUser ipmgr DBPassword <ipmgr_pass> DBName ipmgr
Пояснения -
Перезапустите IPmanager:
/usr/local/mgr5/sbin/mgrctl -m ipmgr exit