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

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

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


handbook:faq:sqlitemerge

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

handbook:faq:sqlitemerge [2018/09/21 13:33] (текущий)
tpor создано
Строка 1: Строка 1:
 +====== Объединение БД 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.
 +
 +<note warning> Перед работами обязательно **выполняем полный бекап** станции Askozia!</​note>​
 +
 +Если АТС рабочая,​ то работы следует проводить либо в нерабочее время, либо в промежуток времени с минимальным количеством звонков. Некоторые операции могут загрузить процессор до 100%, что скажется на качестве звука, в случае звонков в этот момент.
 +
 +===== Выполнение работ =====
 +==== Подготовительные работы ====
 +
 +<note important>​Перед загрузкой убедитесь,​ что на дополнительном диске достаточно свободного места.</​note> ​
 +  - Загружаем бекап БД **old_master.db** на дополнительный диск аскозии. Для загрузки можно использовать SFTP клиент,​ к примеру,​ winscp. Файл old_master.db необходимо скопировать в директорию **/​storage/​usbdisk1/​askoziapbx/​astlogs/​asterisk**; ​
 +  - Подключаемся к АТС по ssh с помощью утилиты putty;
 +  - Переходим в директорию с файлами БД и в первую очередь делаем бекап текущей БД: <​code>​cd /​storage/​usbdisk1/​askoziapbx/​astlogs/​asterisk/​
 +cp master.db backup_master.db
 +</​code>​
 +  - Создаем еще одну копию текущей базы, с которой будем работать:<​code>​cp master.db new_master.db</​code>​
 +
 +==== Уникальность ключевого поля AcctID ====
 +Основной базой у нас будет **old_master.db**. В нее мы будем загружать данные из базы **new_master.db**. Перед загрузкой данных нам необходимо обеспечить уникальность поля AcctID в обеих базах в обеих таблицах CDR и CEL. 
 +  - Найдем максимальное значение AcctID в CDR и CEL базы данных **old_master.db**. Для этого выполнить последовательно запросы:<​code>​sqlite3 old_master.db '​SELECT AcctID FROM cdr ORDER BY AcctID DESC LIMIT 1'</​code>​{{:​kb:​askozia:​acctid_cdr.png|}}<​code>​sqlite3 old_master.db '​SELECT AcctID FROM cel ORDER BY AcctID DESC LIMIT 1'</​code>​{{:​kb:​askozia:​acctid_cel.png|}} Получили в CDR макcимальный AcctID = 5678922, в CEL максимальный AcctID = 1649008.
 +  - Увеличим соответственно на эти значения все записи в таблицах CDR и CEL в базе **new_master.db**:<​code>​sqlite3 new_master.db '​UPDATE cdr SET AcctId = AcctId+5678922'</​code><​code>​sqlite3 new_master.db '​UPDATE cel SET AcctId = AcctId+1649008'</​code>​
 +
 +==== Объединение полученных баз ====
 +Выгрузим данные из новой базы **new_master.db** ​ в файл sql для последующей загрузки в базу **old_master.db**.
 +  - Командой .dump  выгружаем все данные из базы вместе со структурой таблиц:<​code>​sqlite3 new_master.db .dump > new_master_dump.sql</​code>​
 +  - Командой .schema выгружаем только структуру таблиц БД:<​code>​sqlite3 new_master.db .schema > new_master_schema.sql</​code>​
 +  - Т.к. в базе, в которую будем загружать данные,​ уже имеется структура таблиц,​ то необходимо из выгрузки исключить конструкции CREATE TABLE, оставить только данные INSERT INTO. Выполнить это можно с помощью команды grep:<​code>​grep -vx -f new_master_schema.sql new_master_dump.sql > data.sql</​code>​
 +  - Выполним загрузку полученных данных data.sql в базу old_master.db:<​code>​sqlite3 old_master.db < data.sql</​code>​
 +  - Заменим текущую базу полученной объединенной базой:<​code>​mv old_master.db master.db</​code>​
 +
 +===== Проверка работы =====
 +<note warning> После замены файла БД обязательно **перезагрузите станцию**!</​note>​
 +  - После перезагрузки подключаемся к АТС по ssh;
 +  - Находим и запоминаем значение AcctID последней записи таблиц CDR и CEL:<​code>​sqlite3 /​storage/​usbdisk1/​askoziapbx/​astlogs/​asterisk/​master.db '​SELECT AcctID FROM cdr ORDER BY AcctID DESC LIMIT 1'</​code><​code>​sqlite3 /​storage/​usbdisk1/​askoziapbx/​astlogs/​asterisk/​master.db '​SELECT AcctID FROM cel ORDER BY AcctID DESC LIMIT 1'</​code>​
 +  - Делаем тестовый звонок;​
 +  - Повторно выполняем запросы AcctID, проверяем,​ что значение увеличилось:<​code>​sqlite3 /​storage/​usbdisk1/​askoziapbx/​astlogs/​asterisk/​master.db '​SELECT AcctID FROM cdr ORDER BY AcctID DESC LIMIT 1'</​code><​code>​sqlite3 /​storage/​usbdisk1/​askoziapbx/​astlogs/​asterisk/​master.db '​SELECT AcctID FROM cel ORDER BY AcctID DESC LIMIT 1'</​code>​
  
handbook/faq/sqlitemerge.txt · Последние изменения: 2018/09/21 13:33 — tpor