Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

MS SQL 7.0: Restore database.

div.main {margin-left: 20pt; margin-right: 20pt}

А. Шкондин.
artvs@clubpro.spb.ru
MS SQL 7.0: Restore database. Восстановление базы данных с использованием WITH MOVE

Очень часто приходится отвечать на вопрос "как восстановить базу данных в MS SQL 7.0" c уточнением, что при попытке выполнения комманды RESTORE DATABASE сервер ругается так:

Server: Msg 3156, Level 16, State 1
The file 'g:MSSQL7datamydb_data.mdf' cannot be used by RESTORE. Consider using the WITH MOVE option to identify a valid location for the file.

или так

Server: Msg 3158, Level 16, State 1
Could not create one or more files. Consider using the WITH MOVE option to identify valid locations.

Чтобы сэкономить время на написание писем, приведу решение.

Собственно на решение прозрачно намекают в обоих сообщениях об ошибке. Возможная причина возникновения ошибки - backup (dump) достался по наследству, и имя_файла_в_операционной_системе сохранённое в заголовке бэкапа не может быть использовано. Например, если на сервере, на котором производился бэкап, файлы данных и логов были размещены на диске G:, а на сервере, на котором производится восстановление БД такого диска нет и в помине.

В приведённом ниже примере проводится восстановление БД myDB, файлы которой до бэкапа размещались на диске G:, а после восстановления будут перемещены на диск D:.

Для начала надо выяснить логические имена файлов данных и логов. Если мучительно вспоминать их неохота, выполняем следующий запрос: use master go RESTORE FILELISTONLY FROM DISK = "D:dumpsmyDB20011003.bak"

в полученном резалтсете нас особенно интересует первая колонка: LogicalName PhysicalName Type FileGroupName Size MaxSize ----------- ---------------------------- ---- ------------- -------- -------------- myDB_Data g:MSSQL7datamydb_data.mdf D PRIMARY 4653056 35184372080640 myDB_Log g:MSSQL7datamydb_log.ldf L NULL 22675456 35184372080640 (2 row(s) affected)

впрочем, если администратор БД, доставшейся по наследству, не использовал говорящих логических и физических имён для файлов данных и логов, нам пригодится третья колонка. D - файлы данных, L - файлы логов.

Теперь используем эти имена для восстановления БД с использованием опции MOVE: use master go RESTORE DATABASE [myDB] FROM DISK = "D:dumpsmyDB20011003.bak" WITH MOVE 'myDB_data' TO 'd:MSSQL7datamydb_data.mdf', MOVE 'myDB_log' TO 'd:MSSQL7datamydb_log.ldf'

Как видим, если знаешь что делать, ничего сложного нет :) Восстановление логинов пользователей базы данных.

При выполнении команды RESTORE базы данных процесс восстановления данных и логов не может считаться заершённым, если не были восстановлены логины пользователей БД. Если операции backup/restore проводились на разных серверах, то связи пользователей БД с их логинами будут разорваны, и их нужно исправить. Для тех кто не хочет это делать при помощи Enterprise Manager, приведу простенький скрипт.

Сначала определим пользователей ущемлённых в их правах: use myDB go sp_change_users_login "Report"

и в этом резалтсете нас будет интересовать первая колонка: UserName UserSID -------- ----------------------------------- dummy 0x15DE8ABCD84DD511A262204C4F4F5020

Если резалтсет пустой, то администратор может считать процесс восстановления завершённым, если нет, то для каждой строки резалтсета (или для каждого ущемлённого пользователя, что одно и тоже) необходимо выполнить скрипт аналогичный следующему: use myDB go exec sp_change_users_login "Auto_Fix", 'dummy'

И это ещё не всё. Если хранимая процедура sp_change_users_login не нашла соответствия старому логину, она создаст новый с пустым паролем (что в общем-то логично), поэтому

Проверяем логин для пользователя dummy use myDB go exec sp_helpuser "dummy"

в резалтсете смотрим в третью колонку UserName GroupName LoginName DefDBName UserID SUserID --------- ---------- ------------- --------- ------ ------- dummy dummies dummy_forewer myDB 6 9

если логин новый, то меняем для него пароль: use master go exec sp_password @new ="new password for dummy", @loginame = "dummy_forewer"

Повторяем операцию для каждого нового логина, и после этого идём спокойно пить пиво.

P.S: я не претендовал на полноту описания процесса восстановления базы данных и рассмотрел только две наиболее часто встречающиеся проблемы. Поэтому если если к вашей ситуации решение не подходит, то почитайте в Books Online раздел RESTRORE DATABASE, и если не поможет, то задайте вопрос на нашем форуме. Отвечать же на каждое приходящее письмо с вопросами я просто физически не успеваю - мне хватает переписки с сослуживцами :)


  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте