====== Объединение БД 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'