SQL Server 데이터베이스 파일을 어떻게 이동합니까?


103

데이터베이스가 있고 .mdf.ldf파일을 다른 위치 로 옮기고 싶습니다 . 그러나 MSSQLSERVER서비스 를 중지하고 싶지 않으며 다른 서버로 내보내고 싶지 않습니다.

어떻게해야합니까?

답변:


154

데이터베이스 파일을 이동하기 위해 SQL Server 서비스를 중지 할 필요는 없지만 특정 데이터베이스를 오프라인으로 만들어야합니다. 파일에 액세스하는 동안 파일을 이동할 수없고 데이터베이스를 오프라인으로 만들면 파일이 SQL Server 응용 프로그램에서 사용되지 않습니다.

그것들을 옮기는 과정은 매우 간단합니다. 분리 / 부착은 이미 설명되었지만 거의이 복잡한 것은 아닙니다.

다음 ALTER DATABASE명령으로 파일 위치를 변경하십시오 .

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

이 명령에서 이전 위치를 선언 할 필요는 없습니다. 이 경로를 변경해도 즉시 적용되지는 않지만 다음에 데이터베이스를 시작할 때 사용됩니다.

데이터베이스를 오프라인으로 설정

(저는 WITH ROLLBACK IMMEDIATE모든 사람을 쫓아 내고 현재 열려있는 모든 거래를 롤백하는 데 사용합니다)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

파일을 새 위치로 이동 / 복사

선호하는 방법을 사용하여 파일을 복사하십시오 (클릭 앤 드래그, XCopy, 복사 항목, Robocopy)

데이터베이스를 온라인 상태로 만듭니다

ALTER DATABASE foo SET ONLINE;

자세한 내용은 여기 를 참조 하십시오 .


13
이것은 나를 위해 일했습니다. 제 경우에는 첫 번째 명령을 사용하여 LDF 파일도 이동해야했습니다. 예 : USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
Dewi Rees

1
파일 대화 상자에 표시되는 것과 일치하도록 파일 이름을 업데이트하여 전체 텍스트 색인 파일을 이동하는 데 사용할 수도 있습니다.
DShook

24
데이터베이스 파일을 이동 한 후 "NT SERVICE \ MSSQLSERVER"사용자에게 권한이 있는지 확인하십시오. 그렇지 않으면 데이터베이스를 다시 온라인 상태로 만들 때 오류가 발생합니다.
Demonslay335

"이름"은 무엇입니까? 문서에는 "logical_name"이 있습니다. 그들은 무엇을 의미합니까?
johnny

2
@mlhDev 사실 제 경우에는 MODIFY FILE순서가 변합니다 . MODIFY FILE을 먼저 실행하면 명령이 성공적으로 실행되고 오프라인-온라인 작업 후 위치가 변경된다는 메시지가 표시됩니다 (단어가 다르지만 아이디어를 얻음). 그러나 오프라인-> 파일 이동-> 온라인 순서는 명백한 이유로 중요합니다. 또한 Demonslay335의 메모를 표시하십시오. 파일 권한이 중요합니다.
Lionet Chen 2018 년

50

MDF 및 LDF 파일은 보호되며 데이터베이스가 온라인 인 동안에는 이동할 수 없습니다.

데이터베이스 작동을 중지하지 않으면 DETACH파일을 이동 한 다음 이동할 수 있습니다 ATTACH.

  • 데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하십시오
  • 고르다 Properties
  • Files탭으로 이동
  • 의 메모 확인 PathFileNameMDF와 LDF 파일을 . 이 단계는 누락 된 파일을 검색하지 않으려는 경우에 중요합니다 ...
  • 데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하십시오
  • 고르다 Tasks -> Detach
  • 원하는 곳으로 파일을 이동
  • Databases서버 의 노드를 마우스 오른쪽 버튼으로 클릭하십시오
  • 고르다 Attach
  • Add버튼을 클릭하십시오
  • 새로운 위치를 가리 킵니다
  • 딸깍 하는 소리 OK

당신은 지금 괜찮을 것입니다. [정보] 정보 DETACH- ATTACH프로세스를 찾을 수 있습니다 여기에 .

링크 DETACH- 데이터베이스를 동일한 SQL Server 인스턴스에 유지하는 경우 ATTACHusing ALTER DATABASE문을 권장 합니다. 더 많은 참조 이동 사용자 데이터베이스 .

이동하는 동안 계속 실행하려면 BACKUP- 를 수행하십시오 RESTORE. 복원 프로세스에서 데이터베이스 파일의 새 위치를 정의 할 수 있습니다.


3
다시 연결할 때 파일 액세스 문제를 피하기 위해 관리자로 SQL Management Studio를 여는 것이 좋습니다
Simon_Weaver

6

시스템 데이터베이스 파일을 이동하려면 다음 단계를 수행하십시오.

  1. SSMS에서 sa 사용자로 로그인

  2. 안전을 위해 사용자가 만든 데이터베이스를 백업하십시오.

  3. SSMS에서 서버에 연결된 모든 세션을 종료하십시오.

  4. 다음 명령을 실행하여 시스템 데이터베이스의 현재 파일 위치를 확인하십시오.

    USE master;
    SELECT * FROM sys.master_files;

경로를 식별하고 파일의 현재 경로를 기록하십시오.

  1. master를 제외한 모든 데이터베이스의 파일 경로를 변경하려면 TSQL을 사용하십시오.

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

예 :

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

이제 파일 위치가 변경되었습니다.

ldf 및 mdf 파일을 모두 이동해야합니다

  1. SSMS에서 서버를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다. 내부 속성은 데이터베이스 설정으로 이동하십시오. 데이터 및 로그의 데이터베이스 기본 위치를 대상 경로로 변경하십시오. 서버에서 로그 오프하십시오.

    예 : 변화 C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\E:\projects\DataBaseFiles\MSSQL\DATA\

  2. SQL Server 인스턴스를 중지하십시오.

  3. 파일을 새 위치로 복사하십시오. 액세스 권한을 대상 폴더에 복사하려면 Robocopy를 사용하여 파일을 이동하십시오. cmd를 열고 관리자 권한으로 실행 한 후 다음 명령을 사용하십시오.

    robocopy / sec 소스 폴더 대상 폴더

명령을 실행하려면 소스 위치로 이동하는 것이 좋습니다. 복사 된 시스템 데이터베이스 파일 이외의 다른 파일을 삭제하십시오. 예 :

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(여기서 모든 시스템 데이터베이스 파일을 새 위치로 옮깁니다.)

  1. 시작 메뉴에서 모든 프로그램, Microsoft SQL Server, 구성 도구를 차례로 가리킨 다음 SQL Server 구성 관리자를 클릭하십시오.

SQL Server 구성 관리자에서 다음 단계를 수행하십시오.

SQL Server 서비스 노드에서 SQL Server 인스턴스 (예 : SQL Server (MSSQLSERVER))를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. SQL Server (instance_name) 속성 대화 상자에서 시작 매개 변수 탭을 클릭합니다. 기존 매개 변수 상자에서 –d 매개 변수를 선택하여 마스터 데이터 파일을 이동하십시오. 업데이트를 클릭하여 변경 사항을 저장하십시오. 시작 매개 변수 지정 상자에서 매개 변수를 마스터 데이터베이스의 새 경로로 변경하십시오. 기존 매개 변수 상자에서 –l 매개 변수를 선택하여 마스터 로그 파일을 이동하십시오. 업데이트를 클릭하여 변경 사항을 저장하십시오. 시작 매개 변수 지정 상자에서 매개 변수를 마스터 데이터베이스의 새 경로로 변경하십시오.

데이터 파일의 매개 변수 값은 -d 매개 변수 뒤에 와야하고 로그 파일의 값은 -l 매개 변수 뒤에 와야합니다. 다음 예는 마스터 데이터 파일의 기본 위치에 대한 매개 변수 값을 보여줍니다.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

마스터 데이터 파일의 계획 재배치가 E : \ SQLData 인 경우 매개 변수 값은 다음과 같이 변경됩니다.

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

인스턴스 이름을 마우스 오른쪽 단추로 클릭하고 중지를 선택하여 SQL Server 인스턴스를 중지하십시오. SQL Server 인스턴스를 다시 시작하십시오.

  1. saSSMS에 사용자로 로그인 하고 다음 쿼리를 실행하여 데이터베이스 파일의 위치를 ​​확인하십시오.

    USE master;
    SELECT * FROM sys.master_files;

다 했어요


당신은 모든 데이터베이스 작업을 자동화 할 수있는 SQL 기능을 사용할 수 있습니다 stackoverflow.com/a/19505918/439524을
amuliar

3

단계별로 수행하십시오.

  1. 모든 연결을 닫습니다.
    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

  2. 오프라인 상태의 데이터베이스 설정
    ALTER DATABASE MyDB SET OFFLINE

  3. 새 경로에
    ALTER DATABASE MyDB 수정 파일 (Name = MyDB, Filename = 'N : \ DATA \ MyDB.MDF')

  4. 온라인 상태의 데이터베이스 설정
    ALTER DATABASE MyDB SET ONLINE

  5. 다중 사용자
    ALTER DATABASE MyDB SET MULTI_USER 설정


3

데이터베이스를 오프라인으로 만들지 않고 데이터베이스 데이터 파일을 이동할 수있는 방법이 있습니다 (아직 로그 파일에 대한 방법이 있는지 확실하지 않은 경우).

Dejan Nakarada-Kordic 에는이 방법에 대한 설명 + 스크립트가 있습니다. https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

짧은 버전은 새 위치에 다른 데이터베이스 파일을 추가 한 다음 EMPTYFILE 옵션과 함께 DBCC Shrinkfile을 사용하여 이전 파일에서 새 파일로 데이터를 이동하는 것입니다. 완료되면 이전 데이터 파일을 제거 할 수 있습니다.

내 솔루션이 아니라이 솔루션을 직접 찾고 있었고 프로덕션 환경에 매우 유용하다는 것을 알았습니다.

토르 핀


1

다음과 같은 간단한 4 단계를 수행하십시오.

  1. SSMS를 열고 창 상단 에서 새 쿼리 옵션을 선택하십시오 . 그런 다음 새 경로로 이동하려는 데이터베이스의 경로를 찾기 위해 다음 쿼리를 복사하고 실행하고 CurrentLocation열에 표시되는 경로를 기록하십시오 .

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. 이제 해당 경로로 이동하여 Database_Name.mdfDatabase_Name_log.ldf 파일 의 이름을 확인 하십시오. 그런 다음 데이터베이스를 특정 위치로 이동하려면 다음 두 쿼리를 실행하십시오.

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. 이제 객체 탐색기 (왼쪽)에서 볼 수있는 마우스 오른쪽 버튼을 클릭하여 서버 중지Server_Name

    여기에 이미지 설명을 입력하십시오

  2. 그런 다음 이동 에서 두 파일 올드 경로새 경로 와 서버 _ 이름을 마우스 오른쪽 버튼으로 클릭하여 서버를 다시 시작합니다. 1 단계 쿼리를 다시 실행하여 데이터베이스의 새 경로를 확인하십시오.


0

이것이 최선의 방법인지 확신 할 수는 없지만 (어떻게 의견을 말하지 않겠습니까?) 매우 간단합니다 (작은 데이터베이스가있는 경우 빠름).

먼저 데이터베이스를 .bak 파일로 백업하십시오. 그런 다음 복원 작업에 대한 파일 옵션에서 새 .mdf 및 .ldf 파일 위치를 선택하여 동일한 .bak 파일에서 데이터베이스를 복원하십시오.

복원하는 동안 데이터베이스에 액세스 할 수 없으므로 유지 관리 기간의 프로덕션 환경에서이 작업을 수행하지 않습니다. 위에서 본 다른 방법에는 비슷한 단점이 있습니다. 복원 작업이 완료되면 이전 파일을 삭제할 필요가 없습니다. 자동으로 완료됩니다.


1
이 시나리오에는 몇 가지 단점이 있습니다. 복원 할 때 원본 DB를 덮어 쓰거나 이름을 바꿔야합니다. 큰 데이터베이스의 경우이 방법은 심각한 IO 오버 헤드를 유발합니다. detach-attach 또는 alter db 방법에 설명 된대로 파일을 이동 하는 것이 훨씬 빠릅니다. 파일이 동일한 NTFS 파티션 내에서 이동되면 메타 데이터 작업 일뿐입니다.
vonPryz

@Ali-백업 및 복원. 더 오래 걸릴 수 있지만 일반적으로 더 안전한 경로입니다. 다음 사이트 에서 Aaron Bertrand의 분석을 참조하십시오. blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups 또한 : sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF

매우 큰 데이터베이스의 경우이 접근 방식 (및 분리 / 연결 접근 방식)은 상당한 다운 타임을 유발합니다. 이를 피하려면 소스 데이터베이스를 전체 복구 모드로 둔 다음 대상 DB가 작동하지 않는 상태에서 초기 백업 복원을 수행하십시오. 그런 다음 하나 이상의 트랜잭션 로그를 백업 / 복원합니다. 트랜잭션 로그를 최종 백업 / 복원하는 동안에 만 데이터베이스를 종료해야하며 여기에는 시간과 크기가 임의로 포함될 수 있습니다. 분명히 다른 이름으로 복원 한 다음 이름 교환을 수행해야합니다. 이 방법은 로그 전달과 거의 동일합니다.
Brian

0

기존 답변을 보완하려면 다음 ALTER DATABASE ... MOVE ...은 모든 데이터베이스에 대한 명령문 을 작성하는 스크립트입니다 .

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

노트 :

  • REPLACE(f.physical_name, 'C:\', 'D:\')파일 경로를 변경하려는 것으로 대체하십시오 .

  • master경로는 SQL Server의 시작 옵션에 의해 결정되므로 제외됩니다 (자세한 내용은 이 답변 참조).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.