2009. 1. 29. 14:52
MSSQL Database 분리 Work/SQL Server2009. 1. 29. 14:52
간단하게 database를 복사하거나 backup, 이동하고 싶은 경우 아래의 system stored procedure를 사용하여 작업을 하게된다.
exec sp_detach_db [database name] -- database 분리
-- file 이동
exec sp_attach_db [database name], [mdf file name (full path)], [ldf file name (full path)] -- database 연결
간혹 사고로 ldf를 유실했을 경우...혹은 뜻하지 않게 mdf만 존재하는 경우는 아래처럼 작업하면 된다.
exec sp_attach_single_file_db [database name], [mdf file name (full path)]
하지만, 위의 stored procedure를 사용할 수 있는 조건이 까다롭다.
1. Data file과 log file이 한 개만 있는 database일 것.
2. 복제된 database는 안된다.
3. 다음 version의 MSSQL에서 사라질지도 모른다.
위의 stored procedure로 해결이 안될 경우 아래 처럼 CREATE DATABASE 의 FOR ATTACH_REBUILD_LOG 를 사용하여 작업한다.
CREATE DATABASE [database name]
ON (NAME='[database name]', FILENAME='[[mdf file name (full path)]]') FOR ATTACH_REBUILD_LOG
그래도 복구가 안되는 경우는 다음의 절차로 작업한다.
1. 동일한 database name으로 DB를 생성.
2. MSSQL Server 중지 후 mdf file을 덮어 쓰기.
3. MSSQL SQL 시작.
4. system catalog변경을 위해서 allow update 수정.
use master
GO
sp_configure 'allow update', 1
reconfigure with override
GO
5. 해당 database를 Emergency Mode(응급복구모드)로 변경.
ALTER DATABASE [database name] SET EMERGENCY
6. SQL 서비스 다시 시작.
7. log 다시 생성.
ALTER DATABASE dbname REBUILD LOG ON (NAME='[log name]', FILENAME='[ldf file name (full path)]')
8. 일반모드 변경 후 system catalog 원상복귀.
ALTER DATABASE [database name] SET ONLINE
GO
use master
GO
sp_configure 'allow update', 0
reconfigure with override
GO
그래도 복구를 할 수 없다면... 미안하다고 하고 자리를 피한다.