Резервное копирования баз данных MS SQL Server на сетевой диск

При использовании клиент-серверного варианта «1С Предприятие 8» появляется возможность создания резервной копии базы средствами СУБД. Например MS SQL Server позволяет выполнять резервное копирование в то время, когда база данных находится в многопользовательском режиме.

При резервном копирования стандартными средствами Enterprise Manager для MS SQL 2000 и SSMS для MS SQL 2005 (2008R2) невозможно создать устройство резервного копирования, расположенное на сетевом диске, поскольку они видят только локальные, физически подключенные диски. Поэтому выполнение резервного копирования возможно только на локальные диски компьютера, на котором установлен Microsoft SQL Server. Использование этого варианта организации резервного копирования существенно снижает надежность, поскольку в случае выхода компьютера из строя становится недоступной как рабочая база данных, так и резервная копия.
Одним из способов решить эту проблему является создание сетевого устройства резервного копирования с помощью системной процедуры SP_ADDUMPDEVICE. Для этого нужно в Query Analyzer выполнить следующую команду:

USE master
GO
EXEC SP_ADDUMPDEVICE ‘disk’,
‘Логическое_Имя_Сетевого_Устройства_Резервного_Копирования’,
‘\\Имя_Компьютера\Имя_Каталога\Имя_Файла.bak’

Следующий пример иллюстрирует добавление удаленного дискового устройства резервного копирования с именем ‘AdvWorksData’ и создание резервной копии базы ‘TestData’. Необходимым условием использования сетевого устройства резервного копирования является запуск Microsoft SQL Server с использованием доменной учетной записи.

USE master
GO
EXEC sp_addumpdevice ‘disk’, ‘AdvWorksData’,
‘\\server-sql1\sqlbackup\Test5.bak’;
GO
BACKUP DATABASE TestData
TO AdvWorksData
WITH FORMAT;
GO

Популярность: 19%

Рубрика: Настройка и оптимизация | Метки: | Добавить комментарий

Использование System Monitor для диагностирования проблем в производительности

Рано или поздно мы все сталкиваемся с проблемой производительности. Поэтому для своевременного обнаружения узких мест в оборудовании необходимо проводить регулярный мониторинг загруженности всех основных аппаратных компонентов системы. К ним в первую очередь относятся:

  • Все рабочие сервера кластера 1С:Предприятия
  • Сервер СУБД
  • Клиентские рабочие станции, работающие под большой нагрузкой

Для каждого из этих компьютеров необходимо настроить постоянный сбор информации по загруженности оборудования.

Для этого можно использовать System Monitor. System Monitor представляет собой стандартное средство для диагностики проблем производительности операционной системы, различных компонент приложений и используемого оборудования. С его помощью можно измерять производительность как локального компьютера, так и других компьютеров в сети. System Monitor является основным инструментом для идентификации узких мест в системе.

Компоненты анализируемой системы интерпретируются как объекты, параметры которых представляются в виде набора счетчиков, при этом для каждого объекта определен свой набор счетчиков. Некоторые приложения в процессе установки расширяют системный набор своими, специфическими объектами и счетчиками, характеризующими производительность этого приложения. Например, при установке Microsoft SQL Server к стандартному набору объектов и счётчиков операционной системы добавляются специфические объекты и счётчики сервера баз данных.

Узкие места, которые могут оказать наибольшее влияние на производительность:
Память

  • Недостаток объема оперативной памяти, установленной на компьютере, оказывает негативное влияние на производительность всех компонент 1С:Предприятия 8 и Microsoft SQL Server.
  • При увеличении количества пользователей и объема информационной базы требования к этому ресурсу со стороны сервера 1С:Предприятия 8 и Microsoft SQL Server возрастают.
  • Нехватка памяти приводит к увеличению интенсивности страничного обмена между файлом подкачки и физической памятью, что существенно снижает производительность системы.

Процессоры

  • Недостаточная производительность или количество процессоров может стать узким местом при увеличении нагрузки на систему, связанной с увеличением количества пользователей.
  • Эффект от увеличения количества процессоров в многопользовательской системе, как правило, существенно выше, чем от увеличения их быстродействия.

Дисковые операции

  • Производительность дисковой подсистемы является одним из решающих факторов, определяющих производительность Microsoft SQL Server.
  • На производительность сервера 1С:Предприятия 8 влияния, как правило, не оказывает.

Конфликты блокировок Microsoft SQL Server

  • Один из основных факторов снижения производительности в многопользовательском режиме
  • Вероятность возникновения конфликтов блокировок можно снизить за счет доработки прикладного решения

Перечень основных объектов и счетчиков, используемых при анализе
проблем с производительностью.

счетчики производительности

счетчики производительности

P.S.

По данной теме хочу порекомендовать посмотреть сервис http://www.gilev.ru/hardware/.

Популярность: 6%

Рубрика: Настройка и оптимизация | Метки: | Добавить комментарий

Как программно выделить все строки динамического списка?

Приветствую Вас, дорогие читатели.

В платформе «1с предприятие 8.2» появился такой замечательный объект как «динамический список«. Данный объект я часто использую в подборах, если не нужно делать сложные расчеты, а просто показать данные и выбрать.

Бывают такие ситуации, что список большой, более 10 позиций, и пользователю необходимо выбрать все строки. Стандартного способа как это сделать я не нашел.

Для решения это задачи я использовал объект «WSCript.Shell«.

В процессе реализации у меня получилось 2 варианта.

Вариант №1

Определим кнопку «Выделить все строки» и в модуль обработчика добавим код:

wsh = Новый COMОбъект(«WSCript.Shell»);
ЭтаФорма.ТекущийЭлемент = Элементы.ДинамическийСписок;
wsh.sendkeys(«^{A}»);

С помощью данного кода выполняется нажатие клавиш «Ctrl + A«, т.е. «выделить все».

Вариант №2

Вариант №1 не всегда срабатывал. Тогда данный код я переписал следующим образом:

  • Добавим реквизит формы «ПоследняяСтрокаСписка»
  • Для списка укажем свойство «Начальное отображение списка» = В конце списка
  • В процедуру «ПриОткрытии» добавим заполнение реквизита, определенного в пункте 1.

ПоследняяСтрокаСписка = Элементы.ДинамическийСписок.ВыделенныеСтроки[0];

  • Определим кнопку «Выделить все строки» и в модуль обработчика добавим код:

wsh = Новый COMОбъект(«WSCript.Shell»);
ЭтаФорма.ТекущийЭлемент = Элементы.ДинамическийСписок;
wsh.sendkeys(«{END}»);
ТекДанные = Элементы.ДинамическийСписок.ТекущиеДанные;
Если
ТекДанные <> Неопределено Тогда
  wsh.sendkeys(«+{UP » + ПоследняяСтрокаСписка + «}»);
КонецЕсли;

С помощью данного кода выполняется нажатие клавиш «Shift + кнопка вверх«.

Хочу обратить внимание. Данное решение не будет работать на клиентах, которые запускаются на Линукс.

Популярность: 12%

Рубрика: Особенности работы управляемого интерфейса | Метки: | Добавить комментарий

Восстановление работоспособности SQL базы «1С предприятие 8» после падения во время обновления

Приветствую Вас, дорогие читатели.

Совсем недавно мне пришлось восстанавливать базу «1С предприятие 8» после падения, которое произошло во время обновления конфигурации. Причем это было дважды и методы примененные при восстановлении тоже были разными (скоро узнаете почему). В данной статье я хочу рассказать о тех способах, которыми я воспользовался.

Все способы рассматриваемые в статье относятся к серверному варианту работу «1С предприятие 8», используемое СУБД — MS SQL 2005.

Случай №1.

При обновлении конфигурации была выдана ошибка «Конфликт блокировок», конфигуратор был закрыт. При повторной попытке входа в конфигуратор появилась ошибка: Внимание!!! При обновлении данных, после последней реструктуризации, произошла ошибка. Повторить обновление?» «Да, Нет»

Ошибка №1 после обновления

При положительном ответе выдавалось следующее сообщение «Обнаружена незавершенная операция сохранения конфигурации. Для продолжения работы необходимо завершить операцию.»

Ошибка №2 после обновления

Поиски на просторах интернета выдали следующий способ. В таблице Config нашей базы данные необходимо удалить строки где поле FileName = commit или FileName = dbStruFinal или FileName=DynamicallyUpdated (для 8.3) или FileName=dynamicCommit (8.3), а также очистить таблицу ConfigSave. Поясню за что отвечают данные таблицы: Config — в данной таблице хранится конфигурация базы данных, ConfigSave — в данной таблице хранится рабочая конфигурация, т.е. до нажатия кнопки F7 в конфигураторе.

Открываем SQL Serger Managment Studio и открываем окно запросов по кнопке «New Query» открывает окно запросов.

Открыть окно запросов

В окне запросов пишем запросы и выполняем их:

  1. delete from [ИмяНашейБазы].[dbo].[Config] where FileName = ‘commit’
  2. delete from [ИмяНашейБазы].[dbo].[Config] where FileName = ‘dbStruFinal’
  3. delete from [ИмяНашейБазы].[dbo].[Config] where FileName = ‘DynamicallyUpdated’ (для версии 8.3)
  4. delete from [ИмяНашейБазы].[dbo].[Config] where FileName = ‘dynamicCommit’ (для версии 8.3)
  5. delete from [ИмяНашейБазы].[dbo].[ConfigSave] 

После выполнения данных запросов, конфигуратор запустился без проблем.

Случай №2

Причина ошибки входа в конфигуратор такая же как и в первом случае: конфликт блокировок при обновлении конфигурации.

Удаление строк в таблице Config и очистка таблицы ConfigSave помогло частично: конфигуратор открывался, но в предприятии не работали управляемые формы.

В данном случае приходило в голову 2 пути развития:

  1. Восстановление из архива. В данном варианте было одно большое  «НО»: так получилось что архив создался уже после обновления, т.е. архив был с ошибкой.
  2. Была идея использовать конфигурацию распределенной базы, которая не обновилась, потому что файл для обмена был с ошибкой.

Для решения проблемы был выбран 2-ой вариант. Далее пошагово расскажу что делал.

  1. Открываем SQL Serger Managment Studio и создаем произвольную базу, например Perenos. В этой базе создаем таблицу Config. Кто не знает sql для переноса данных из одной таблицы в другую, то у MS SQL есть замечательный сервис «SQL Server import and Export Wizard«. С помощью данного сервиса можно легко переносить данные из одной базу в другую. Чтобы запустить данный сервис необходимо нажать клавиши «ctrl+r» и в окне диалога написать команду «dtswizard«.
  2. Переносим с помощью сервиса dtswizard данные таблицы Config нашей базы в таблицу Config базы Perenos.
  3. Очищаем таблицу Config в нашей базе с помощью запроса delete from [ИмяНашейБазы].[dbo].[Config]
  4. На сервере, где находится распределенная база запускаем сервис dtswizard и переносим данные из таблицы Config в такую же таблицу только в нашей базе.

Вот с помощью таких действий получилось быстро и с минимальным простоем восстановить работоспособность базы.

Популярность: 12%

Рубрика: Настройка и оптимизация | Метки: | Добавить комментарий

Правильные запросы в 1С

Здравствуйте, дорогие читатели!

Самым быстрым по производительности способом получения данных в системе «1С Предприятие 8» является работа с запросом. Поэтому чаще всего Вам придется пользоваться именно этой техникой.

Запрос представляет собой текст на специальном языке запросов. В этом тексте
описывается, что является источником информации для запроса, а также
указываются условия для построения запроса. Более приближенно к системе
«1С Предприятие» источник информации можно определить так: какие таблицы
информационной базы используются в качестве источников данных для запроса,
а также какие поля таблиц требуется обрабатывать в запросе. А вот какими подходами и методами при этом руководствоваться – в большинстве случаев это остается на усмотрение сервера «1С Предприятия» (который переводит наш запрос на языке 1С на язык запросов СУБД) и оптимизатора СУБД (который подбирает оптимальный сценарий получения данных).

Например: В своем запросе мы требуем отобрать из справочника «Номенклатура» все услуги, основным поставщиком которых является «Абдулов». При этом реквизит «Услуга» булевого типа, а реквизит «ОсновнойПоставщик» — тип справочник «Контрагенты». Оба реквизита индексированы.

Для оптимизатора СУБД есть несколько вариантов выполнения этого запроса:

  • Найти по индексу поля «Услуга» записи, удовлетворяющие первому условию и проверить среди них второе условие.
  • Прочитать все записи таблицы «Номенклатура» и отобрать по двум условиям нужные нам данные
  • Найти по индексу поля «Основной поставщик» записи, удовлетворяющие второму условию и проверить среди них первое условие.

Оптимизатор СУБД выбирает и анализирует лишь некоторое количество вариантов выполнения запроса и выбирает «лучший из них».  При этом возникает вероятность, что по-настоящему оптимальный вариант остался даже не рассмотренным. Поэтому чтобы помочь оптимизатору СУБД в выборе оптимального варианта выполнения нашего запроса рекомендуется придерживаться следующих правил:

  1. По возможности условие ИЛИ заменять  операцией ОБЪЕДИНЕНИТЬ ВСЕ. Чтобы убедиться в том, что нужна замена, можно сделать так: выполнить запрос с условием на равенство по одиночному значению поля, а потом запрос с условием ИЛИ по этому полю на большой таблице. Если второй запрос выполняется намного дольше, чем первый, то данный запрос можно переписать.
  2. Условие «не равно» (<>) тоже может отключать использование индекса. Например если необходимо исключить большую часть таблицы, а поле отбора проиндексировано, – есть смысл переписать запрос на вариант ОБЪЕДИНЕНИТЬ ВСЕ
  3. В условиях соединений, стараться обходиться без использования вложенных запросов и виртуальных таблиц, а так же лишних разыменований (выражений через несколько точек). Вложенные запросы и виртуальные таблицы рекомендую заменить на временные таблицы.
  4. Стараться избегать в условии «В ИЕРАРХИИ» содержания пустой ссылки. Возможно ситуация когда оптимизатор СУБД начнет проверять каждый элемент справочника на принадлежность корню (т.е. самому справочнику), теряя на этом время.
  5. Следует использовать ОБЪЕДИНИТЬ ВСЕ вместо ОБЪЕДИНИТЬ, если наличие одинаковых записей не критично. Оператор ОБЪЕДИНИТЬ использует дополнительные операции, которые могут занять много времени.
  6.  Условие «ПОДОБНО» подавляет использование индекса.
  7.  Если запрос содержит несколько условий, то они должны располагаться в порядке уменьшения эффекта от выбора. То есть первым надо делать то условие, которое максимально уменьшит результирующую таблицу.
  8. Максимально использовать индексы таблиц. Необходимо стараться чтобы для всех условий, использованных в запросе, имелись подходящие индексы. Подходящий индекс — это индекс, который содержит все поля перечисленные в условии, эти поля находятся в самом начале индекса и они расположены вместе, т.е между ними нет других полей.
  9. Не рекомендуется фильтровать виртуальные таблицы при помощи условий в секции ГДЕ и т.п. Надо использовать только параметры.
  10. Стараться для ссылочных полей, по которым будет вывод, получать представление  сразу в запросе, т.е. использовать конструкцию «ПРЕДСТАВЛЕНИЕ(НашаСсылка)«
  11. Если в запросе реализовано соединение двух и более таблиц, то эти таблицы должны стоять в запросе в порядке уменьшения количества записей в них, а в части условий (ГДЕ) первым должно стоять условие на первую таблицу.
  12. Если запрос содержит условие для проиндексированного (относится к некластерному индексу) поля маленькой таблицы, которая может быть считана за одно обращение к памяти, то лучше убрать индекс с этого поля в конфигурации.
  13.  Условия вхождения значений полей в результаты вложенных запросов лучше заменять на внутренние соединение по равенству этого поля для ситуаций, когда есть вероятность получения больших размеров таблиц результатов вложенных запросов. Т.е. конструкцию «Поле1 В (Выбрать Поле1 из Таблица2)» заменить на «ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 По Таблица1.Поле1 = Таблица2.Поле1«

Популярность: 18%

Рубрика: Настройка и оптимизация | Метки: | Добавить комментарий