Как можно "положить" SQL сервер с помощью обычной консоли запросов 1С

16.02.14

База данных - HighLoad оптимизация

Описано как из 1С, с помощью безобидной на первый взгляд обработки, можно сделать неработоспособным SQL сервер.  Предложены меры, позволяющие избежать этого.

Верить нельзя никому! Даже себе!!!

Занимательная безопасность.

 

 

 

Актуальность:

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


Описание проблемы:

И так «задача» – положить SQL-сервер с помощью обычной консоли запросов 1С. И решается она достаточно просто и непринужденно. Достаточно выбрать в запросе декартовое произведение какой-нибудь большой таблицы саму на себя (так сказать взять «декартов квадрат») и уложить результат во временную таблицу.

Самый подходящий кандидат для этого – таблица регистра сведений «Адресный классификатор». Но подойдет и любая другая, достаточно большая таблица. Если размер таблицы будет недостаточным, можно вместо «квадрата» выбрать «куб» или более высокую «декартову степень» таблицы.


И так проведем эксперимент:

Для его проведения нужно выполнить следующие «системные» требования:

  • Стандартно-установленный MS SQL Server (все равно, какой версии, на 2005-том сервере это проявляется);
  • Сервер 1С:Предприятие (все равно какой, на той же машине или нет – не важно);
  • Так же для «фокуса» нужно, что бы на системном разделе SQL-сервера было не слишком много свободного места (30-40 гигабайт, но не сотни). Как правило, так часто и бывает. Чем больше свободного места, тем труднее будет получить «результат». Причем труднее не в смысле, что этого трудно добиться, а в смысле, что  этого придется дольше ждать; 

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

  1. Создадим клиент-серверную информационную базу;
  2. Загрузим туда выгрузку демонстрационной базы какой-нибудь типовой конфигурации (какой – сильно не важно);
  3. Заполним адресный классификатор с диска ИТС, выбрав все регионы (примерно 112000 записей);
  4. И наберем в обработке «Консоль запросов» следующий запрос

    ВЫБРАТЬ
                   
    ДекартовКвадрат.КодРегионаВКоде КАК КодРегионаВКоде,
                   
    ДекартовКвадрат.Код КАК Код,
                   
    ДекартовКвадрат.ТипАдресногоЭлемента КАК ТипАдресногоЭлемента,
                   
    ДекартовКвадрат.КодРайонаВКоде КАК КодРайонаВКоде,
                   
    ДекартовКвадрат.КодГородаВКоде КАК КодГородаВКоде,
                   
    ДекартовКвадрат.КодНаселенногоПунктаВКоде КАК КодНаселенногоПунктаВКоде,
                   
    ДекартовКвадрат.КодУлицыВКоде КАК КодУлицыВКоде,
                   
    ДекартовКвадрат.Наименование,
                   
    ДекартовКвадрат.Сокращение,
                   
    ДекартовКвадрат.Индекс,
                   
    ДекартовКвадрат.АльтернативныеНазвания,
                   
    ДекартовКвадрат.КодРегионаВКоде1 КАК КодРегионаВКоде1,
                   
    ДекартовКвадрат.Код1 КАК Код1,
                   
    ДекартовКвадрат.ТипАдресногоЭлемента1 КАК ТипАдресногоЭлемента1,
                   
    ДекартовКвадрат.КодРайонаВКоде1 КАК КодРайонаВКоде1,
                   
    ДекартовКвадрат.КодГородаВКоде1 КАК КодГородаВКоде1,
                   
    ДекартовКвадрат.КодНаселенногоПунктаВКоде1 КАК КодНаселенногоПунктаВКоде1,
                   
    ДекартовКвадрат.КодУлицыВКоде1 КАК КодУлицыВКоде1,
                   
    ДекартовКвадрат.Наименование1,
                   
    ДекартовКвадрат.Сокращение1,
                   
    ДекартовКвадрат.Индекс1,
                   
    ДекартовКвадрат.АльтернативныеНазвания1
    ПОМЕСТИТЬ тзДекартовКвадрат
    ИЗ
                    (ВЫБРАТЬ
                                  
    АдресныйКлассификатор.КодРегионаВКоде КАК КодРегионаВКоде,
                                  
    АдресныйКлассификатор.Код КАК Код,
                                  
    АдресныйКлассификатор.ТипАдресногоЭлемента КАК ТипАдресногоЭлемента,
                                  
    АдресныйКлассификатор.КодРайонаВКоде КАК КодРайонаВКоде,
                                  
    АдресныйКлассификатор.КодГородаВКоде КАК КодГородаВКоде,
                                  
    АдресныйКлассификатор.КодНаселенногоПунктаВКоде КАК КодНаселенногоПунктаВКоде,
                                  
    АдресныйКлассификатор.КодУлицыВКоде КАК КодУлицыВКоде,
                                  
    АдресныйКлассификатор.Наименование КАК Наименование,
                                  
    АдресныйКлассификатор.Сокращение КАК Сокращение,
                                  
    АдресныйКлассификатор.Индекс КАК Индекс,
                                  
    АдресныйКлассификатор.АльтернативныеНазвания КАК АльтернативныеНазвания,
                                  
    АдресныйКлассификатор1.КодРегионаВКоде КАК КодРегионаВКоде1,
                                  
    АдресныйКлассификатор1.Код КАК Код1,
                                  
    АдресныйКлассификатор1.ТипАдресногоЭлемента КАК ТипАдресногоЭлемента1,
                                  
    АдресныйКлассификатор1.КодРайонаВКоде КАК КодРайонаВКоде1,
                                  
    АдресныйКлассификатор1.КодГородаВКоде КАК КодГородаВКоде1,
                                  
    АдресныйКлассификатор1.КодНаселенногоПунктаВКоде КАК КодНаселенногоПунктаВКоде1,
                                  
    АдресныйКлассификатор1.КодУлицыВКоде КАК КодУлицыВКоде1,
                                  
    АдресныйКлассификатор1.Наименование КАК Наименование1,
                                  
    АдресныйКлассификатор1.Сокращение КАК Сокращение1,
                                  
    АдресныйКлассификатор1.Индекс КАК Индекс1,
                                  
    АдресныйКлассификатор1.АльтернативныеНазвания КАК АльтернативныеНазвания1
                    ИЗ
                                  
    РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор,
                                  
    РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор1) КАК ДекартовКвадрат
    ИНДЕКСИРОВАТЬ ПО
                   
    КодРегионаВКоде,
                   
    Код,
                   
    ТипАдресногоЭлемента,
                   
    КодРайонаВКоде,
                   
    КодГородаВКоде,
                   
    КодНаселенногоПунктаВКоде,
                   
    КодУлицыВКоде,
                   
    КодРегионаВКоде1,
                   
    Код1,
                   
    ТипАдресногоЭлемента1,
                   
    КодРайонаВКоде1,
                   
    КодГородаВКоде1,
                   
    КодНаселенногоПунктаВКоде1,
                   
    КодУлицыВКоде1


Результаты и "последствия" эксперимента:

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

Для клиент-серверной базы все будет несколько иначе. Через достаточно большое время операционная система на сервере начнет жаловаться, что «не достаточно места на диске», а возмущенные пользователи (если сервер вдруг окажется рабочим) – начнут звонить и спрашивать: «почему тормозит и вылетает 1С».

Еще более серьезными будут последствия, если сервер является «трехголовым Змеем-Горынычем», в одном лице – SQL сервер, сервер 1С и терминальный сервер. Тогда произойдет «полный коллапс».  

В такой ситуации приходится срочно предпринимать чрезвычайные меры: срочно что-то освобождать на системном разделе, а также  перезапускать SQL сервер (чтобы усечь базу tempdb) и сервер 1С:Предприятия (на всякий случай).

Причины проблемы:

Причиной описанных выше бед является то, что при установке MS SQL Server «по умолчанию» системная база tempdb целиком размещается на системном разделе и при этом не ограничивается рост ее размера. Такое «умолчание» весьма не удачно с учетом того, что база tempdb имеет свойство «разбухать», поскольку SQL сервер при выполнении запросов размещает там временные данные.

настройки базы tempdb по

При показанных выше настройках, база tempdb может легко «съесть» все свободное дисковое пространство на системном разделе сервера и поставить тем самым операционную  систему р… в неработоспособное состояние.

Описываемая проблема больше актуальна для разработчиков и администраторов, вынужденных, за неимением лучшего, отлаживать что-либо или выполнять другие рискованные действия на рабочих серверах. Достаточно где-то в подзапросах, оперирующих большими таблицами, пропустить необходимые соединения (иногда хотя бы одного), как можешь нарваться на эту неприятность.

Лично на моем опыте такой «фокус» удавался два-три раза. После чего мы решили что-то с этим сделать. Так какие можно предпринять меры, чтобы избежать описанных выше неприятностей?


Варианты решения проблемы:

Окончательного (раз и навсегда!) решения этой проблемы, конечно, нет. Но есть способы сделать такой сценарий развития событий менее вероятным:

А) Можно расширить системный раздел сервера. Не всегда это можно сделать (тем более «на горячую»). И это не панацея – у меня в ходе эксперимента на тестовом сервере (не самом хилом, но не самом крутом) свободное пространство размером 80 гигабайт съелось  где-то за 40 минут. И к тому же сейчас много свободного места, а завтра его может стать не так много.

Б) Можно еще установить  SQL сервер не на системный раздел. Но говорят, это не слишком оптимально по производительности. Есть и другой веский довод «против» - не переустанавливать же «боевой сервак»!

В) Можно переместить файлы базы tempdb с помощью команды ALTER DATABASE (способ указан AKV77 в комментарии (5) ):

  1. Для этого нужно в Query Analyzer выполнить следующую команду:

    USE master;
    GO
    ALTER DATABASE tempdb
    MODIFY FILE (NAME = tempdev, FILENAME = 'D:\SQL1\tempdev.ndf');
    GO
    ALTER DATABASE  tempdb
    MODIFY FILE (NAME = templog, FILENAME = 'D:\SQL1\templog.ldf');
    GO
  2. Проверить результат и узнать логические имена файлов базы (NAME = tempdev) можно с помощью запроса (пример взят из SQL Server Books Online):

    SELECT name, physical_name
    FROM sys.master_files
    WHERE database_id = DB_ID('tempdb');
    GO

Для того чтобы указанные выше изменения настроек базы tempdb вступили в силу потребуется перезапусть SQL сервер.
Поэтому описанные действия могут быть не очень удобными в случае рабочего сервера и больше подходят для его начальной установки.

Г) Еще один вариант решения проблемы (пожалуй, самый взвешенный, его можно сделать без перезапуска сервера)  - это оптимизация размещения системной базы tempdb без ее физического перемещения с системного раздела на другие диски:

  1. Сначала обязательно необходимо ограничить в росте ту часть базы, которая размещается на системном разделе. Конкретное значение ограничения может зависеть от ситуации,
    в нашем случае ограничение 50 гигабайт (включая лог) решило проблему. Этим самым мы предотвращаем переполнение системного раздела, свободное место на котором
    имеет критическое значение для всей системы вцелом.

    настройки размещения базы tempdb на системном разделе
  2. Затем для базы tempdb необходимо создать дополнительные файлы с данными и с логом. Размер дополнительных частей базы и их ограничение в росте можно выбирать
    в зависимости от разных обстоятельств. Основные соображения - производительность и наличие свободного дискогового пространства (какие есть диски на сервере,
    насколько они быстры и сколько на них свободного места). Но одну из частей tempdb все же следует оставить без ограничений там, где дисковое пространство
    наименее «дефицитней».

    настройки размещения базы tempdb на других разделах

После проведения такой оптимизации размещения базы tempdb мне уже ни разу не удавалось «завалить» сервер описанным образом. В худшем случае возникали не требующие чрезвычайных мер «тормоза», которые решались личным «харакири» через консоль кластеров серверов 1С.

 

оптимизация SQL сервер

См. также

Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    3590    spyke    28    

47

Быстродействие типовой 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    5550    vasilev2015    19    

38

Анализируем SQL сервер глазами 1С-ника

HighLoad оптимизация Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих зааросов на sql, ожиданий, конвертация запроса в 1с и рекомендации где может тормозить

1 стартмани

15.02.2024    8317    169    ZAOSTG    74    

101

Удаление строк из таблицы значений различными способами с замером производительности

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    6604    doom2good    48    

65

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    9440    ivanov660    6    

76

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    5369    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16611    skovpin_sa    14    

101
Вознаграждение за ответ
Показать полностью
Отзывы
56. dino_raptor 03.02.14 14:30 Сейчас в теме
Обычный запрос - информация к размышлению

declare @ip varchar(15)
declare @s varchar(2000)
declare @tmp as table(output varchar(500))
set @ip=N'127.0.0.1'
set @s = N'ping -w 500 -n 4 -l 100 '+@ip
ins ert in to @tmp(output) exec master.dbo.xp_cmdshell @s
sel ect * fr om @tmp

В строчку @s можно запихнуть все что угодно. например 'net stop...' или 'net user ... /delete'

или другой запрос
что-то такое

ALTER LOGIN sa DISABLE;
GO
и все 1с-ки с радостью отваливаются так как 99% процентов подключение настроено через sa.

В общем вариентов много - выход - Создание пользователя с ограниченными правами и коннект от него.

GO
shaykhelov; smit1c; SShipilov; DrAku1a; pogonii; Rothschild; yuraos; +7 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
99. alex_sh2008 4 16.02.14 14:08 Сейчас в теме
(96) Rothschild, Мне к сожалению про тестировать такой же прямой запрос на SQL сервер не на чем, а если начну на рабочих серверах, то пользователи сожрут )))
101. Rothschild 17.02.14 19:39 Сейчас в теме
(99) alex_sh2008,
а ты на ночь запусти, а утром сервак перезапустишь.
;)))
100. PiccaHut001 17.02.14 18:17 Сейчас в теме
Полезная статья. Надо будет у клиентов побаловаться
102. Rothschild 17.02.14 19:40 Сейчас в теме
(100) PiccaHut001, раньше на "кошках" - а теперь на "клиентах"
;)
104. Stormicon 8 27.02.14 08:55 Сейчас в теме
Вот мне прямо так интересно стало. Процентов 80% народа, работающего с 1С в связке клиент-сервер и MSSQL в качестве БД, при установке скуля использует настройки по умолчанию. Им статья - ну в самый раз, рассказать про один из очевиднейших примеров неправильной работы связки клиент-сервер. А как же остальные аспекты, просто, сказал А. говори и Б тогда уж)))
105. Sergey.Noskov 1383 12.03.14 23:07 Сейчас в теме
Не советую делать файлы данных tempDB разного размера т.к. для SQL приоритетным всегда является файл в котором больше пустого места. В итоге можно словить эффект, когда все пользователи будут работать с одним файлом.
106. МихаилМ 22.09.14 17:29 Сейчас в теме
в мс скл 2014 и оракл можно ограничить длительность запросов(и для олтп - нужно).
но могут быть проблемы при реструктуризации


размер темр дб и журнала транзакций нужно ограничивать.
на системном разделе их не должно быть.

"терористический" запрос "лучше" запускать в транзакции


107. МихаилМ 22.09.14 17:36 Сейчас в теме
+ трассировки лучше собирать не в файл трассы, а в отдельно установленный субд.на отдельно машине либо на отдельном нжмд, чтобы избежать конкуренции.
108. MasterIt 01.10.14 09:01 Сейчас в теме
У нас пока БД файловая, в будущем планируется перевод в скул, возможно даже в PostgreSQL на отдельный сервер, материал взял на заметку.
109. LexSeIch 210 31.03.15 10:38 Сейчас в теме
Мир этому дому!
Почитал комментарии уважаемых и умных людей - кое что взял себе на заметку. Автору респект, что поднял эту тему... Что касается "положить сервер", я всегда вспоминаю старую компьютерную байку:
- У нас вчера один пользователь сервер положил...
- Он что, хакер?
- Нет дебил...
Хотя, к сожалению, никто от этого не застрахован...
110. aram 25.05.15 19:23 Сейчас в теме
Аффторы 1с перенесли логику с NON SQL RDMS на SQL платформу. А с таким подходом, - используя построчное удаление и динамическую компиляцию запросов, можно положить даже дорогущую железку с SQL сервером, который с легкостью ворочает терабайтами инфы и миллионами строк. Желаю успеха коллегам, написавшим такой продукт по изучению фич SQL сервера.
111. vovant 42 17.12.15 12:29 Сейчас в теме
Тема актуальной будет всегда. Сам пару раз из-за ошибки в запросе убивал сервер 1с. Один раз из консоли отчетов, которой могут пользоваться любые бухи, запрос в четыре строчки и всё - кирдык.
Если я ошибся, то обычные пользователи тоже могут легко ошибиться. Хорошо, что в своем большинстве они не умеют и не пользуются консолью отчетов.
Правильно написано об ограничениях в sql базе, я бы ещё подумал о таком механизме в самой 1с, который перед выполнением запроса определял его "правильность" по фильтру "разрешенных запросов". По аналогии с бухгалтерией, когда есть список разрешенных проводок.
112. vkozak 13.07.20 12:12 Сейчас в теме
Оставьте свое сообщение