В критических ситуациях, база данных может быть представлена Вам, как SUSPECT, из-за завершения неудачей её восстановления во время старта сервера, причём обычно, это препятствует любому доступу клиентов к данным. Однако, существует возможность ручного вывода базы данных из состояния SUSPECT в "bypass mode" (также называемого "emergency mode") и последующего исполнения команды SELECT или запуска программы Bulk Copy (BCP), позволяющих осуществить копирование данных в другое место, в целях их сохранения.
В то время, когда никто не сможет выполнять никаких легитимных модификаций данных, с помощью этой уловки, можно выполнить DUMP TRANSACTION WITH NO_LOG. Обратите внимание, что использование этой уловки не поддерживается Микрософт, и является потенциально опасной операцией. По этим же причинам, если восстановление базы при запуске будет осуществляться слишком долгое время, Вы не должны прерывать этот процесс, переводить базу данных в bypass mode, и затем выполнять DUMP TRANSACTION WITH NO_LOG. Все операции сервера, исполняемые в рамках DUMP TRANSACTION, обычно регистрируются в журнале, так, что эти операции можно восстановить или отменить. Однако, эти операции, порождённые непосредственно командой DUMP, также занимают место в transaction log. Если transaction log переполнен, и места недостаточно для нормальной работы сервера, а также для регистрации операций DUMP TRANSACTION, использование опции WITH NO_LOG может предоставить Вам возможность произвести усечение transaction log без регистрации каких - либо операций в журнале. DUMP TRANSACTION WITH NO_LOG правильно сохраняет транзакции только при относительно нормальных условиях работы сервера. Сервер сам предпринимает определённые меры для гарантии успешности восстановления, даже если на сервере произойдёт сбой во время этой операции. В редких случаях автоматическое восстановление (также называемое, восстановление при запуске - startup recovery) может закончится неудачей, после чего база данных будет отмечена, как SUSPECT. Восстановление закончится неудачей по определенной причине. Очень важно обратить внимание на сообщение в errorlog, которое отражает причину завершения неудачей восстановления, потому что это может помочь локализовать проблему. Восстановление, это процесс поиска и исправления противоречий в базе данных, который восстанавливает или отменяет все транзакции, которые были или активны или завершены после времени исполнения последней контрольной точки. Этот процесс основывается на write-ahead (опережающей записи) природе transaction log (все измененные страниц записываются вначале в журнал регистрации транзакций, и только потом в базу данных). Восстановление состоит из чтения каждой записи журнала, сравнения её timestamp с timestamp соответствующей страницы базы данных, и последующего принятия или отмены этого изменения. Отмена происходит в случае не исполненной транзакции, а восстановление внесённого изменения в случае исполненной транзакции. После обнаружения в errorlog нужного сообщения, которое относится к ошибке, повлекшей неудачу процесса восстановления, попробуйте перевести состояние базы данных в нормальное NORMAL, с помощью простого перезапуска SQL сервера. Это позволит Вам попробовать выполнить процедуру восстановления второй раз. Вы можете изменить состояние базы данных посредством хранимой процедуры sp_resetstatus. Эта дополнительная хранимая процедура, которую Вы можете установить, воспользовавшись сценарием Instsupl.sql в каталоге Mssql\Install. Для получения дополнительной информации, см. "Resetting the Suspect Status" в документации. Если восстановление все равно терпит неудачу, обратите внимание на сообщение об ошибках, и войдите в контакт с вашей службой поддержки. Вы должны также убедится в наличии и работоспособности вашей последней резервной копии базы данных, потому что она может понадобится для восстановления работоспособности базы. Однако, многие данные в вашей базе могут быть все еще доступны, хотя их целостность нарушена. Вы можете обращаться к этим данным, установив предварительно состояние базы данных в bypass или emergency mode. Для этого установите для базы данных sysdatabases.status в значение: -32768, которое будет применено после выполнения команды "allow updates". Например, используйте следующую команду: UPDATE SYSDATABASES SET STATUS=-32768 WHERE NAME='DBNAME' После исполнения этой инструкции, база данных может быть доступна и станет возможно получить данные с помощью SELECT или BCP. Вы можете сталкиваться с ошибками при выполнении SELECT или BCP, но в большинстве случаев, часть данных удаётся спасти. |