본문 바로가기

MSSQL/SQL Server 2005 new Feature

데이터베이스의 분리 및 이동, 연결

일반적으로 SQL Server에서 데이터베이스를 생성할 경우 적어도 하나 이상의 데이터와 로그 정보를 가진
파일이 생성된다. 또한 사용자에 따라 명명된 데이터를 지정하여 저장하는 파일 그룹을 갖게 된다.

이중 데이터 정보를 갖게되는 파일을 Primary Data Files이라 부르며 이는 DB의 시작 지점과 나머지 파일의
정보를 가리키며 일반적으로 확장자는 .mdf 이다.
로그 정보를 갖는 파일은 Log Data Files라 부르며 이는 DB의 모든 트랜잭션에 대해 기록되며  해당 DB를
복구할때 사용되는 정보를 갖게 된다. 일반적인 확장자는 .ldf 이다.
파일 그룹의 경우 Secondary Data Files이라 부르며 이는 Primary Data Files에 기록되지 않는 데이터에
대한 명명된 데이터로 파일을 구성할수 있으며 사용자의 정의 따라 없을수도, 여러개가 존재 할 수도 있다.
일반적으로 확장자는 .ndf 이다.

위의 파일들의 위치는 해당 Primary Data File과 Master DB에 기록된다. 그러므로 데이터 베이스 사용중
발생하는 Database 복사 및 이동(위치변경)을 해야 하는 경우와 간단하게 .mdf파일을 이용하여 복원을
해야 하는 경우는 Primary Data및 Master DB의 정보를 변경해야 한다. 이를 간단하게 작업하기 위해
우리는 System Stored Procedure를 사용하여 작업을 하게 된다.

1. sp_detach_db
서버에서 데이터베이스를 분리할때 사용하는 시스템 저장 프로시져 이다. 분리하기 전에 선택적으로
모든 테이블에 UPDATE STATISTICS를 실행 한다.

예) exec sp_detach_db @dbName =  'dbname', @skipchecks = 'true', @KeepFulltextIndexFile='true'

@skipchecks은 UPDATE STATISTICS에 대한 실행 여부를 명시적으로 정하는 옵션으로 기본값은 true
이며 이경우 실행을 건너뛰게 된다.
@KeepFulltextIndexFile는 SQL Serve 2000에는 없던 기능으로 분리되는 데이터베이스와 연관된
전체 텍스트 인덱스 파일이 분리되는 동안 삭제 하지 않도록 지정하는 것이며 기본값은 true이다.

2. sp_attach_db
서버에 데이터베이스를 연결 하는데 사용하는 시스템 저장 프로시져 이다. 최대 16개 파일을 지정할수 있다.

예) exec sp_attach_db @dbname = 'dbname',
                                 @filename1 = 'mdf file name Full Path', @filename2 = 'ldf File Name Full Path' 

3. sp_attach_single_file_db
데이터 파일이 한개만 있는 데이터 베이스를 연결 하는 시스템 프로시져이다. 간혹 서버의 장애발생으로
인해 ldf파일을 유실했을 경우 혹은 뜻하지 않게 mdf파일만이 존재할경우에 위의 시스템 프로시져를
이용하여 데이터 베이스를 연결한다.

예) exec sp_attach_single_file_db @dbname = 'dbname', @physname='mdf file Full Parh'

위의 2,3번의 시스템 저장 프로시져를 이용하기 위해서는 몇가지 제약이 있다.
첫째, Primary Data Files와 Log Data File이 각 한개만 존재 할 경우.
둘째, 복제된 데이터 베이스가 아닐경우
셋째, 다음 버젼의 SQL Server에서는 사용을 할 수 없다.

이러한 제약조건이 존재 하므로 SQL Server 2005버젼에서는 CREATE DATABASE 구문에 FOR ATTACH,
FOR ATTACH_REBUILD_LOG옵션이 주어진다. 이는 기존 운영체제 파일 집합을 연결하여 데이터베이스를
만들도록 지정한다.


4. FOR ATTACH
sp_attach_db와 같은 개념으로 이해하면 될 것이다. 다만 SQL Server 2005 버젼부터 사용할 수 있는
구문으로 CREATE DATABASE구문과 함께 사용한다. 또한 기존 sp_attach_db처럼 명시하고자 하는
파일의 숫자와 상관없이 사용 할 수 있다.

예) CREATE DATABASE [dbname] ON  PRIMARY
     ( NAME = 'dbname' , FILENAME = 'mdf Full Path')
     LOG ON
     ( NAME = 'dbname_log', FILENAME = 'ldf Full Path')
     FOR ATTACH

5. ATTACH_REBUILD_LOG

mdf파일만이 존재할경우 또는 ldf파일을 초기화 해야 하는경우 CREATE DATABASE구문과 함께 사용한다.

예) CREATE DATABASE [dbname] ON PRIMARY
      ( NAME = 'dbname', FILENAME = 'mdf Full Path') FOR ATTACH_REBUILD_LOG

이 경우 기존 Primary Data Files에 기록된 로그파일명과 같은 이름의 새로운 로그 파일이 생성된다.
주의할점은 생성되는 로그파일의 경로에 동일한 이름의 로그파일이 존재하면 안된다.
(머 당연한 소리겠지만 ;;) 또한 이 구문을 통해 로그를 재생성하는 경우는 2가지의 전제조건이 존재한다.
첫째, 명시된 모든 Primary Data Files과 Secondary Data Files에 문제가 없어야 한다.
둘째, 복구될 파일은 이전 SQL Server의 서비스가 정상 종료 되었어야 한다.

결국은 실행전 꼭 정상적으로 데이터베이스를 detach 하라는 말이다.

'MSSQL > SQL Server 2005 new Feature' 카테고리의 다른 글

Database File Initialization  (2) 2009.12.10
동적 AWE 메모리 관리  (4) 2009.12.10
Sql Server CLR Integration  (0) 2009.12.01
향상된 top N 고찰  (0) 2009.11.26
Cascading Referential Integrity Constraint  (0) 2009.11.26