컨텍스트
맨 아래에 데이터베이스가 큰 시스템을 개발 중입니다. SQL Server 2008 R2에서 실행되는 MS SQL 데이터베이스입니다. 데이터베이스의 총 크기는 약 12GB입니다.
이 중 약 8.5GB가 단일 테이블에 BinaryContent
있습니다. 이름에서 알 수 있듯이 이것은 간단한 파일을 테이블에 BLOB으로 직접 저장하는 테이블입니다. 최근 우리는 FILESTREAM을 사용하여 이러한 모든 파일을 데이터베이스에서 파일 시스템으로 옮길 가능성을 테스트했습니다.
우리는 아무런 문제없이 데이터베이스에 필요한 수정 작업을 수행했으며 마이그레이션 후에도 시스템이 여전히 잘 작동합니다. BinaryContent
테이블이는 대충 다음과 같다 :
CREATE TABLE [dbo].[BinaryContent](
[BinaryContentID] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](50) NOT NULL,
[BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL
) ON [PRIMARY] FILESTREAM_ON [FileStreamContentFG]
ALTER TABLE [dbo].[BinaryContent] ADD [FileContentBinary] [varbinary](max) FILESTREAM NULL
ALTER TABLE [dbo].[BinaryContent] ADD CONSTRAINT [DFBinaryContentRowGUID] DEFAULT (newsequentialid()) FOR [BinaryContentRowGUID]
별도의 파일 그룹에있는 PRIMARY
필드 FileBinaryContent
를 제외하고 모든 파일 그룹에 FileStreamContentFG
있습니다.
시나리오
개발자의 관점에서 볼 때 프로덕션 환경의 최신 데이터베이스 사본을 사용하여 최신 데이터를 작업 할 수있는 경우가 종종 있습니다. 이 경우 BinaryContent에 저장된 파일에 관심이 거의 없습니다 (현재는 FILESTREAM 사용).
우리는 원하는대로 거의 작동합니다. 다음과 같은 파일 스트림없이 데이터베이스를 백업합니다.
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
다음과 같이 복원하십시오.
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
이것은 정상적으로 작동하는 것으로 보이며 FileBinaryContent
현장 을 사용하는 부품을 피하는 한 시스템이 작동 합니다. 예를 들어 문제없이 다음 쿼리를 실행할 수 있습니다.
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
당연히 FileContentBinary
쿼리를 포함하여 위의 주석을 주석 해제 하면 오류가 발생합니다.
"dbo.BinaryContent"테이블의 LOB (Large Object) 데이터는 액세스 할 수없는 오프라인 파일 그룹 ( "FileStreamContentFG")에 있습니다.
우리의 시스템 핸들 컨텐츠로 설정 파일 null
내가 될지, 그래서 좋아 할이 같은 것입니다 :
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
그러나 이것은 물론 위와 같은 오류를줍니다. 이 시점에서 나는 붙어 있습니다.
질문 파일 그룹
에서 모든 것을 복원하지 않고도 데이터베이스를 복원 할 수있는 방법이 FileStreamContentFG
있습니까? 위에서 시도한 것처럼 값을 null로 업데이트하거나 파일이 없거나 다른 것이 있으면 기본값을 null로 설정합니까?
아니면 잘못된 방법으로 문제에 접근하고 있습니까?
나는 본질적으로 개발자이며 DBA에 대한 지식이 많지 않으므로 여기서 사소한 것을 간과하고 있다면 실례합니다.