-- Version : SQL Server 2000
--== პრობლემა == -----------------------------------------------------------
-- სერვერის HD დისკი, რომელზეც მოთავსებული იყო transaction log
-- ფაილი მწყობრიდან გამოვიდა და მონაცემთა ბაზა გადავიდა suspect რეჟიმში.
-- ამ დროს ხშირ შემთხვევებში ბაზის detach-ის შესრულება შესაძლებელია EM-იდან,
-- თუმცა არ ხერხდება მისი ხელახლა attach-ი (attach_single_file_db - პროცესი)
-- და მხოლოდ ბაზის მიერთება log-ის გარეშე აბრუნებს შეცდომას.
-- შეცდომის შეტყობინება შემდეგი სახისაა :
ქუოტა (Quote):/*
Server: Msg 945, Level 14, State 2, Line 1
Database '<db_name>' cannot be opened because some of the files could not be activated.
Server: Msg 1813, Level 16, State 2, Line 1
Could not open new database '<db_name>'. CREATE DATABASE is aborted.
*/
BB კოდი:
--== პრობლემის გადაწყვეტა == -----------------------------------------------------------
-- ყურადღება ! ეს მეთოდი მუსაობს მხოლოდ SQL2000-ისათვის (გარკვეულ შემთხვევებში ის იმუშავებს SQL2005, SQL2008 -ისთვისაც)
-- 1. შევქმნათ ახალი მონაცემთა ბაზა იგივე სახელითა და მდებარეობის იგივე სახელის მისამართით, როგორიც იყო ძველი .mdf და .ldf ფაილები
-- 2. გამოვრთოთ სერვერი (STOP) და გამოვცვალოთ .mdf ფაილი
-- 3. დავსტარტოთ სერვერი. (ნუ მიაქცევთ ყურადრებას ბაზის status მნიშვნელობას)
-- 4. QA-დან შეასრულეთ შემდეგი ბრძანება
Use master
go
sp_configure 'allow updates', 1
reconfigure with override
go
--4. დავიზღვიოთ თავი და შევინახოთ ბაზის status მნიშვნელობა, რაც დაგვჭირდება იმ შემთხვევაში თუ
-- rebuilt ოპერაცია დამთავრდება წარუმატებლად.
select status from sysdatabases where name = '<db_name>'
--5. აქვე QA-დან შეასრულეთ შემდეგი ბრძანება
update sysdatabases set status= 32768 where name = '<db_name>'
--6. გადავტვირთოს SQL Server
--7. ბაზა გამოჩნდება emergency სტატუსში
--8. QA-დან შეასრულეთ ბრძანება
DBCC REBUILD_LOG('<db_name>', '<.ldf ფაილის სახელი მისი სრული მისამართითურთ>')
--9. თუ SQL Server-მა დააბრუნა პასუხი: 'Warning: The log for database '<db_name>' has been rebuilt.'
-- ე.ი. ყველაფერი რიგზეა და აქვე შევასრულოთ ბრძანება
Use master
go
sp_dboption '<db_name>', 'single user', 'true'
go
USE <db_name>
GO
DBCC CHECKDB('<db_name>', REPAIR_ALLOW_DATA_LOSS)
go
-- 9a. თუ მე-9 პუნქტის პირველი ბრძანებით, ვერ შეძელით ბაზის გადართვა single user სტატუსში,
-- მაშინ მონაცემთა მთლიანობის კონტროლის მიზნით შეგიძლიათ სცადოთ 'dbo only mode'
sp_dboption '<db_name>', 'dbo use only', 'true'
-- 10. თუ ყველაფერი რიგზეა, მაშინ შეასრულეთ:
sp_dboption '<db_name>', 'single user', 'false'
go
Use master
go
sp_configure 'allow updates', 0
go