Microsoft sql server 2005 ошибка базы

Номер ошибки: 60178 (Content Maintenance)

ВВЕДЕНИЕ

В данной статье описывается SQL Server об ошибке 2570, что приводит к ошибке и решить проблему.

Дополнительные сведения

DATA_PURITY проверок

В SQL Server 2005 был добавлен новый параметр DATA_PURITY, команды DBCC CHECKDB и DBCC CHECKTABLE. При выполнении команды DBCC CHECKDB и DBCC CHECKTABLE этот параметр включен, будет выполнять проверки «данных чистоту» на все значения столбцов во всех строках таблицы или таблиц в базе данных. Эти новые проверки выполняются для проверки допустимости значения, хранящиеся в столбцах (то есть, значения не вне диапазона для домена связан с типом данных этого столбца). Характер проверки допустимости зависит от типа данных столбца. Следующий список не исчерпывающий предоставляет несколько примеров:

Тип данных столбца

Тип проверки данных выполнено

Знак Юникода

Длина данных должен быть кратен 2.

Datetime

Поле дней должно быть между 1 января 1753 г. и 31 декабря 9999 года. Поле время должна предшествовать «11:59:59:999 PM».

Реальные и с плавающей запятой

Проверьте наличие недопустимых значений с плавающей запятой, например SNAN, QNAN, NINF, ND, PD, PINF.

Не все типы данных проверяются на допустимость значений данных в столбце. Только там, где это возможно хранится в виде значения, находится вне допустимого диапазона проверки. Например тип данных tinyint имеет допустимый диапазон от 0 до 255, хранятся в один байт (который может хранить только значения от 0 до 255), поэтому проверка значения не требуется.

Проверка данных чистота не включается автоматически для всех баз данных. Проверяет, включены в зависимости от нескольких факторов:

  • Для баз данных, созданных в SQL Server 2005 и более поздних версий эти проверки включается по умолчанию и не может быть отключен, поэтому использование параметра DATA_PURITY при выполнении команды DBCC CHECKDB и DBCC CHECKTABLE не учитывается.

  • Для баз данных, созданных в более ранних версиях SQL Server, SQL Server 2000, SQL Server 7.0 и версии обновлены до SQL Server 2005 эти проверки не включена по умолчанию. Чтобы эти проверки должны быть выполнены необходимо указать параметре DATA_PURITY в команде DBCC CHECKDB и DBCC CHECKTABLE. Это может привести к две вещи:

    • Команда DBCC завершает и сообщает о чистой, включая все проверки чистоты данных базы данных. Этот факт записывается в заголовке базы данных. Все последующие выполнения команды DBCC CHECKDB и DBCC CHECKTABLE заметит эту информацию и автоматически выполнит проверку данных чистоты, как произойдет для баз данных, созданных в SQL Server 2005. Другими словами когда известно, что база данных является «чистое», всегда выполняются проверки чистоты данных.

    • Команда DBCC завершения, но сообщает о несогласованности данных проблем. Если это так, будет необходимо очистить базу данных, чтобы избавиться от несоответствий и попробуйте снова выполнить команду DBCC. Необходимо для указания параметра DATA_PURITY для команды DBCC, пока база данных считается новой.

  • Если при выполнении команды DBCC CHECKDB и DBCC CHECKTABLE указан параметр PHYSICAL_ONLY, проверка чистоты данных не выполняется.

СИМПТОМЫ

Недопустимый или выход из допустимого диапазона данных может сохранены в базе данных SQL Server в более ранних версиях по следующим причинам:

  • Недопустимые данные присутствовало в источнике при использовании bulk insert методы, такие как программа bcp.

  • Недопустимые данные были переданы через вызовы RPC событий SQL Server.

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

Если имеются недопустимые данные в столбце таблицы, могут возникнуть проблемы в зависимости от типа операции, которая выполняется недопустимые данные. Тем не менее это также возможно, что будет отображаться нормально и не будет обнаруживаться недопустимые данные до выполнения команды DBCC CHECKDB и DBCC CHECKTABLE на SQL Server 2005 и более поздних версий.

Некоторые симптомы, которые могут возникнуть из-за наличия недопустимых данных относятся (но не ограничиваются):

  • Нарушение прав доступа или другие типы исключений во время выполнения запросов к проблемной колонке.

  • Неверные результаты запросов данных соответствующих столбцов.

  • Ошибки или проблемы, когда статистика строятся для задействованных столбцов.

  • Сообщения об ошибках следующим образом:

    Msg 9100, 23 уровня, состояние 2, строка 1 возможных обнаружено повреждение индекса. Выполните инструкцию DBCC CHECKDB.

Отчет о проблеме DATA_PURITY

При выполнении инструкции DBCC CHECKDB и DBCC CHECKTABLE с включенным параметром DATA_PURITY (или чистота данных, проверки запускаются автоматически) и недопустимые данные существуют в таблицах проверяются с помощью команд DBCC, выходные данные инструкции DBCC включает дополнительные сообщения, которые указывают на проблемы с данными. Ниже приведены некоторые образца сообщений об ошибке, которые указывают на проблемы чистоты данных:

Результаты выполнения команды DBCC для «account_history».
Msg 2570, уровень 16, состояние 2, строка 1
Страницы (1:1073), 33 разъем в объект 1977058079 идентификатор индекса с кодом 0, ID 129568478265344 раздела, единицы ID 129568478265344 (тип «в строке данных»). Столбец «account_name_japan» значение лежит вне диапазона для типа данных «nvarchar». Обновление столбца на допустимое значение.

Msg 2570, уровень 16, состояние 2, строка 1
Страницы (1:1156), 120 в объект разъем 1977058079 идентификатор индекса с кодом 0, ID 129568478265344 раздела, единицы ID 129568478265344 (тип «в строке данных»). Столбец «account_name_japan» значение лежит вне диапазона для типа данных «nvarchar». Обновление столбца на допустимое значение.
Существуют 153137 строк на страницах 1080 для объекта «account_history».
В таблице «account_history» (объект ID 1977058079) CHECKDB найдено 0 ошибок распределения и 338 ошибок согласованности.
CHECKDB найдено 0 ошибок распределения и 338 ошибок согласованности в базе данных «BadUnicodeData».
Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Результаты выполнения команды DBCC для «table1».
Msg 2570, уровень 16, состояние 3, строка 1
Страницы (1:154), разъем 0 в объекте с Идентификатором 2073058421, индекса с Идентификатором 0, раздел 72057594038321152 ID, единицы ID 72057594042318848 (тип «в строке данных»). Значение столбца «col2» находится вне диапазона для типа данных «реальными». Обновление столбца на допустимое значение.
Существует 4 строки в 2 страницы для объекта «Таблица1».
CHECKDB найдено 0 распределения и согласованности 1 ошибки в таблице «table1» (объект ID 2073058421).
CHECKDB найдено 0 ошибок распределения и 1 ошибок согласованности в базе данных «realdata». Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Результаты выполнения команды DBCC для «table2».
Msg 2570, уровень 16, состояние 3, строка 1
Страницы (1:155), разъем 0 в объекте с Идентификатором 2105058535, индекса с Идентификатором 0, раздел 72057594038452224 ID, единицы ID 72057594042449920 (тип «в строке данных»). Значение столбца «col2» находится вне диапазона для типа данных «decimal». Обновление столбца на допустимое значение.
Существует 4 строки в 1 страницы для объекта «Таблица2».
CHECKDB найдено 0 распределения и согласованности 1 ошибки в таблице «table2» (объект ID 2105058535).
CHECKDB найдено 0 ошибок распределения и 1 ошибок согласованности в базе данных «realdata». Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Результаты выполнения команды DBCC для ‘Таблица3».
Msg 2570, уровень 16, состояние 3, строка 1
Страницы (1:157), разъем 0 в объекте с Идентификатором 2121058592, индекса с Идентификатором 0, раздел 72057594038517760 ID, единицы ID 72057594042515456 (тип «в строке данных»). Значение столбца «col2» находится вне диапазона для типа данных «datetime». Обновление столбца на допустимое значение.
Существует 3 строки в 1 страницы для объекта «Таблица3».
CHECKDB найдено 0 распределения и согласованности 1 ошибки в таблице «Таблица3» (объект ID 2121058592).
CHECKDB найдено 0 ошибок распределения и 1 ошибок согласованности в базе данных «realdata». Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Для каждой строки, которая содержит недопустимое значение столбца создается ошибка 2570.

Устранение неполадок чистота данных

С помощью любого из параметров восстановления DBCC не подлежат 2570 ошибки. Это потому, что это невозможно для инструкции DBCC определить, какие значения следует использовать для замены недопустимое значение столбца. Таким образом значение этого столбца следует обновить вручную.

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

  • Выполните запрос к таблице, которая содержит недопустимые значения, чтобы найти строки, которые содержат недопустимые значения.

  • Используйте сведения об ошибке 2570 для идентификации строк, которые имеют недопустимое значение.

Мы рассмотрим оба эти методы рассматриваются подробно ниже, используя примеры для поиска строк, которые содержат недопустимые данные.

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

  • Если вы знаете, какое значение следует, присвойте ему значение, определенное значение.

  • Установите его в значение по умолчанию приемлемо.

  • Значение столбца NULL.

  • Значение столбца в максимальное или минимальное значение для типа данных столбца.

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

Поиск строк с неверными значениями с помощью запросов T-SQL

Тип запроса, которые необходимо выполнить для поиска строк, которые содержат недопустимые значения зависит от типа данных столбца, который сообщил проблему. Если вы посмотрите на сообщение об ошибке 2570, вы заметите два важных аспекта сведений, которые помогут в этом. В следующем примере столбец «account_name_japan» значение за пределами допустимого диапазона для типа данных «nvarchar». Легко можно определить столбец, имеющий проблемы, а также тип данных связанных столбцов. Таким образом когда известен его тип данных и столбец, формулировать запрос, чтобы найти строки, которые содержат недопустимые значения для этого столбца, выбор столбцов необходимые для идентификации строки (как предикаты в предложении WHERE) для любого дальнейшего обновления или удаления.

Тип данных Юникода:

SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0


Тип данных float:

-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from the CHECKDB output
SELECT col1, col2 FROM table1
WHERE col2<>0.0 AND (col2 < 2.23E-308 OR col2 > 1.79E+308) AND (col2 < -1.79E+308 OR col2 > -2.23E-308)


Тип данных real:

-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from -- the CHECKDB output
SELECT col1, col2 FROM testReal
WHERE col2<>0.0 AND (col2 < CONVERT(real,1.18E-38) OR col2 > CONVERT(real,3.40E+38)) AND (col2 < CONVERT(real,-3.40E+38) OR col2 > CONVERT(real,-1.18E-38))
ORDER BY col1; -- checks for real out of range

Десятичных и числовых типов данных:

SELECT col1 FROM table2WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999

Имейте в виду, необходимый для настройки на основе точности и масштаба, с которой определено столбцов десятичных или числовых значений. В приведенном выше примере столбец определен как столбец col2 decimal(15,5).

Дата время данных типа:
Необходимо будет выполнить разные запросы, чтобы определить строки, которые содержат недопустимые значения для столбца даты-времени.

SELECT col1 FROM table3WHERE col2 < '1/1/1753 12:00:00 AM' OR col2 > '12/31/9999 11:59:59 PM'

SELECT col1 FROM table3 WHERE
((DATEPART(ms,col2)+ (1000*DATEPART(s,col2)) + (1000*60*DATEPART(mi,col2)) + (1000*60*60*DATEPART(hh,col2)))/(1000*0.00333))
> 25919999

Поиск строк с недопустимое значение с помощью физического расположения:

Этот метод можно использовать, если не удается найти строки интерес, используя метод T-SQL, описанных выше. В сообщении об ошибке 2570 физическое расположение строки, содержащей недопустимое значение выводится на печать. Например рассмотрим следующее сообщение:

Страницы (1:157), разъем 0 в объекте с Идентификатором 2121058592, индекса с Идентификатором 0, раздел 72057594038517760 ID, единицы ID 72057594042515456 (тип «в строке данных»). Значение столбца «col2» находится вне диапазона для типа данных «datetime». Обновление столбца на допустимое значение.

В этом сообщении можно заметить информация: страницы (1:157), разъем 0. Это сведения, необходимые для идентификации строки. Идентификатор файла равен 1, 157, PageInFile и SlotId — 0. Получив эти данные, необходимо выполнить команду, как показано ниже:

DBCC TRACEON ( 3604 )DBCC PAGE ( realdata , 1 , 157 , 3 )

Эта команда будет напечатать все содержимое страницы. Параметры команды DBCC страницы являются:

  • Имя базы данных

  • Идентификатор файла

  • PageInFile

  • параметры печати

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

Slot 0  Offset 0x60 Length 19 Record Type = PRIMARY_RECORD Record  Attributes = NULL_BITMAP Memory Dump @0x44D1C060 00000000: 10001000 01000000
ffffffff ffffffff †................ 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 0 Column 0 Offset 0x4 Length 4 col1 = 1 Slot 0 Column 1 Offset 0x8 Length 8 col2 = Dec 31 1899 19:04PM Slot 1 Offset 0x73 Length 19 Record Type = PRIMARY_RECORD Record
Attributes = NULL_BITMAP Memory Dump @0x44D1C073 00000000: 10001000 02000000
0ba96301 f8970000 †..........c..... 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 1 Column 0 Offset 0x4 Length 4
col1 = 2 Slot 1 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM Slot 2
Offset 0x86 Length 19 Record Type = PRIMARY_RECORD Record Attributes =
NULL_BITMAP Memory Dump @0x44D1C086 00000000: 10001000 03000000 0ba96301
f8970000 †..........c..... 00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 2 Column 0 Offset 0x4 Length 4 col1 = 3 Slot 2 Column 1 Offset 0x8 Length
8 col2 = Jul 8 2006 9:34PM

В эти выходные данные можно ясно увидеть значения столбца для строки, интересующие вас. В этом случае необходимо строк, хранящихся в разъем 0 страницы. Из сообщения об ошибке вы знаете, что этот столбец col2 является один со своей проблемой. Таким образом можно принимать значения col1 разъем 0 и использовать его в качестве предиката в предложении WHERE инструкции update или delete.

Предупреждение Рекомендуется использовать первый метод (, используйте T-SQL запросы для поиска необходимой информации). Команда DBCC страницы только в качестве последнего средства. Занять важнейшую осторожность при использовании этой команды в производственной среде. Рекомендуется для восстановления производственной базы данных на тестовом сервере, а затем получить все необходимые сведения, с помощью инструкции DBCC страницы и выполните обновление на рабочем сервере. Как и всегда убедитесь, что для поддержания готовности резервной копии на случай, если что-то пойдет не так, и необходимо вернуться к предыдущей копии базы данных.

Ссылки

Дополнительные сведения об инструкции DBCC CHECKDB приведены в разделе «Инструкции DBCC CHECKDB (Transact-SQL)» на следующем веб-узле Microsoft Developer Network (MSDN):

http://msdn2.microsoft.com/en-us/library/ms176064.aspxДополнительные сведения об известных проблемах в SQL Server 2000 щелкните следующий номер статьи базы знаний Майкрософт:

ИСПРАВИТЬ 900335 : Если индекс содержит тип данных FLOAT или тип данных REAL, и этот тип данных содержит значение NaN операции восстановления автоматического базы данных для SQL Server 2000 не удается

Дополнительные сведения о событиях RPC приведены в разделе «Вызов хранимой процедуры (OLE DB)» на веб-узле MSDN:

http://msdn2.microsoft.com/en-us/library/aa198358(SQL.80).aspxДополнительные сведения о типах данных приведены в разделе «Вызов хранимой процедуры (OLE DB)» на веб-узле MSDN:

http://msdn2.microsoft.com/en-us/library/ms187752.aspxДополнительные сведения о соглашениях значение с плавающей точкой посетите следующий сайт корпорации Intel:

http://www.intel.com/design/pentiumii/manuals/243191.htmКорпорация Майкрософт предоставляет контактные данные независимых производителей для поиска технической поддержки. Данная информация может изменяться без предупреждения. Корпорация Майкрософт не гарантирует точность контактных данных независимых производителей.

Время на прочтение
12 мин

Количество просмотров 37K

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

Как обнаружить, что база данных повреждена

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

SQL Server detected a logical consistency-based I/O error: incorrect checksum (expected: 0xfdff74c9; actual: 0xfdff74cb). It occurred during a read of page (1:69965) in database ID 13 at offset 0x0000002229a000 in file ‘D:DevelopDatabasesBroken1.mdf’.

Attempt to fetch logical page 1:69965 in database 13 failed. It belongs to allocation unit 72057594049069056 not to 281474980642816.

Основная проблема заключается в том, что если проверки целостности базы данных не производятся на постоянной основе, то повреждение может быть обнаружено спустя часы, дни и даже месяцы, после того, как оно образовалось, в тот момент, когда уже сложно будет что-то исправить.
Я не буду описывать ситуацию когда база данных перешла в состояние «suspect» («подозрительная» в русской редакции SQL Server — прим. переводчика). Описание всевозможных причин почему база данных может перейти в «suspect» и множества вариантов исправления этого — тема отдельной статьи, если не книги.

Что делать если база данных все-таки повреждена

  1. Не паниковать
  2. Не отсоединять (detach) ее
  3. Не перезапускать SQL Server
  4. Не начинать восстановление сразу
  5. Запустить проверку целостности
  6. Найти причину
Не паниковать

Самое важное, при обнаружении повреждения БД — это не паниковать. Любые принимаемые решения должны быть тщательно взвешаны, во внимание должны быть приняты все возможные факторы. Чертовски просто ухудшить ситуацию приняв не до конца обдуманное решение.

Не отсоединять базу данных

В большинстве случаев, когда SQL Server обнарживает повреждение базы данных, это означает, что в БД на самом деле есть поврежденные страницы. Попытка убедить SQL Server что это не так, путем отсоединения (detach) и повторного присоединения (attach) БД, бэкапа и последующего восстановления, перезапуска службы SQL Server, либо перезагрузки сервера, не приведет к тому, что ошибка исчезнет.
Если база данных повреждена и SQL Server обнаружит это при присоединении, он не сможет присоединить ее. Есть несколько способов заставить его увидеть эту БД, но намного лучше просто не отсоединять ее.

Не перезапускать SQL Server

Точно так же, как при отсоединении-присоединении, перезапуск службы SQL Server не сможет исправить обнаруженные ошибки (если они есть).
Перезапуск службы может сделать ситуацию хуже. Если SQL Server обнаружит ошибки во время выполнения фазы восстановления (recovery) БД после перезапуска, он пометит ее как «suspect», что сильно усложнит процесс восстановления БД.

Не начинать восстановление сразу

У вас может возникнуть соблазн просто запустить DBCC CHECKDB с одним из «восстановительных» параметров (обычно допускающими потерю данных) и надеяться, что все станет лучше (по моему опыту — первое что рекомендуют на «непрофильных» форумах по SQL Server — запустить DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS — прим. переводчика). Во многих случаях запуск такого восстановления не рекомендуется. Он не гарантирует исправления всех ошибок и может привести к недопустимой потере данных.
Такое восстановление — это последний шаг при исправлении ошибок. Оно должно быть запущено только если у вас уже нет другого выбора, но никак не в первую очередь.

Запустить проверку целостности

Для того чтобы решить как исправить базу данных, мы точно должны знать что именно повреждено. Единственный способ, которым мы можем это выяснить — запустить DBCC CHECKDB с параметром All_ErrorMsgs (в SQL Server 2005 SP3, SQL Server 2008 SP1 и в более старших версиях, этот параметр включен по умолчанию, указывать его не обязательно). Помните, что если вы запустите DBCC CHECKDB без параметра No_InfoMsgs, в выводе этой процедуры будет информация о количестве строк и страниц в каждой таблице, что вряд ли будет вас интересовать при анализе ошибок.
DBCC CHECKDB может долго выполняться на больших БД, но необходимо дождаться пока эта процедура не закончит работу. Грамотная стратегия восстановления может быть построена только при наличии информации обо всех проблемах в БД.

Найти причину

После того как ошибки исправлены, работу нельзя считать законченной. Если причина этих ошибок не установлена, они могут возникнуть снова. Обычно, основной причиной ошибок являются проблемы с подсистемой ввода-вывода, но они также могут быть вызваны неправильной работой «низкоуровнего ПО» (вроде антивируса), действиями человека, либо багами самого SQL Server.

Что дальше

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

Неверная информация о свободном месте на странице

Msg 2508, Level 16, State 3, Line 1
The In-row data RSVD page count for object «Broken1», index ID 0, partition ID 76911687695381, alloc unit ID 76911687695381 (type In-row data) is incorrect. Run DBCC UPDATEUSAGE.

В SQL Server 2000, количество строк и страниц в таблице или индексе, хранящееся в метаданных, могло не соответствовать действительности (и даже быть отрицательным) и DBCC CHECKDB не видел в этом ничего плохого. В SQL Server 2005, это количество должно быть правильным и CheckDB выдаст предупреждение, если вдруг найдет несоответствие.
Это несерьезная прблема и очень легко разрешается. Как говорится в сообщении, нужно всего лишь запустить DBCC UPDATEUSAGE в контексте нужной БД и предупреждение исчезнет. Эта ошибка часто встречается в базах данных обновленных с SQL Server 2000 и не должна появляться в базах данных, созданных в SQL Server 2005/2008.

Msg 8914, Level 16, State 1, Line 1
Incorrect PFS free space information for page (1:26839) in object ID 181575685, index ID 1, partition ID 293374720802816, alloc unit ID 76911687695381 (type LOB data). Expected value 0_PCT_FULL, actual value 100_PCT_FULL.

Эта ошибка появляется, когда PFS-страница (Page Free Space), которая учитывает насколько заполнены страницы в БД, содержит некорректные значения. Эта ошибка, как и упомянутая ранее, не является серьезной. Алгоритм, по которому определялось насколько заполнены страницы, в SQL Server 2000 не всегда отрабатывал правильно. Для решения этой проблемы нужно запустить DBCC CHECKDB с параметром REPAIR_ALLOW_DATA_LOSS и, если это единственная ошибка в БД, никакие данные, на самом деле, не пострадают.

Повреждение только некластерных индексов

Если все ошибки, найденные CheckDB, относятся к индексам с ID = 2 и больше, это означет, что были повреждены только некластерные индексы. Поскольку информация, содержащаяся в некластерных индексах, является «избыточной» (те же самые данные хранятся в куче, либо в кластерном индексе — прим. переводчика), эти повреждения могут быть исправлены без потери каких-либо данных.
Если все ошибки, найденные CheckDB, относятся к некластерным индексам, рекомендуемый «уровень восстановления» для DBCC CHECKDB — REPAIR_REBUILD. Примеры таких ошибок (на самом деле ошибок такого типа намного больше):

Msg 8941, Level 16, State 1, Line 1
Table error: Object ID 181575685, index ID 4, page (3:224866). Test (sorted [i].offset >= PAGEHEADSIZE) failed. Slot 159, offset 0x1 is invalid.

Msg 8942, Level 16, State 1, Line 1
Table error: Object ID 181575685, index ID 4, page (3:224866). Test (sorted[i].offset >= max) failed. Slot 0, offset 0x9f overlaps with the prior row.

В этом случае, повреждение может быть полностью исправлено удалением поврежденных некластерных индексов и повторным их созданием. Перестроение индекса (ALTER INDEX REBUILD) в режиме on-line (и иногда в off-line) читает страницы старого индекса для создания нового и, следовательно, завершится с ошибкой. Поэтому, необходимо удалить старые индексы и создать их заново.
Именно это сделает DBCC CHECKDB с параметром REPAIR_REBUILD, но база данных при этом должна быть в однопользовательском режиме. Вот почему обычно лучше вручную выполнить эти операции, чтобы с базой данных можно было продолжать работать, пока индексы будут пересоздаваться.
Если у вас недостаточно времени на то, чтобы пересоздать нужные индексы и в наличии есть «чистый» (не содержащий в себе ошибок) полный бэкап и бэкапы журнала транзакций с неразорванной цепочкой журналов, вы можете восстановить поврежденные страницы из них.

Повреждение LOB-страниц

Msg 8964, Level 16, State 1, Line 1
Table error: Object ID 181575685, index ID 1, partition ID 72057594145669120, alloc unit ID 72057594087800832 (type LOB data). The off-row data node at page (1:2444050), slot 0, text ID 901891555328 is not referenced.

Ошибка говорит о том, что существуют LOB-страницы (Large OBject), на которые не ссылается ни одна страница с данными. Такое может произойти, если ранее был поврежден кластерный индекс (или куча) и его поврежденные страницы были удалены.
Если CheckDB говорит только о таких ошибках, то можно запускать DBCC CHECKDB с параметром REPAIR_ALLOW_DATA_LOSS — эти страницы будут уничтожены. Поскольку у вас все равно нет страниц с данными, которые ссылаются на эти страницы, бОльшей потери данных уже не будет.

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

Msg 2570, Sev 16, State 3, Line 17
Page (1:1103587), slot 24 in object ID 34, index ID 1, partition ID 281474978938880, alloc unit ID 281474978938880 (type «In-row data»). Column «modified» value is out of range for data type «datetime». Update column to a legal value.

Эти ошибки показывают, что в столбце есть значения выходящие за пределы допустимого диапазона. Это может быть значение типа datetime, предполагающее, что с полуночи прошло больше 1440 минут, строка-Unicode, в которой количество байт не делится на 2, или float/real с неверным значением точности.
Проверка на эти ошибки не выполняется по умолчанию, для баз данных обновленных с версии SQL Server 2000 или более ранних, если перед этим ни разу не выполнялась команда DBCC CHECKDB со включенным параметром DATA_PURITY.
CheckDB не сможет исправить эти ошибки, поскольку неизвестно какие значения поставить взамен неправильных. Исправление таких ошибок не требует особых усилий, но выполняется вручную. Неправильные значения должны быть заменены на что-нибудь приемлимое. Основная проблема — это поиск неверных значений. В этой статье базы знаний есть пошаговая инструкция.

Повреждение кластерного индекса или кучи

Если обнаруживается, что повреждены страницы кучи или листового уровня (leaf pages) кластерного индекса — это означает, что данные на них потеряны. Страницы листового уровня кластерного индекса содержат непосредственно страницы данных и для них избыточность никак не обеспечивается.
Если CheckDB сообщает о повреждении страниц листового уровня кластерного индекса, необходимый «уровень восстановления» для DBCC CHECKDB — REPAIR_ALLOW_DATA_LOSS.
Примеры таких ошибок:

Server: Msg 8976, Level 16, State 1, Line 2
Table error: Object ID 181575685, index ID 1, partition ID 76911687695381, alloc unit ID 76911687695381 (type In-row data). Page (1:22417) was not seen in the scan although its parent (1:479) and previous (1:715544) refer to it.

Server: Msg 8939, Level 16, State 1, Line 2
Table error: Object ID 181575685, index ID 0, page (1:168576). Test (m_freeData >= PAGEHEADSIZE && m_freeData <= (UINT)PAGESIZE — m_slotCnt * sizeof (Slot)) failed. Values are 44 and 8028.

Следует помнить, что если ошибки, возвращаемые CheckDB, относятся к index id = 0 или 1, это значит, что повреждены непосредственно данные.
Такой тип ошибок исправляется, но исправление заключается в уничтожении строк или целых страниц. Когда CheckDB удаляет данные для исправления ошибки, ограничения, налагаемые внешними ключами, не проверяются и никакие триггеры не срабатывают. Строки или страницы просто удаляются. В результате данные могут оказаться не согласованными, либо может быть нарушена логическая целостность (на LOB-страницы может больше не ссылаться ни одна строка, либо строки некластерного индекса могут указывать «в никуда»). Из-за таких последствий, подобное восстановление, не рекомендуется использовать.
Если у вас есть «чистый» бэкап, восстановление из него обычно является более предпочительным, для исправления таких ошибок. Если база данных находится в полной модели восстановления и у вас есть бэкапы журнала транзакций с неразорванной цепочкой журналов (начиная с последнего «чистого» полного бэкапа), вы можете сделать бэкап активной части лога и восстановить базу данных целиком (или только поврежденные страницы), в результате чего данные вообще не будут потеряны.
Если бэкапа с неповрежденными данными нет, у вас остается только один вариант — запуск DBCC CHECKDB с параметром REPAIR_ALLOW_DATA_LOSS. Это потребует перевода базы данных в однопользовательский режим на все время выполнения этой процедуры.
И хотя у вас нет возможности избежать потери данных, вы можете посмотреть какие данные будут удалены из кластерного индекса. Для этого, посмотрите этот пост Пола Рэнадала.

Повреждение метаданных

Msg 3853, Level 16, State 1, Line 1
Attribute (object_id=181575685) of row (object_id=181575685,column_id=1) in sys.columns does not have a matching row (object_id=181575685) in sys.objects.

Подобные ошибки, обычно, возникают в базах данных, обновленных с SQL Server 2000, когда кто-то ковырялся напрямую в системных таблицах.
В системных таблицах любой версии SQL Server внешние ключи не используются, поэтому в SQL Server 2000 была возможность удалить строку из sysobjects (например, таблицу) и оставить в таблицах syscolumns и sysindexes строки, ссылающиеся на удаленную строку.
В SQL Server 2000 CheckDB не проверял целостность системного каталога и такие проблемы зачастую висели незамеченными. В SQL Server 2005, CheckDB проверяет целостность системного каталога и такие ошибки могут проявиться.
Исправление этих ошибок дело не самое легкое. CheckDB не может их исправить, поскольку единственное что можно сделать — это удалить записи из системных таблиц, что, в свою очередь, может вызвать потерю большого количества данных. Если у вас есть бэкап этой БД, сделанный до обновления на SQL Server 2005 и обновление было совсем недавно, вы можете развернуть его на SQL Server 2000, на нем вручную подправить системные таблицы и снова перенести БД на SQL Server 2005.
Если у вас нет бэкапа БД на SQL Server 2000 или обновление прошло слишком давно и потеря данных неприемлима, есть два пути. Первый — отредактировать системные таблицы в SQL Server 2005, но следует учитывать, что это довольно сложный и рискованный процесс, поскольку системные таблицы не документированы и гораздо более сложны, чем в ранних версиях. В этом посте можно найти дополнительную информацию.
Второй путь — это заскриптовать все объекты БД и экспортировать все данные, после чего создать новую базу данных, восстановить объекты и залить данные. Этот вариант более предпочтителен.

Неисправимые повреждения

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

Повреждение системных таблиц

Msg 7985, Level 16, State 2, Line 1
System table pre-checks: Object ID 4. Could not read and latch page (1:358) with latch type SH.
Check statement terminated due to unrepairable error.

Msg 8921, Level 16, State 1, Line 1
Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent.

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

Повреждение «карт распределения»

Msg 8946, Level 16, State 12, Line 1
Table error: Allocation page (1:2264640) has invalid PFS_PAGE page header values. Type is 0. Check type, alloc unit ID and page ID on the page.

Msg 8998, Level 16, State 2, Line 1
Page errors on the GAM, SGAM, or PFS pages prevent allocation integrity checks in database ID 13 pages from (1:2264640) to (1:2272727)

В этом случае, одна или несколько страниц определяющих размещение данных в БД (карты распределения — прим. переводчика) повреждены. Эти страницы используются для того чтобы определять какие страницы и экстенты в БД используются, а какие свободны. CheckDB не может исправить такие ошибки, поскольку практически невозможно определить (без этих страниц) какие экстенты используются для размещения данных, а какие нет. Простое удаление такой «карты распределения» невозможно, поскольку удаление любой из них повлечет за собой удаление 4 GB данных.

Поиск помощи

Если вы не уверены в том что вам нужно сделать — обратитесь за помощью. Если вдруг вы получаете сообщение о повреждении БД, которое вам непонятно и которое не описано выше — обратитесь за помощью. Если вы не уверены в том, что выбрали наилучший метод восстановления — обратитесь за помощью.
Если у вас есть Senior DBA, обратитесь к нему. Если у вас есть «наставник» — спросите у него. Спросите совета на форумах, но помните, что не все советы полученные на форумах полезны. На самом деле, именно там время от времени публикуются абсолютно неправильные и даже опасные решения.
Обратитесь в службу поддержки Microsoft, наконец. Это будет небесплатно, но они действительно знают что можно сделать с поврежденной базой данных и вполне вероятно, что если ваша база данных критична для предприятия, то стоимость простоя во время самостоятельного поиска решения будет намного выше чем стоимость обращения в саппорт.

Заключение

В этой статье я дал несколько примеров того, что можно сделать при обнаружении поврежденной БД и, что даже важнее, того, что делать не надо. Надеюсь, что теперь вы лучше понимаете какие методы можно применять для решения описанных проблем и насколько важно иметь хорошие бэкапы (и правильно выбрать модель восстановления — прим. переводчика).

Примечание: это мой первый перевод, который, к тому же делался не за раз, а в несколько подходов, вечерами, когда появлялось свободное время, поэтому текст целиком, возможно, кому-то покажется несколько несогласованым. Если где-то я был излишне косноязычен и какая-то часть текста вдруг окажется трудной для понимания — с радостью выслушаю все замечания.
С уважением, unfilled.
P.S. Когда я уже собрался было нажать на кнопочку «Опубликовать», мне на почту свалилась рассылка от SQL Server Central с вот таким вот комиксом.

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

Автор: Waqas, журналист в сфере информационной безопасности

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

По словам разработчиков, ошибка присутствует в каждой программе. Даже самое лучшее программное обеспечение может иногда давать сбой.

Рисунок1.png

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

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

Рисунок2.png

Существует несколько способов восстановить базу данных после инцидента. Во-первых, следует разобраться с таблицей подозрительных(suspect) страниц. Информация в таблице подозрительных страниц доступна любому пользователю, имеющему доступ к базе данных MSDB. Обновлять базу также может любой пользователь, имеющий разрешение на обновление. Владельцы базы, исправив роль базы данных в MSDB, или сисадмин, исправив роль сервера, могут вставлять, обновлять и удалять записи.

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

Сброс статуса базы данных + DBCC CHECKDB

DBCC CHECKDB

Используйте программное обеспечение Recovery Toolbox for SQL Server

Таблица подозрительных страниц содержит информацию о потенциально поврежденных страницах и используется при принятии решения о восстановлении страниц. Подозрительная страница из таблицы находится в базе данных MSDB.

Страница считается «подозрительной», если при попытке ее чтения ядром СУБД SQL Server обнаруживается одна из следующих ошибок.

  • Ошибка 823: возникает во время проверки циклической контрольной суммы (CRC), запущенной операционной системой, например, ошибка диска (возникает при некоторых аппаратных ошибках)

  • Ошибка 824: например, разрыв страницы (или любая другая логическая ошибка)

Идентификатор каждой «подозрительной» страницы записывается в таблицу подозрительных страниц. В данную таблицу компонент Database Engine записывает все подозрительные страницы, с которыми сталкивается во время обработки, в частности:

  • Когда при обработке запроса необходимо прочитать страницу.

  • При выполнении DBCC CHECKDB.

  • Во время операции резервного копирования.

Во время операции восстановления, исправления DBCC или удаления базы данных таблица подозрительных страниц также обновляется по мере необходимости.

Ниже приведены несколько способов восстановления базы данных, если она перешла в режим “suspected”.

Способ 1.

Во время своей работы я однажды столкнулся с ситуацией, когда рабочая база данных в конце дня перешла в режим “suspected”. Причем в последний раз база была заархивирована много часов назад. К сожалению, вернуться в штатный режим не получилось. DBCC checkdb также отказался запускаться.

Я очень расстроился, пока не нашел решение. Рассмотрим первый способ восстановления базы данных.

Сначала необходимо перевести базу данных в АВАРИЙНЫЙ режим, выполнив следующие действия:

  • EXEC sp_resetstatus ‘yourDBname’;
  • ALTER DATABASE yourDBname SET EMERGENCY

Затем требуется протестировать базу данных:

  • DBCC checkdb (‘yourDBname’)
  • ALTER DATABASE yourDBname SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  • DBCC CheckDB (‘yourDBname’, REPAIR_ALLOW_DATA_LOSS)
  • ALTER DATABASE yourDBname SET MULTI_USER

Способ 2.

Если не получилось восстановить базу первым способом

У вас имеется поврежденная база данных сервера (MS SQL 2005) и она неисправна. Такую базу невозможно восстановить путем тестирования-исправления (возникает ошибка контрольной суммы). В таком случае база данных не выгружается в файл – выдается та же ошибка. Вы попробовали несколько раз, и это не помогло. Попробуйте восстановить базу данных, протестировав сам SQL.

Команды для тестирования SQL приведены ниже:

  • DBCC CHECKDB (‘database’, REPAIR_FAST)
  • DBCC CHECKDB (‘database’, REPAIR_REBUILD)

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

DBCC CHECKDB (‘database’, REPAIR_ALLOW_DATA_LOSS)

Если команда не выполняется из-за не однопользовательского режима, используйте команду:

Alter database db-name set SINGLE_USER

! Перед тестированием обязательно сделайте бэкап!

Способ 3

Используйте программу Recovery Toolbox for SQL Server — важный инструмент в работе любого системного администратора. Программа позволяет работать с файлами MS SQL Server любой версии.

Рисунок3.png

Программа позволяет комплексно восстанавливать файлы базы данных. Особенности программы Recovery Toolbox for SQL Server приведены ниже:

1. Данные из нечитаемых баз данных можно восстановить в приостановленном состоянии (suspended state);

2. Программа работает со всеми версиями Microsoft SQL Server;

3. Программа позволяет восстановить самое важное и ценное в базе данных;

4. В базе данных несколько элементов — тоже не проблема;

5. Восстановливает таблицы при работе с MDF файлами;

6. SQL MDF Recovery экспортирует данные непосредственно в Microsoft SQL Server;

7. Информация сохраняется в том числе в виде скриптов;

8. Извлеченные данные напрямую экспортируются в новую базу данных;

9. Программа работает с любой версией Windows;

10. Мультиязычный интерфейс;

11. Возможен просмотр данных перед восстановлением;

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

Рисунок4.png

Для восстановления данных после сбоя обычно используется резервная копия. Однако, если по какой-то причине копия не была сделана, попробуйте использовать Recovery Toolbox for SQL Server. Скорее всего, вам удастся восстановить рабочее состояние базы данных.

Для этого необходимо выполнить следующие действия:

1. Установите Recovery Toolbox for SQL Server на свой компьютер. Нет необходимости использовать полную версию, достаточно демонстрационной версии;

2. Выберите файл;

3. После выполнения действий начнется анализ базы данных;

4. Изучите список всех восстановленных таблиц;

5. Просматривайте данные в таблицах;

6. Изучайте восстановленные объекты;

7. Настройте параметры сохранения;

8. Выберите необходимые данные;

9. Сохраните их (для этого потребуется полная версия)

Восстановление базы данных

Как видим, для быстрого исправления MDF файла потребовалось нажать всего несколько кнопок. Все восстановленные данные копируются в новую базу данных или в виде скриптов на диск. Таким образом, программа никак не влияет на поврежденные файлы.

Рисунок5.png

Как это работает?

1. Выбираем поврежденную базу данных.

2. Смотрим, какие данные можно восстановить.

3. Определяемся с вариантом экспорта.

4. Выбираем данные для восстановления.

5. Просматриваем отчет после сохранения.

Программа условно-бесплатная, стоит 99 долларов. Скачать программу можно здесь.

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

Восстановление баз данных

Специалисты пользуются несколькими способами восстановления баз данных (БД). Наиболее простой и удобный ­– воспользоваться программой (SSMS) SQL Server Management Studio.

Как восстановить

Узнать, где находится SQL Server Management Studio, довольно легко. Microsoft Windows Server 2012 R2 располагается в стандартном перечне программных продуктов. В Microsoft Windows Server 2008 R2 следует зайти в меню Пуск и отыскать Microsoft Windows Server 2012. Там смотреть Microsoft SQL Server Management Studio.

Далее следует ввести тип сервера с именем, а чтобы подтвердить подлинность – информацию, требуемую для прохождения авторизации. Нажать Соединить (Connect).

В левом углу из обозревателя (Object Explorer) раскрыть Базы данных (Server Objects). Из представленного перечня отобрать базу, подлежащую восстановлению либо ту, данные которой будут восстанавливаться. На выбранном файле кликнуть мышкой и в выпавшем перечне выбрать Задачи (Tasks), затем Восстановить (Restore), потом База данных… (Databases …).

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

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

  1. Переключить соответствующую кнопку на Устройство (From device).
  2. Прописать, откуда восстановится БД.
  3. Выбрать инфобазу, в которую произведется загрузка данных (Destination for restore). Ею может выступать любая БД, которая регистрировалась на SQL Server (в том числе и база, с которой создавалась резервная копия).

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

Если требуется провести копирование БД, то во вкладке Файлы (Files) нужно будет прописать путь к файлам выбранной инфобазы.

Настройка дополнительных параметров

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

  • Которая опубликована не на сервере, где она создавалась, сохранились настройки репликации, поможет отметка «Сохранить параметры репликации). Он важен, если при резервном копировании была реплицирована БД;
  • была проведена перезапись файлов БД с именем, которое указывалось в качестве базы назначения – нужно поставить отметку «Перезаписать существующую базу данных»;
  • сузить доступность к базе всем, кто не sysadmin, db_owner, dbcreator – нужно поставить флажок «Ограничение доступа к восстановленной базе данных»;
  • старту должен предшествовать перевод БД в режим одного пользователя, а по его завершению вернуть в пользование для множества пользователей – поставить отметку «Закрыть существующие соединения»;
  • чтобы провести требуемое резервное копирование завершающего фрагмента журнала транзакций, следует поставить отметку «Создание резервной копии заключительного фрагмента журнала перед восстановлением». Если в окошке Временная шкала резервного копирования (Backup Timeline) для временной точки требуется эта резервная копия, то отметка будет поставлена системой, без возможности снятия;
  • чтобы после завершения восстановления каждой резервной копии уточнялась необходимость продолжения процесса – следует поставить отметку «Выдавать приглашение перед восстановлением каждой резервной копии» (Prompt before restoring each backup). Достаточно полезен, т.к. после того, как восстановлено определенное количество резервных копий можно остановить дальнейшую цепочку восстановительных процессов.

Настроив все важные параметры следует нажать ОК. Тем самым запустится процесс. Соответствующее уведомление сообщит об его окончании.

Восстановление базы в новое место

Чтобы перенести базу данных MSSQL Server по другому пути каталога либо сделать ее копию, следует знать, как восстановить БД в новую папку. Полезно знать как ее переименовывать. Для этого можно воспользоваться вышеупомянутой программой SSMS и T-SQL.

Подготовка к восстановлению базы данных

Перед стартом процесса восстановления нужно соблюдать ряд требований:

  1. Когда осуществляется процесс восстановления базы, доступ к ней может быть только у системного администратора. Для остальных пользователей доступ должен быть ограничен.
  2. Перед восстановлением нужно сделать резервную копию активного журнала транзакций.
  3. Чтобы восстановить зашифрованную базу необходим доступ к сертификату либо ассиметричному ключу, который применялся в качестве ее шифратора. Не имея доступа к ним, восстановление зашифрованной БД становится невозможным. Потому, такой сертификат следует хранить, пока может понадобиться резервное копирование.

После того, как база данных версии SQL Server 2005 (9.x) либо более поздней, восстановится, произойдет автоматическое обновление, и она станет доступной.

Если присутствуют полнотекстовые индексы

В том случае, когда в БД SQL Server 2005 (9.x) присутствуют полнотекстовые индексы, в момент ее обновления произойдет импорт, сброс либо перестроение. Результат зависит от того, какое значение проставлено в свойствах сервера upgrade_option.

При обновлении такие индексы станут недоступны, если upgrade_option имеет значения:

  • 2 в режиме импорта;
  • 0 в режиме перестроения.

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

В том случае, когда выбран процесс Импорт, а доступ к полнотекстовому каталогу отсутствует, то произойдет перестроение одноименных индексов, которые связаны с ним. Для изменения свойств upgrade_option необходимо воспользоваться процедурой sp_fulltext_service.

Соблюдение правил безопасности

Чтобы обезопасить себя, крайне не рекомендуется проводить присоединение либо восстановление БД, которые были получены из ненадежных или вовсе неизвестных источников. Они могут содержать вредоносные коды, способные:

  • запускать выполнение инструкций T-SQL, не предусмотренных системой;
  • вызывать ошибки в результате изменения схемы либо самой структуры БД

Если БД получена из источников, не внушающих доверия, то перед началом ее использования необходимо:

  • протестировать по инструкции DBCC CHECKDB;
  • исследовать исходный и иные коды БД, изучить процедуры.

Инструкции RESTORE

На ход реализации этих инструкций влияет факт существования восстанавливаемой базы. Если база:

  • присутствует, то разрешения получают пользователи sysadmin, dbcreator, dbo (владелец БД) по умолчанию;
  • отсутствует, то пользователям потребуются разрешения CREATE DATABASE.

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

Пошаговая инструкция восстановления БД в новую папку в SSMS

  1. Открыть SSMS и произвести подключение к SQL Server Database Engine.
  2. Щелкнуть мышкой по имени сервера, чтобы развернулось его дерево.
  3. Кликнуть мышкой на Базы данных, потом – по Восстановить базу данных.
  4. В разделе Источник выбрать Общие, чтобы определить соответственное расположение и источник копий, подлежащих восстановлению. Пользователю предлагается выбрать нужный вариант (Базы данных либо Устройства). Особенности:
  5. При выборе Базы данных открывается перечень БД, где можно выбрать нужную. В нем представлены лишь те базы, у которых резервные копии создавались по журналу msdb. Стоит отметить, что для БД на целевом сервере, резервные копии которых поступили с иных серверов, подобный журнал будет отсутствовать. В таких ситуациях следует выбирать вариант Устройство. Это позволит руками прописать файл, а в случае необходимости – обозначить устройство для выполнения восстановления.
  6. Устройство можно выбрать, воспользовавшись кнопкой обзора (…). В результате появится окошко Выбор устройств резервного копирования. Перейти в окошко Тип носителя резервной копии, в котором из списка выбрать необходимый тип устройства. Если требуется добавить ряд устройств, это можно сделать с помощью кнопки Добавить в окошке Носитель резервной копии. Когда все необходимые устройства добавлены, необходимо вновь перейти на страницу Общие. Для этого следует нажать ОК в списке Носитель резервной копии. Обратившись к списку Источник: Устройство: База данных обозначить название БД, куда будет производиться восстановление. Пользователь может воспользоваться данным списком только при выборе Устройства. Можно выбирать лишь те БД, у которых на отобранном устройстве имеются резервные копии.
  7. Название новой базы для проведения восстановления автоматом сформируется в поле База данных в разделе Назначение. При желании оно может быть изменено. Для этого желаемое название вводится в окошке База данных.
  8. Далее перейти к Восстановить до. Пользователь может оставить значение До последней выбранной резервной копии (по умолчанию) либо кликнуть по Временной шкале. При выбре второго варианта всплывет соответствующее окошко Временная шкала …. В нем нужно указывать точное время.
  9. Необходимые резервные копии для восстановления можно выбрать в соответствующей сетке. В ней отражены все наборы, доступные в выбранном месте. Система сама предложит план восстановления отобранных копий, который будет использован по умолчанию. Он может быть переопределен, если в сетке изменить отобранные элементы.
  10. Для указания другого места расположения файлов базы, необходимо выбрать страницу Файлы после чего нажать на Переместить все файлы в папку. Следует указать вновь выбранное место расположения папок файлов данных и журнала.
  11. Если возникла необходимость – провести настройку параметров, как было рассказано выше.

Чтобы начать процесс, в котором будет восстанавливаться БД в новую папку с возможностью переименовывать ее, можно воспользоваться инструкциями Transact-SQL.

Как просмотреть отчет

Стандартный отчет «События резервного копирования и восстановления» позволяет получить сведения о том, когда проводилось:

  • Резервное копирование определенной БД;
  • операции восстановления базы MS SQL из них.

Данный отчет включает данные, касающиеся создания резервных копий:

  • время, затраченное на это в среднем (Average Time Taken For Backup Operations);
  • операции, которые прошли успешно (Successful Backup Operations);
  • ошибки, которые были допущены (Backup Operation Errors);
  • удачно прошедших восстановлений баз (Successful Restore Operations).

Чтобы он начал формироваться, следует в Обозревателе объектов выбрать нужную БД и щелкнуть по ней мышкой. Выбрать в меню Отчеты, а затем – Стандартный отчет. После этого кликнуть на События резервного копирования и восстановления.

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

Для восстановления поврежденной БД можно воспользоваться еще одним инструментом.

Как исправить ошибки в MS SQL с помощью Recovery Toolbox for SQL Server

Для восстановления поврежденной базы данных можно обратиться к помощи Recovery Toolbox for SQL Server. Для исправления ошибки (Error), следует воспользоваться пошаговой инструкцией восстановления данных из файла *.mdf, который был поврежден. Для этого необходимо:

  1. Скачать Recovery Toolbox for SQL Server.
  2. Установить программу следуя инструкциям и запустить ее.
  3. Из списка файлов выбрать файл *.mdf, который был поврежден.
  4. Осуществить предварительный просмотр тех данных, которые в процессе выполнения программы могут быть подвергнуты извлечению из базы MS SQL сервер, которая подверглась повреждению.
  5. Выбрать наиболее приемлемый способ, которым будут экспортироваться данные:
  6. сохранением на диск в качестве SQL-скрипта;
  7. выполнением SQL-скрипта в самой БД.
  8. Произвести выборку информации, требующей восстановления и сохранения.
  9. Начать восстановление нажатием Start recovery.

Данная программа создавалась, чтобы облегчить процесс восстановления поврежденных БД. Специально разработанная, оптимизированная для восстановления SQL Server, утилита поможет устранить ошибки и внести правки в разные типы повреждений *.mdf файлов и базы данных MS SQL Server.

Как становится понятно, для исправления ошибок и восстановления БД необходимо уметь пользоваться различными инструментами. Читайте, изучайте материалы по данной теме. Если возникнут вопросы – обязательно задавайте.

Также приглашаем на специальный курс по MS SQL в Otus.

  • Remove From My Forums

 none

Что значат эти ошибки в базе и как их побороть?

  • Вопрос

  • Всем доброго дня.

    При проверке базы выдается куча ошибок такого типа:

    Объект mod HRESULT: 0x80045510; Error: IDispatch error #21264
    Source:Microsoft SQL-DMO; Description:[SQL-DMO]The name ‘mod’ was not found in the Tables collection.  If the name is a qualified name, use [] to separate various parts of the name, and try again.

    В базе такой таблицы нет. Как это исправить?

    или такая ошибка:

    Объект buAnaliticKard HRESULT: 0x800400cf; Error: Unknown error 0x800400CF
    Source:Microsoft SQL-DMO (ODBC SQLState: 42S22); Description:[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name ‘f_buAnalValues_1889’.
    [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name ‘f_buAnalValues_1890’.
    [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name ‘f_buAnalValues_1891’.
    [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name ‘f_buAnalValues_1892’.
    [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name ‘f_buAnalValues_1893’.
    [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name ‘f_buAnalValues_1894’.

    Таблица есть и колонки есть. Что не нравиться? Не пойму.

    Как это все подправить?

    Всем заранее спасибо за ответы.

Ответы

  • Несколько «быстрых фактов» по вашей проблеме:

    1. Если есть два идентичных по «железу» и «софту» компьютера (боевой и тестовый) то одну и ту же задачу они будут решать строго эквивалентно по любому измеряемому параметру. А если б это было не так, то IT-направление давно б «схлопнулось» как таковое. Мораль:
    прямите ваши тестовые стенды и/или методики тестирования.

    2. Никаких штатных средств по откату на более раннюю версию сервера нет. И не будет.

    3. Любые самопальные средства по решению данной задачи будут именно самопальными. Т.е. «колхоз», говоря по народному.

    4. Разновидность сих колхозов — повторное вбивание уже введенных данных — является далеко не худшей их разновидностью. Хоть и не единственной.

    Краткое резюме по вариантам решения: бэкап/рестор (с/на одну и ту же версию сервера) — лучшее, штатное, гарантированное, полностью автоматизированное решение. Любое иное — колхоз без всяких гарантий.


    www.sqlCMD.ru — all around MS SQL Server

    • Предложено в качестве ответа

      29 апреля 2013 г. 7:47

    • Помечено в качестве ответа
      Иван ПродановMicrosoft contingent staff, Moderator
      30 апреля 2013 г. 8:20

  • Microsoft sql native client ошибка выделения памяти
  • Microsoft setup bootstrapper office 2016 ошибка
  • Microsoft setup bootstrapper office 2013 ошибка
  • Microsoft security essentials не обновляется ошибка подключения
  • Microsoft security essentials код ошибки 0x800106ba