понедельник, 2 июня 2014 г.

Очистка данных в БД Октелла. MS SQL Express.

Приветствую.
     По умолчанию дистрибутив Октелла поставляется в комплекте с MS SQL Express (разных версий, зависит от релиза Октелла). И все бы ничего - все бесплатно-официально да и Октеллу  в общем-то функционала платной версии не требуется, но  рано или поздно вы  столкнетесь с переполнением БД.
     В различных версиях MSSQL Express разные ограничения (имею ввиду общий размер БД), но признаки у всех одни:
  • Невозможность сохранить карту сети.
  • Невозможность добавить нового пользователя
  • Ошибки во время выполнения различных профилактик и очисток БД в настройках Октелла.
  • Объем съедаемой оперативной памяти SQL-сервером резко увеличился.
  • Ошибки в логах или вообще невозможность подключиться к БД сервером Октелла.
  • Не отображаются записи разговора в карточке заказа.
  • Пустая статистика по звонкам (в Октелле)
     Это значит, что вам пора зачистить базу от всяких излишеств и порезать ее аппетиты, либо обновиться до более новой/платной версии MSSQL (этот вариант сегодня не рассматриваем). 
   
     Сначала установим SQL Managment (дальше буду называть его менеджер - просто я ленивый, как мы выяснили ранее). С его помощью мы будем давать команды SQL-серверу , хотя можно и без него обойтись, но так нагляднее и удобнее. 
Версии:
Учтите, что инсталлятор следует выбирать в соответствии с разрядностью Windows.
     
     Далее будут скрины и инструкции для 2012 менеджера, но 2005 и 2008 не сильно от него отличаются, так что справитесь. Также хочу сказать, что данное руководство подходит не только к БД Октелла, но и к любой другой MS SQL-базе, разве что названия таблиц и баз будут вашими. Но В ЛЮБОМ СЛУЧАЕ СДЕЛАЙТЕ БЕКАПЫ БД!

Ну, понаехали.

     1. Запускаем установленный менеджер и подключаемся к нашей БД.

  • В поле имя сервера укажите "IP-адрес вашего sql-сервера"\"Название БД". По умолчанию "Название БД" для Октелла  =, вот сюрприз,  OKTELL
  • Выбираем проверку подлинности. можно воспользоваться windows-аутентификацией, но ваш сервер может находиться в другой доменной зоне (в случае, если вы цепляетесь не с компьютера-сервера), а потому лучше зацепиться к нему с помощью Логина: AutelService и пароля: Version2
  • Нажимайте Соединить.

     2.  Изучаем, к чему подключились. Открываем окно нового запроса.


  • Открываем вкладку "Базы данных" и видим три базы, которые использует Октелл: oktell, oktell_cc_temp, oktell_settings. Рассказывать про каждую из них я не буду, но по названиям и так ясно.
  • Нажимаем "Создать запрос" (ctrl+N) и начинаем писать всякие "просьбы" нашему серверу.

3. Ищем "толстые" таблицы.

  • В открывшемся поле набираем (копи-пастим):
Use Oktell
DBCC UPDATEUSAGE (0)
create table #t(name varchar(255), row varchar(255), reserved varchar(255), data varchar(255), inxex_size varchar(255), unused varchar(255))
insert into #t
exec sp_msforeachtable N'exec sp_spaceused ''?'''
select * from #t
drop table #t

  •  Нажимаем F5 (выполнить) и ниже получим  список всех таблиц с их размерами:

  • Обращать внимание следует на столбец reserved - он показывает размер таблицы в килобайтах. В примере видно, что таблица A_Stat_Connetcions_1x1 занимает примерно 140 Мб. Это не много, но в вашем случае это может быть гораздо б'ольшее число, т.к. эта таблица заполняется быстрее остальных, т.к. фиксирует все входящие/исходящие звонки.
  • Просветленный заметит, что в запросе есть строка Use Oktell (в самом начале). С помощью нее можно выбрать БД, которую мы хотим "проверить". В запросе выше я вывел размеры таблиц по базе Oktell, но не плохо бы вывести данные по всем базам: oktell, oktell_settings, oktell_cc_temp. Т.е. чтобы вывести данные по базе oktell_settings достаточно ввести в качестве первой строки  Use Oktell_settings.

4. Чистим нужные таблицы.

     Сразу отмечу, что чистить таблицы нужно только в том случае, если вы точно уверены в своих знаниях об этой таблице и знаете, что там хранится, т.е. можно случано что-то удалить и вы потеряете статистику/настройки октелла/списки ваших клиентов. БУДЬТЕ АККУРАТНЫ! 
Все еще уверены в том, что делаете? Тогда продолжаем.
  • Мы выявили, что таблица A_Stat_Connections_1x1 занимает многовато, по нашему мнению, места. Теперь будем ее подрезать.
  • Снова нажимаем Создать запрос и пишем следующее:
use oktell
delete from a_stat_connections_1x1 where TimeStart < '2013-09-25 00:00:00'
Где  2013-09-25 00:00:00'  - дата ДО которой нам не интересны данные таблицы, т.е. статистика (в данном случае из-за таблицы мы говорим о статистике звонков). можно, конечно, убрать из запроса where TimeStart < '2013-09-25 00:00:00' , но тогда вы удалите данные из таблицы совсем, так, что будьте осторожны.

  •  Готово. Таблица очищена. То же самое (возможно уже без указания даты) следует сделать и с остальными "крупными" таблицами в БД. Например A_Streams в базе oktell_settings тоже может много весить, т.к. хранит историю по изменениям в карте сети (видно по датам в названии строк). попробуем очистить от старых сохранений и ее:
  use oktell_settings
  delete FROM A_Streams where name like '%copy%'
В данном случае name like '%copy%'  удалит из таблицы значения являющиеся копией. обратите внимание, что везде пишу use oktell_settings или use oktell тем самым выбирая нужную мне БД для запроса. Можно обойтись и без таких обращений, но так будет проще понять новичкам.

5. Сложности.

     Если таблица, которую вы удаляете очень большая с огромным количеством записей, то может возникнуть ошибка при попытке удаления данных из нее, т.к. вы удаляете очень большой кусок информации и логи по этой базе не лезут в ограничения по умолчанию. Это можно поправить  снятием ограничений.
  • В менеджере тыкаем правой клавишей по базе oktell и выбираем "Свойства".
  • Слева выбираем "Файлы".
  • В колонке расширение у файла oktell_log выбираем пункт неограниченный рост размера файлов.
  • Нажимаем ОК.
     Теперь снова попытайте удачу с очисткой таблиц. Если удаляться будет ОЧЕНЬ долго или снова будете получать ошибку, то попробуйте удалять кусами, например, за определенный период.

6. Обрезаем логи.

    После всех манипуляций  у нас резко возрастет размер баз-логов. Как не странно, но они тоже учитываются при расчете ограничений на вашу версию MS SQL. а потому беспощадно их зарежем запросом: 

  use master
backup log oktell with truncate_only
use oktell
DBCC SHRINKFILE (oktell_Log,20)

backup log oktell_settings with truncate_only
use 
oktell_settings
DBCC SHRINKFILE (
oktell_settings_Log,20)

backup log oktell_cc_temp with truncate_only
use 
oktell_cc_temp
DBCC SHRINKFILE (
oktell_cc_temp_Log,20)
Готово. Теперь можете дальше делать все, что хотите. Симптомы переполнения БД должны пропасть, а все процедуры по очистке и переиндексации в настройках Октелла должны работать. 


P.S.
И таки да. Не хочу нести ответственности, а потому не несу.