SharePoint 데이터베이스로 부터 모든 문서를 백업 및 추출하기

개요

필자는 SharePoint 서버 제품을 이용해서 문서를 관리해 왔다. SharePoint를 이용하면 수 천개의 문서를 종류별로 분류하고 데이터베이스화할 수 있다. 문서의 종류와 문서의 내용도 인덱싱(indexing)되므로 문서 내용과 다양한 메타 데이터로 문서를 검색할 수 있다는 점 때문에 많은 문서를 쉽게 관리하고 검색할 수 있다는 장점이 있다.

SharePoint의 장점을 나열하지면 많겠지만, 모바일 트랜드 시대에서는 에버노트가 최고이지 쉽다. 필자의 에버노트와 DropBox는 땡전 한푼 안들이고 프리미엄 서비스를 받고 있는데, 필자가 문서를 사용하고 관리하는 패턴에선 SharePoint 보다는 에버노트DropBox 조합이 더 접근성이 좋고 사용하기도 편하다. 데스크탑은 물론이고 브라우저, 다양한 모바일 기기에서 에버노트 클리핑과 DropBox 동기화 등을 지원하기 때문이다.

그래서 이번에 필자가 가지고 있는 수 천개의 모든 문서를 이전하고자 SharePoint의 모든 파일을 추출해야 했다. 여기에서 여러 Site Collections/Sites/Doc Libs의 각각의 문서를 한 번에 추출하는 작업을 진행했다.

1. WSS_Content 데이터베이스 연결

원하는 툴을 이용해서 SharePoint가 사용하는 데이터베이스에 연결한다. SharePoint에 저장된 문서가 많을 수록 데이터베이스에 연결해야 하는 시간이 늘어난다. 그러므로 Timeout이 발생하지 않도록 주의해야 한다. 필자는 여기에서 SSMS(Sql Server Management Studio) 2012 버전을 사용했다.

2. 파일 추출하기

2.1. 데이터베이스 구성 변경 쿼리 실행

sp_configure 'show advanced options', 1;  
GO

RECONFIGURE;  
GO

sp_configure 'Ole Automation Procedures', 1;  
GO

RECONFIGURE;  
GO

2.2. 데이터베이스 추출 쿼리 실행

아래의 쿼리는 이 사이트의 링크[1]를 참고하였으나, 일부 오류가 발생하여 필자가 수정한 부분이 있으니 이점 참고하기 바란다.

그리고 SharePoint에 저장되는 파일들은 다양한 타입이 존재한다. 가령, 메타데이터의 Binary 파일, _private 폴더, *.aspx, 시스템에 필요한 파일 등 필자가 저장한 문서와 상관 없는 찌꺼기 들도 함께 저장이 된다.

파일의 다양한 플래그 값은 MSDN의 Document Store Type, Doc Flags 문서[2]를 참고 하면 된다.


  
[그림1] WSS_Content 데이터베이스의 모든 문서를 파일 시스템으로 추출한 결과 화면


USE WSS_CONTENT;  

DECLARE @PATH_PREFIX  NVARCHAR(1024);  
SET @PATH_PREFIX = 'C:\BACKUP\';  -- 이곳에 백업할 경로를 입력, 반드시 뒤에 '\' 문자 추가하셈'


--DECLARING THE CURSOR, THIS IS THE ITEMS YOU WANT TO RUN THE EXTRACTING ON  
DECLARE CURSOR_Images CURSOR FOR (SELECT Id FROM [dbo].[AllDocs])  

--DECLARE THE TYPE OF THE COLUMN YOU SELECTED ABOVE  
DECLARE @ImageID uniqueidentifier;  

--START THE CURSOR AND RUN THROUGH ALL THE ITEMS IN CURSOR_Images  
OPEN CURSOR_Images  
FETCH NEXT FROM CURSOR_Images INTO @ImageID  
WHILE (@@FETCH_STATUS <> -1)  
BEGIN  
  --DECLARE THE VARIABLE THAT WILL KEEP THE BINARY DATA  
  DECLARE @ImageData varbinary(MAX);  
  --SELECT THE BINARY DATA AND SET IT TO @ImageData.  THE BINARY DATA FOR ALLDOCS ARE LOCATED IN ALLDOCSTREAMS  
  --AND THE ID IS THE SAME AS IN ALLDOCS  
  SELECT @ImageData = (SELECT TOP 1 CONVERT(varbinary(MAX), Content, 1) FROM [dbo].[AllDocStreams] WHERE Id = @ImageID ORDER BY InternalVersion ASC);

  --GET THE LOCATION OF THE DIRECTORY THE FILES WAS SAVED IN AND CHANGE REPLACE THE / WITH \ TO BE USED IN FILESYSTEM  
  DECLARE @DIRPATH NVARCHAR(MAX);  
  SET @DIRPATH = REPLACE((SELECT  DirName FROM [dbo].[AllDocs]  WHERE Id = @ImageID),'/','\');

  --SET THE PATH  
  DECLARE @Path nvarchar(1024);  
  --SELECT @Path = 'C:\Export\' + @DIRPATH + '\';  
  SELECT @Path = @PATH_PREFIX + @DIRPATH + '\';
-- '\

  --CREATE THE DIRECTORIES  
  EXEC master.dbo.xp_create_subdir @Path;

  --GET THE FILE NAME OF THE FILE FROM LEAFNAME  
  DECLARE @Filename NVARCHAR(1024);  
  DECLARE @DocFlags INT;  
  DECLARE @Type     TINYINT;  
  SELECT @Filename = (SELECT LeafName FROM [dbo].[AllDocs] WHERE id = @ImageID);  
  SELECT @DocFlags = (SELECT DocFlags FROM [dbo].[AllDocs] WHERE id = @ImageID);  
  SELECT @Type     = (SELECT [Type]    FROM [dbo].[AllDocs] WHERE id = @ImageID);

  -- 폴더를 0바이트 파일로 생성하므로 파일이 아닌 경우 파일 저장 루틴 진입 금지  
  IF (@Type = 1 AND @DocFlags = 0) OR (@DocFlags & 0x100) <> 0x100 BEGIN  
CONTINUE;  
  END   
  ELSE BEGIN

  --SET THE FULL PATH FOR WHERE THE FILES WILL BE STORED  
  DECLARE @FullPathToOutputFile NVARCHAR(2048);  
  SELECT @FullPathToOutputFile = @Path + '\' + @Filename;

  --SAVE THE FILE TO THE FILE SYSTEM  -'
  DECLARE @ObjectToken INT  
  EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT;  
  EXEC sp_OASetProperty @ObjectToken, 'TYPE', 1;  
  EXEC sp_OAMethod @ObjectToken, 'OPEN';  
  EXEC sp_OAMethod @ObjectToken, 'WRITE', NULL, @ImageData;  
  EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FullPathToOutputFile, 2;  
  EXEC sp_OAMethod @ObjectToken, 'Close';  
  EXEC sp_OADestroy @ObjectToken;

  END

  --LOOP TO THE NEXT ENTRY IN THE CURSOR  
  FETCH NEXT FROM CURSOR_Images INTO @ImageID  
END  
CLOSE CURSOR_Images  
DEALLOCATE CURSOR_Images  

2.3. 참고 사항

위의 쿼리는 다양한 메타데이터와 시스템 파일(*.aspx, _private 등..)을 모두 저장한다. 이런 쓰레기 데이터를 파일로 저장하지 않길 원한다면 아래의 쿼리를 이용해서 조건절을 추가해 주면 된다.

각각의 플래그 값의 의미는 Document Store Type 문서를 참고하면 된다. 그러면 여러분이 원하는 데이터만 파일 시스템으로 추출하여 저장하도록 커스터마이징이 될 것이다.

SELECT LeafName, DocFlags  
  FROM [dbo].[AllDocs]  
 WHERE (DocFlags & 0x100) = 0x100
   AND (DocFlags & 0xFFFF0000) <> 0xFFFF0000
   AND (DocFlags & 0x80) <> 0x80
   AND (DocFlags & 0x10) <> 0x10
   AND (DocFlags & 0x8) <> 0x8  

결론

만약 SharePoint에 저장되었던 많은 파일 또는 데이터를 전혀 다른 솔루션으로 이전하고 싶은 경우가 있다. SharePoint는 Microsft SQL Server 데이터베이스에 바이너리를 저장하는데 파일 시스템을 단일 데이터베이스에 저장한다는 것이 좀 아이러니 한 구조이다.

많은 기업내 담당자들의 SharePoint에 대한 피드백을 물어보면 빠지지 않는 것은 ‘느리다’ 라는 것인데, 기하급수적으로 늘어나는 데이터베이스 용량과 웹 응용 프로그램의 SPSites/DocLibs 등이 생성되면서 시간이 지날 수록 점점 느려지는 것은 어쩔 수 없는 구조인 듯 하다. 더불어 SharePoint는 과거의 아키텍처가 현재까지도 트랜드의 변화에 대응되지 못하고 전반적으로 과거와 동일한 아키텍처에 새로운 기능만 계속 붙여나가다 보니 솔루션 자체의 구조적인 면에서 악순환이 되풀이 되는 형세이다.

하지만, 이 아티클을 통해 SharePoint 데이터베이스에서 직접 파일을 추출하여 파일 시스템으로 저장할 수 있다. 이 방법을 통해 추출된 다량의 파일을 다른 솔루션으로 옮기거나 업로드하면 끝이다.


Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 억사마 2014.02.03 18:00 신고 Address Modify/Delete Reply

    안녕하세요~ 연락처가 어디 없으셔서 이렇게 댓글 남깁니다. SharePoint를 파일시스템에 백업을 받아야하는 급박한 회사업무가 생겼습니다. 좀 도움을 얻을수 있을까요? 부탁드리겠습니다. 혹시 몰라 제 이메일 주소를 남깁니다. e.joe@samsung.com 연락 부탁드리겠습니다. 감사합니다.

  2. 2014.02.03 18:14 Address Modify/Delete Reply

    비밀댓글입니다

파일 공유 클라우드 서비스의 범람

정말 클라우드 시대인가보다. 아무런 대가(금전적인 대가)를 치르지 않았지만 많은 파일 공유 클라우드 프로바이더는 10GB 이상의 무료 공간을 나누어 준다. 이런 서비스가 전세계를 대상으로 이 정도의 성능(속도)로 제공 된다는 것 조차 신기할 다름이다.

국내 서비스로 Naver와 Daum 클라우드, KT의 ucloud 서비스. 글로벌 서비스로 Dropbox, SkyDrive가 대표적일 것이다. 그리고 각 서비스의 장단점도 있는데 가볍게 훓어보자. 필자가 보유한 용량도 함께 표시하였다.

  • 네이버 N드라이브
    30GB 보유
    장점, N드라이브는 물론이요, 캘린더와 가계부, 메일, i메모, Work 등 멋진 9단 콤보를 보유
    단점, N드라이브 클라이언트 앱이 허구언날 업데이트 하라고 하고, 클릭 미스를 유도한 다른 어플 설치 꼼수가 좀 짜증난다. 더불어 N드라이브 클라이언트가 툭 하면 뻗는다.

  • Daum 클라우드
    50GB 보유
    장점, 용량이 무려 50GB, 속도가 빠르다.
    단점, 모바일을 일찍이 지원하지 못한 후발 주자고 인지도 면에서 이미 다른 서비스가 선점한 후에, 이제서야 난리 법석인 조금은 어리석은 서비스랄까…

  • Dropbox
    3.6GB 보유
    장점, 파일 공유 클라우드의 갑이다. 수 많은 앱과 어플들이 Dropbox와 연동된다. 다른 건 몰라도 Dropbox 계정 하나 쯤은 꼭 소장할 가치가 있다.
    단점, 파일 공유 용량을 짜게 준다. 친구 초대한 친구가 Dropbox를 쓰면 무료 용량을 좀 더 주긴 하지만, 계정 몇 개 더 만들어서 쓰는게 정신적으로 이롭다.

  • SkyDrive
    25GB 보유
    장점, 글로벌 서비스로 안정적이고 나름 용량도 많이 준다.
    단점, 안정적이다 못해 느리다. 업로드도 느리고, 다운로드도 느리다.

  • ucloud
    120GB 보유
    장점, 상당히 많은 용량을 제공한다. 기본으로 제공하는 용량과 더 늘릴 수 있는 이벤트도 많이 한다. 필자는 아이폰5를 구매 이벤트에서 추가 용량 쿠폰을 받아서 120GB의 용량을 확보했다.
    단점, 웹 접근성도 그렇고 클라이언트 앱도 쓰기가 불편하게 생겼다.

파일 공유 클라우드 서비스 잘 쓰기

잘 쓰는 방법이야 개인적인 성향과 용도가 다르므로 꼭 이렇게 저렇게 써야 한다는 정답 같은 공식은 없다. 내 맘대로 쓰겠다는데 누가 뭐라 하겠는가.

다만, 각 서비스와 연계되는 기능과 지리적인 특성 등을 모두 고려하면 어느 정도 효과적으로 쓸 수 있는 방법은 분명 존재한다. ‘필자는 이렇게 쓴다’ 정도로 봐주시고, 활용법을 잘 몰랐다면 힌트를 얻어서 잘 쓰기를 바랄 뿐이다.

  1. N드라이브와 Daum 클라우드 서비스
    두 클라우드 서비스는 한국의 대표적인 포털이자 지리적인 위치의 장점인 빠른 속도가 장점이므로 용량이 큰 파일은 주로 두 서비스에 저장을 한다.

    용량이 큰 경우는 사진 파일, 그리고 여러 가지 문서와 백업 데이터를 저장해 놓으면 좋다.

  2. Dropbox
    이 서비스는 서버와 클라이언트 모두를 파이썬(Python)으로 만들어졌으며(그냥 그렇다고요 ^^), 웹 인터페이스도 가장 깔끔하고 사용하기에도 편리하다. 매우 많은 앱과 어플들이 클라우드 저장 기능을 Dropbox를 선택했다. 개인이 쓰기에 동기화 서비스로 Dropbox가 제격이다.

    그러므로 여러 기기에 동기화가 필요한 데이터나 파일을 Dropbox에 저장하여 이용하는 것이 가장 유리하다.

  3. ucloud
    딱히 몇 가지의 목적으로 사용하기에 애매한 부분이 많다. 오히려 ucloud biz 서비스라는 기업용 서비스에 더 가깝지 않을까 한다. 다만, KT의 인터넷 인프라를 바탕으로 움직이는 클라우드 서비스인 만큼 네트워크 품질은 가장 낫다고 믿는다.

  4. SkyDrive
    참으로 안타까운 서비스다. 넉넉하게 용량을 제공해 주지만 너무 느린 업로드와 다운로드 때문에 PDF 파일 여럿을 빠릿 빠릿하게 볼 수가 없다. 그래도 다 쓸데가 있을터…
    SkyDrive 동기화 폴더를 지정 할 때 ‘N드라이브, Daum 클라우드, Dropbox’가 동기화 되는 폴더로 지정하면 된다. 가령, 중요한 데이터가 있는 Dropbox의 동기화 폴더를 SkyDrive에서 동기화(백업)하도록 Dropbox 동기화 폴더를 SkyDrive 동기화 폴더로 구성한다. 어찌보면 미러링이라 하겠다.

    Dropbox가 막힌 인트라넷인 경우 동기화로 백업된 SkyDrive에서, DropBox+SkyDrive가 막힌 곳에서 N드라이브 또는 Daum 클라우드에서 데이터를 찾도록 구성할 수 있다.

결론

간단히 요약하는 겸 필자는 아래와 같이 클라우드 서비스를 사용하고 있다.

  • Dropbox
    주요 앱, 어플 동기화 데이터 저장 공간
    예를 들어, ‘1Password, DEVONThink, Ulysses, Scrivener, TextExpandar’ 등의 앱의 데이터 동기화, 그리고 ‘Eclipse, WebStrom, Visual Studio’ 등의 개발툴(IDE) 설정 파일 동기화)

  • N드라이브
    아이폰, 아이패드, 갤럭시S3 자동 사진 업로드 공간

  • Daum 클라우드, UCloud, SkyDrive
    미러링 및 백업용 공간


Posted by 땡초 POWERUMC

댓글을 달아 주세요