Внимание! Документация к новой MikoPBX доступна по ссылке

Инструменты пользователя

Инструменты сайта


handbook:faq:sqlitemerge

Объединение БД sqlite Askozia

Исходные данные

  • Бекап БД sqlite, файл old_master.db
  • Текущая БД sqlite, файл master.db
  • Сервер Askozia 5.4 Miko Edition

Структура базы данных sqlite в Askozia

База данных Sqlite в Askozia содержит две таблицы CDR и CEL. В обеих таблицах имеется первичный ключ, поле AcctID, который определяет уникальность записи в таблице.

Схема решения задачи

Задачу по объединению нескольких БД sqlite Askozia можно разбить на два этапа:

  1. Обеспечить уникальность первичного ключа AcctID во всех базах;
  2. Выполнить объединение полученных баз.

Работы будем проводить на сервере АТС Askozia.

Перед работами обязательно выполняем полный бекап станции Askozia!

Если АТС рабочая, то работы следует проводить либо в нерабочее время, либо в промежуток времени с минимальным количеством звонков. Некоторые операции могут загрузить процессор до 100%, что скажется на качестве звука, в случае звонков в этот момент.

Выполнение работ

Подготовительные работы

Перед загрузкой убедитесь, что на дополнительном диске достаточно свободного места.
  1. Загружаем бекап БД old_master.db на дополнительный диск аскозии. Для загрузки можно использовать SFTP клиент, к примеру, winscp. Файл old_master.db необходимо скопировать в директорию /storage/usbdisk1/askoziapbx/astlogs/asterisk;
  2. Подключаемся к АТС по ssh с помощью утилиты putty;
  3. Переходим в директорию с файлами БД и в первую очередь делаем бекап текущей БД:
    cd /storage/usbdisk1/askoziapbx/astlogs/asterisk/
    cp master.db backup_master.db
  4. Создаем еще одну копию текущей базы, с которой будем работать:
    cp master.db new_master.db

Уникальность ключевого поля AcctID

Основной базой у нас будет old_master.db. В нее мы будем загружать данные из базы new_master.db. Перед загрузкой данных нам необходимо обеспечить уникальность поля AcctID в обеих базах в обеих таблицах CDR и CEL.

  1. Найдем максимальное значение AcctID в CDR и CEL базы данных old_master.db. Для этого выполнить последовательно запросы:
    sqlite3 old_master.db 'SELECT AcctID FROM cdr ORDER BY AcctID DESC LIMIT 1'

    sqlite3 old_master.db 'SELECT AcctID FROM cel ORDER BY AcctID DESC LIMIT 1'

    Получили в CDR макcимальный AcctID = 5678922, в CEL максимальный AcctID = 1649008.

  2. Увеличим соответственно на эти значения все записи в таблицах CDR и CEL в базе new_master.db:
    sqlite3 new_master.db 'UPDATE cdr SET AcctId = AcctId+5678922'
    sqlite3 new_master.db 'UPDATE cel SET AcctId = AcctId+1649008'

Объединение полученных баз

Выгрузим данные из новой базы new_master.db в файл sql для последующей загрузки в базу old_master.db.

  1. Командой .dump выгружаем все данные из базы вместе со структурой таблиц:
    sqlite3 new_master.db .dump > new_master_dump.sql
  2. Командой .schema выгружаем только структуру таблиц БД:
    sqlite3 new_master.db .schema > new_master_schema.sql
  3. Т.к. в базе, в которую будем загружать данные, уже имеется структура таблиц, то необходимо из выгрузки исключить конструкции CREATE TABLE, оставить только данные INSERT INTO. Выполнить это можно с помощью команды grep:
    grep -vx -f new_master_schema.sql new_master_dump.sql > data.sql
  4. Выполним загрузку полученных данных data.sql в базу old_master.db:
    sqlite3 old_master.db < data.sql
  5. Заменим текущую базу полученной объединенной базой:
    mv old_master.db master.db

Проверка работы

После замены файла БД обязательно перезагрузите станцию!
  1. После перезагрузки подключаемся к АТС по ssh;
  2. Находим и запоминаем значение AcctID последней записи таблиц CDR и CEL:
    sqlite3 /storage/usbdisk1/askoziapbx/astlogs/asterisk/master.db 'SELECT AcctID FROM cdr ORDER BY AcctID DESC LIMIT 1'
    sqlite3 /storage/usbdisk1/askoziapbx/astlogs/asterisk/master.db 'SELECT AcctID FROM cel ORDER BY AcctID DESC LIMIT 1'
  3. Делаем тестовый звонок;
  4. Повторно выполняем запросы AcctID, проверяем, что значение увеличилось:
    sqlite3 /storage/usbdisk1/askoziapbx/astlogs/asterisk/master.db 'SELECT AcctID FROM cdr ORDER BY AcctID DESC LIMIT 1'
    sqlite3 /storage/usbdisk1/askoziapbx/astlogs/asterisk/master.db 'SELECT AcctID FROM cel ORDER BY AcctID DESC LIMIT 1'
handbook/faq/sqlitemerge.txt · Последние изменения: 2018/09/21 13:33 — tpor