Здесь показаны различия между двумя версиями данной страницы.
— |
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> | ||