Документация IPmanager

Использование MySQL в качестве СУБД

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

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

Чтобы перейти с SQLite на MySQL:

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

    Для CentOS
    yum install mariadb-server
    service mariadb start
    Для Debian
    apt-get install mysql-server
    service mysqld start
  2. Войдите в MySQL:

    mysql -u root -p
  3. Создайте в MySQL базу данных:

    create database ipmgr default character set utf8;
  4. Создайте пользователя ipmgr и предоставьте ему права доступа к базе данных:

    use mysql;
    CREATE USER 'ipmgr'@'localhost' IDENTIFIED BY '<password>';
    Пояснения к команде
    GRANT ALL PRIVILEGES ON ipmgr . * TO 'ipmgr'@'localhost';
  5. Измените пароль пользователя root в MySQL:

    update user set password=PASSWORD('<new_pass>') where user='root';
    Пояснения к команде
    flush privileges;
  6. Создайте конфигурационный файл /root/.my.cnf следующего содержания:

    [client]
    user = root
    password = '<root_pass>'
    Пояснения
  7. Создайте скрипт 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,


  8. Сделайте скрипт исполняемым:

    chmod +x convert.py


  9. Сконвертируйте базу данных:

    sqlite3 /usr/local/mgr5/etc/ipmgr.db .dump | python convert.py > /root/ipmgr.db.mysql
    replace "ON CONFLICT FAIL" "" -- /root/ipmgr.db.mysql
  10. Загрузите созданный дамп в базу данных:

    mysql -uroot ipmgr < /root/ipmgr.db.mysql


  11. Укажите тип СУБД и параметры подключения к базе данных в конфигурационном файле IPmanager /usr/local/mgr5/etc/ipmgr.conf:

    DBType mysql
    DBHost <mysql_server>
    DBUser ipmgr
    DBPassword <ipmgr_pass>
    DBName ipmgr
    Пояснения
  12. Перезапустите IPmanager:

    /usr/local/mgr5/sbin/mgrctl -m ipmgr exit