====== Объединение БД sqlite Askozia ====== ===== Исходные данные ===== * Бекап БД sqlite, файл **old_master.db** * Текущая БД sqlite, файл **master.db** * Сервер **Askozia 5.4 Miko Edition** ===== Структура базы данных sqlite в Askozia ===== База данных Sqlite в Askozia содержит две таблицы CDR и CEL. В обеих таблицах имеется первичный ключ, поле AcctID, который определяет уникальность записи в таблице. ===== Схема решения задачи ===== Задачу по объединению нескольких БД sqlite Askozia можно разбить на два этапа: - Обеспечить уникальность первичного ключа AcctID во всех базах; - Выполнить объединение полученных баз. Работы будем проводить на сервере АТС Askozia. Перед работами обязательно **выполняем полный бекап** станции Askozia! Если АТС рабочая, то работы следует проводить либо в нерабочее время, либо в промежуток времени с минимальным количеством звонков. Некоторые операции могут загрузить процессор до 100%, что скажется на качестве звука, в случае звонков в этот момент. ===== Выполнение работ ===== ==== Подготовительные работы ==== Перед загрузкой убедитесь, что на дополнительном диске достаточно свободного места. - Загружаем бекап БД **old_master.db** на дополнительный диск аскозии. Для загрузки можно использовать SFTP клиент, к примеру, winscp. Файл old_master.db необходимо скопировать в директорию **/storage/usbdisk1/askoziapbx/astlogs/asterisk**; - Подключаемся к АТС по ssh с помощью утилиты putty; - Переходим в директорию с файлами БД и в первую очередь делаем бекап текущей БД: cd /storage/usbdisk1/askoziapbx/astlogs/asterisk/ cp master.db backup_master.db - Создаем еще одну копию текущей базы, с которой будем работать:cp master.db new_master.db ==== Уникальность ключевого поля AcctID ==== Основной базой у нас будет **old_master.db**. В нее мы будем загружать данные из базы **new_master.db**. Перед загрузкой данных нам необходимо обеспечить уникальность поля AcctID в обеих базах в обеих таблицах CDR и CEL. - Найдем максимальное значение AcctID в CDR и CEL базы данных **old_master.db**. Для этого выполнить последовательно запросы:sqlite3 old_master.db 'SELECT AcctID FROM cdr ORDER BY AcctID DESC LIMIT 1'{{:kb:askozia:acctid_cdr.png|}}sqlite3 old_master.db 'SELECT AcctID FROM cel ORDER BY AcctID DESC LIMIT 1'{{:kb:askozia:acctid_cel.png|}} Получили в CDR макcимальный AcctID = 5678922, в CEL максимальный AcctID = 1649008. - Увеличим соответственно на эти значения все записи в таблицах 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**. - Командой .dump выгружаем все данные из базы вместе со структурой таблиц:sqlite3 new_master.db .dump > new_master_dump.sql - Командой .schema выгружаем только структуру таблиц БД:sqlite3 new_master.db .schema > new_master_schema.sql - Т.к. в базе, в которую будем загружать данные, уже имеется структура таблиц, то необходимо из выгрузки исключить конструкции CREATE TABLE, оставить только данные INSERT INTO. Выполнить это можно с помощью команды grep:grep -vx -f new_master_schema.sql new_master_dump.sql > data.sql - Выполним загрузку полученных данных data.sql в базу old_master.db:sqlite3 old_master.db < data.sql - Заменим текущую базу полученной объединенной базой:mv old_master.db master.db ===== Проверка работы ===== После замены файла БД обязательно **перезагрузите станцию**! - После перезагрузки подключаемся к АТС по ssh; - Находим и запоминаем значение 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' - Делаем тестовый звонок; - Повторно выполняем запросы 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'