Как правильно сбить и поправить установку памяти в SQL Server

 

Это тоже будет пост из серии «Вводный курс молодого бойца» подобно конфигурированию SQL Server для сетевого доступа, тоже с семинара по SQL Server. В данном случае неважно, на какую тему. Слушатели приступили к выполнению лабораторки. Из-за одного компьютера тянется рука - у меня не работает SQL Server.

На лабораторных машинах SQL Serverу была сконфигурирована фиксированная память буфер пула. Человек решил вернуть динамическое выделение.

 

image

Рис.1

 

Он не знал, а может быть, забыл, что по умолчанию max server memory = 2147483647, и поставил ее в 0, решив, что это та же бесконечность. В соответствии с документацией SQL Server поставил себе max server memory = 16 (МБ), после чего сделался грустным, молчаливым и задумчивым.

 

image

Рис.2

 

Увидев, что SQL Server еле ворочается, слушатель испугался и перезапустил сервис mssqlserver. При штатном гашении SQL Server должен скинуть закоммиченные данные с кэша на диск и проставить чекпойнты в базах. 16-ти метров не хватило, чтобы нормально в разумное время застопить сервис. Понаблюдав минуты 3 сервис в состоянии Stopping, слушатель запросил подмоги.

 

image

 

Рис.3

 

Я прихлопнул процесс sqlservr.exe из Task Manager. Сказал добавить в стартовые параметры -f, например, через SQL Server Configuration Manager, перезапустить машину, зайти на SQL Server и вернуть на место установки памяти. Через минуту-другую слушатель вновь позвал на помощь и сказал, что машина перестартовала, но SQL Server не хочет запускаться. Посмотрели, что при этом пишется в Event Log:

 

image

 

Рис.4

 

Страсть какая. Главное - не теряться. В самом деле, кто ж не знает эту ошибку! Ее знают все по памяти среди ночи. На всякий случай решил прoверить на предмет правильности стартовые параметры сервиса. Открыл SQL Server Configuration Manager -> SQL Server Services -> SQL Server (имя инстанса) -> закладка Advanced -> Startup Parameters.

 

image

Рис.5

 

Так и есть. Попросил слушателя поставить после -f точку с запятой и вернулся читать семинар. Не успел сообразить, на чем мы, бишь, остановились, как товарищ снова тянет руку и говорит, что SQL Server все равно не стартует с той же ошибкой в системном журнале. Я проверил - точка с запятой стоит. Что за черт? Запустил сервис. Не стартует. Стали подтягиваться соседние слушатели. Срамиться перед честным народом не хотелось. Проверил ошибку. Вернулся на Рис.5. Инстанс тот самый. Пути к базам не менялись. Стартовый эккаунт тот же, права те же. master он не трогал, закорруптить не мог. С умным видом открыл regedit. Посмотрел, как там отразились стартовые параметры:

image

Рис.6

 

Вот, где собака порылась. После -f; товарищ влепил пробел, а я на Рис.5 его сослепу не заметил. Убрал пробел, стартовал SQL Serverный сервис. Наконец-то. Открыл Books On-Line на странице «Запуск SQL Server в однопользовательском режиме», объяснил, что делать, пошел вещать дальше. Не дошел. Не может он присоединить экземпляр SQL Server в Object Browser SSMS. Тот говорит, что раз я запущен в однопользовательском режиме, то больше одного соединения у меня не собираться.

 

image

Рис.7

 

Товарищ чересчур буквально воспринял слова насчет SQL Agenta в Books On-Line. SQL Agent, действительно, запущен не был (Рис.3). Зато была запущена репортинговая служба, которая имела свой антирес к SQL Server, т.к. держала на ем свои базы. Почуяв, что SQL Server поднялся, она к нему моментом законнектилась. После того, как сервис SQL Server Reporting Services был застоплен, SQL Server дал себя законнектить из Object Browser и с чувством глубокого морального удовлетворения воспринял 2147483647 в качестве max server memory. После чего идем в Рис.5, убираем ключ -f и снова перезапускаем SQL Server, возобновив нормальную многопользовательскую работу.

 

 

Алексей Шуленин