Ошибка 1105: переполнение журнала транзакций или другого сегмента базы данных

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

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

Во-вторых, по каким-то причинам порогов может не быть, а соответствующая хранимая процедура — попросту не сработать. После перехода от SQL Server 4.9.2 на System 10 или System 11 во всех перенесенных из старого сервера базах данных необходимо вручную активизировать пороги последнего уровня для журналов транзакций, поскольку в этом случае эти пороги не устанавливаются автоматически, и их отсутствие может привести к возникновению ошибки 1105.

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

Основные последствия переполнения журнала транзакций уже рассматривались в главах 9 и 11 .
Обнаружив ошибку 1105, администратор сервера должен выполнить определенные действия, чтобы найти источник проблемы и устранить ее.

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

Отметим, что, вероятно, транзакция, ставшая причиной ошибки 1105, уже была автоматически отменена сервером как раз вследствие возникновения ошибки 1105 при ее обработке. В результате, проверяя состояние соответствующего сегмента, вы можете обнаружить, что там имеется некоторое свободное пространство.

Здесь необходимо решить, намерены ли вы немедленно приступить к его расширению или предпочитаете, чтобы пользователь еще раз подучил сообщение об ошибке 1105, и лишь затем взяться за анализ и ликвидацию проблемы. Название переполнившегося сегмента и его базы данных указывается в сообщении об ошибке 1105. Перед тем как принять какие-либо меры, обязательно убедитесь, что указанный сегмент действительно переполнился.

Поиск базы данных, содержащей переполнившейся сегмент

Получив сообщение об ошибке 1105, выясните, в какой базе данных произошло переполнение сегмента. В большинстве случаев это нетрудно установить из сообщений пользователей и журнала регистрации ошибок сервера. Если вам не удается найти базу данных, в которой возникла эта ошибка, перейдите к следующему этапу процедуры и выполните действия, описанные ниже, для всех баз данных сервера.

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

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

1. Проверьте наличие свободного пространства во всех сегментах базы данных.
2. Попытайтесь создать контрольную точку, чтобы убедиться в переполнении журнала транзакций.
3. Попытайтесь создать новую таблицу данных в сегментах system и default, чтобы убедиться в переплнении этих сегментов.
4. Попытайтесь создать новую таблицу данных в каждом пользовательском сегменте, чтобы убедиться в его переполнении.

Создание контрольной точк для проверки переполнения журнала транзакций

Выявив базу данных с переполнившимся сегментом, подключитесь к ней и выполните команду checkpoint. Нормальное завершение этой команды свидетельствует об успешном создании контрольной точки и наличии некоторого свободного пространства в журнале транзакций. Поэтому можно не указывать параметр no_log при очистке журнала командой dump transaction.

Отметим, что в этой ситуации попытка выполнения команды dump transaction with no_log может привести к порче базы данных и другим проблемам. Присутствие свободного места в журнале транзакций позволяет сделать следующие выводы:

1. Возможно, мы имеем дело не с той базой данных. Если ошибка 1105 действительно вызвана переполнением сегмента журнала транзакций (logsegment), то этот сегмент переполнился в другой базе данных, к поискам которой и следует перейти.

2. Ошибка 1105 — случайность. Может быть, сервер выполнил автоматический откат транзакции, ставшей причиной переполнения журнала транзакций. Следует решить, намерены ли вы немедленно приступить к очистке журнала транзакций или дождетесь выдачи новых ошибок 1105.

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

Ненормальное завершение команды checkpoint и выдача нового сообщения об ошибке 1105 свидетельствуют о переполнении журнала транзакций — он не имеет свободного места даже для записи о создании контрольной точки.

Создание таблицы аля проверки переполнения сегментов system и default

После успешного создания контрольной точки попытаемся создать в базе данных несколько таблиц. Их названия должны быть как можно более необычными, например:

create table psycho1 (a int)

Использование нестандартных имен позволит в будущем легко найти эти таблицы среди названий других объектов базы данных, перечисленных в системной таблице sysobjects. (Это нужно на случаи, если вы забудете удалить эти таблицы, закончив проверку).

Нормальное завершение команды create table свидетельствует о наличии свободного пространства в соответствующем сегменте базы данных (в базы данных, не имеющей пользовательских сегментов, — это сегменты
system и default).

Ненормальное завершение команды create table с выдачей сообщения об ошибке 1105 указывает на действительное переполнение сегмента, в котором мы пытались создать новую таблицу.

Необходимо расширить пространство сегмента. Завершив проверку сегмента, не забудьте удалить только что созданную таблицу. Перед ее удалением обязательно проверьте, что вы удаляете именно ту таблицу, которая была создана для проверки заполнения сегмента.

Создание таблицы аля проверки переполнения пользовательского сегмента

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

create table psycho1 (a int) on <название_сегмента>

Аналогично предыдущему случаю, аварийное завершение команды create table с выдачей сообщения об ошибке 1105 свидетельствует о переполнении данного сегмента и необходимости расширения выделенного ему дискового пространства.

Еще раз напомним о необходимости удалить созданную таблицу, завершив проверку сегмента. Удостоверьтесь, что вы удаляете именно ту таблицу, которая была сделана для контроля заполнения сегмента.

Переполнение журнала транзакций

Прежде всего попытайтесь командой dump transaction без каких-либо параметров записать обычный дамп журнала транзакций. Вы сохраните на диск содержимое журнала транзакций и очистите записи обо всех завершенных (т.е. зафиксированных либо отмененных) транзакциях. Выполнив и checkpoint. Ее нормальное завершение указывает на успешную очистку журнала транзакций. Объем свободного пространства, имеющегося в журнале транзакций, можно проверить одной из следующих команд:

sp_spaceused syslogs
sp_helpdb <имя_базы_данных>
sp_helpsegment logsegment

Полученный результат следует сопоставить с общим объемом журнала транзакций рассматриваемой базы данных. Если даже после сохранения дампа журнала транзакций он близок к переполнению, то причина заключается в том, что одна или несколько транзакций остались незавершенными.

В случае, когда повторная попытка создать контрольную точку также завершается неудачей и выдачей ошибки 1105, вам придется очистить журнал транзакций командой dump transaction с параметром no_log (не записывающей в журнал транзакций информации о создании контрольной точки), а затем снова выполнить команду checkpoint.
Если на этот раз контрольную точку создать удалось, то с помощью команды sp_spaceused syslogs определите, сколько свободного места появилось в журнале транзакций. Убедившись, что журнал транзакций практически пуст и его очистка завершена, можете приступать к сохранению полного дампа базы данных.

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

В подобной ситуации ликвидируйте серверный процесс, обрабатывающий открытую транзакцию. Можно попросить пользователя, ответственного за эту транзакцию, отключиться от сервера, что приведет к откату этой транзакции. Самое сложное здесь — найти пользователя. Если вы не знаете, какие пользователи могут на длительное время оставить открытые транзакции (например, из”за особенностей отдельных приложений), вам придется приступить к последовательному уничтожению пользовательских процессов.

Другой путь — перезапустить сервер для полного удаления процессов пользователей и отката всех открытых транзакций.

Разумеется, при переполнении сегмента журнала транзакций (logsegment) администратор сервера может расширить дисковое пространство, распределенное этому сегменту и тем самым временно избежать повторения ошибки 1105.

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

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

Переполнение сегмента базы данных

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

Пользовательские сегменты чаще всего создаются для повышения производительности сервера путем вынесения определенных объектов данных (таблиц или индексов) на отдельное серверное устройство.

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

Наличие нескольких сегментов на одном серверном устройстве

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

Например, при создании баз данных их сегмент журнала транзакций logsegment обычно выносится на отдельное серверное устройство, а два других обязательных сегмента — system и default — размещаются вместе на всех остальных серверных устройствах, распределенных базе данных.

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

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100