동일한 시점으로 여러 데이터베이스 백업


10

일반적으로 백업을 시작할 때 변경 사항 커밋을 허용하지 않거나 데이터베이스에 액세스 할 수 없습니다. 데이터베이스가 단일 사용자 모드에 있지만 백업을 시작하고 사용하기 위해 db를 해제하고 싶습니다. 또한 백업을 시작하면 진행중인 변경 사항이 백업 파일에 기록되는 것을 원하지 않습니다. Microsoft SQL Server 2012에서 어떻게 이것을 달성 할 수 있는지 알고 싶습니다.

우선 내 문제를 설명하겠습니다. 현재 백업이 완료 될 때까지 데이터베이스를 단일 사용자 모드로 설정하고 있습니다. 이 모드는 백업이 진행 중일 때 데이터 변경을 피하기위한 목적으로 사용됩니다. 그러나 내 응용 프로그램은 여러 데이터베이스와 연결되어 있습니다 (각 데이터베이스는 서로 상호 연결되어 있으며 매달마다 계속 생성되는 var dbs가 있습니다). 따라서 이러한 모든 데이터베이스를 백업하는 작업은 지루한 과정이되었으며 백업이 진행 중일 때 시스템에서 사용자를 유지해야합니다.

따라서 아래 언급 된 요구 사항을 충족시키는 백업 메커니즘을 찾고 있습니다.

  1. 한 번에 모든 db의 백업을 시작하고 사용하기 위해 db를 해제하십시오.
  2. 데이터베이스가 서로 연결되어 있으므로 백업 파일에서 데이터 일관성을 유지하고 싶습니다. 따라서이 데이터 일관성 요구 사항 때문에 변경 사항을 백업 파일에 커밋하고 싶지 않습니다.

내가 원하는 것은-주어진 시간에 모든 DB의 백업입니다.


2
백업을 수행 할 때 데이터베이스를 단일 사용자 모드로 설정할 필요가 없습니다. SQL Server는 커밋되지 않은 트랜잭션을 백업에 포함하지 않습니다. 보다 완전한 답변을 얻으려면 트랜잭션 로그 백업, 전체 백업 또는 증분 백업을 비롯하여 복구 문제에 대한 세부 정보를 포함하도록 게시물을 편집하십시오. 그것은 당신의 질문이 약간 불분명하다는 것을 의미합니다.
Daniel Hutmacher 2016 년

1
이 백업으로 무엇을 달성하고 싶습니까? 이 시점에 대한 완전한 복구 가능성 또는 다른 것? 다시 말해 ...이 백업에서 복원해야하는 경우 어떤 DDL 변경 사항을 복원해야합니까? 데이터 변경 또는 무엇?
seventyeightist

SQL 2012에서는 원하는 기능을 사용할 수 없습니다. SQL 7.0 일로 데이터베이스 백업 세트는 BACKUP 문이 시작될 당시와 마찬가지로 데이터베이스를 다시 작성하는 데 사용되었습니다. SQL 2000부터는 데이터베이스 백업 세트를 사용하여 BACKUP 문이 완료 될 때와 같이 데이터베이스를 다시 작성합니다.
stacylaray

@DanielHutmacher 나는 전체 백업을 찾고 있습니다.
Praveen

답변:


13

나는 당신의 작업이 모든 백업을 단일 정적 (개방 트랜잭션 없음) 지점 (모두 동기화 상태)으로 복원 할 수있는 백업 세트를 만드는 것이라고 가정합니다. DB2에서 Quiesce Point가 수행하는 작업과 유사합니다. 불행히도 SQL Server에는 정확히 그렇게하는 것이 없습니다. 그러나 데이터베이스가 전체 복구 모드에 있다고 가정하면 비슷한 작업을 수행 할 수 있습니다.

한 번에 모든 데이터베이스에서 단일 MARKED트랜잭션을 작성할 수 있습니다 . 그런 다음 각 데이터베이스의 트랜잭션 로그 백업을 수행하십시오. 로그 백업을 유지한다고 가정하면 (어쨌든) 로그 백업에는 시간이 오래 걸리지 않습니다. 그리고 누군가가 시스템에 참여하는 것을 막을 필요는 없습니다 (표시된 트랜잭션을 생성 할 수있을만큼의 시간은 제외).

이 시점에서 복원이 필요한 경우 RESTORE STOPBEFOREMARK각 데이터베이스에서 수행하십시오. 그러면 트랜잭션을 기반으로 모든 데이터베이스가 동일한 지점으로 복원됩니다. 참고 : 해당 트랜잭션을 포함하려는 경우 STOPATMARK도 있습니다.

예를 원한다면 위의 링크에 약간의 추가 읽기가 있습니다.

이것이 귀하의 질문에 정확하게 답변하지는 않지만 문제가 해결되기를 바랍니다.


2
BizTalk가 여러 데이터베이스의 특정 시점 백업을 관리하는 방법입니다. Microsoft BizTalk에서 작동한다면 잘 테스트 된 기능입니다.
Max Vernon

로그 쉽핑에서 TFS 데이터베이스에 사용하며 alwaysOn으로 변경했습니다.
Kin Shah

1
Ken의 응답을 이끌어 내기위한 하나의 암시 적이지만 세부적인 내용 : 여러 DB에서 일관성있는 전체 백업을 수행 할 수 없습니다. 가장 근접한 것은 전체 백업을 한 번 수행 한 다음 즉시 표시된 트랜잭션을 수행 한 다음 로그 백업을 수행하는 것입니다. 첫 번째 로그 백업 라운드는 특정 시점의 일관성을 "실제로 업"합니다.
AMtwo

기술적으로 @AMtwo는 OPs 방법을 사용하여 가능합니다. 시스템에서 모든 사용자를 잠그고 활성 연결이 없는지 확인하고 (데이터베이스를 읽기 전용 / 제한된 것으로 표시 할 수 있음) 모든 데이터베이스의 전체 백업을 수행하십시오. 그러나 OP가 언급했듯이 세계에서 가장 좋은 방법은 아닙니다.
Kenneth Fisher

7

귀하의 질문은 내가 대답 한 것과 유사합니다. 10-20 SQL Server 데이터베이스를 ~ 동기 상태로 백업 및 복원합니까?

데이터베이스 복구 모델이 FULL이라고 가정하면 전체 백업을 수행 한 다음 Marked Transactions 를 사용해야 합니다.

당신의 신화를 폭로하자 ...

한 번에 모든 db의 백업을 시작하고 사용하기 위해 db를 해제하십시오.

에서 백업 신화 (고 모든 백업 신화를 읽고 조언) :

백업 작업은 사용자 개체를 잠그지 않습니다. 백업은 I에 정말 무거운 읽기 부하 원인 할 / O 서브 시스템은 수 있도록 보고 작업 부하가 차단되고처럼,하지만 정말 아니다. 속도가 느려지고 있습니다. 대량 로그 익스텐트를 가져와야하는 백업에서 파일 잠금을 수행하여 검사 점 작업을 차단할 수있는 특별한 경우가 있지만 DML은 차단되지 않습니다.

데이터베이스가 서로 연결되어 있으므로 백업 파일에서 데이터 일관성을 유지하고 싶습니다. 따라서이 데이터 일관성 요구 사항 때문에 변경 사항을 백업 파일에 커밋하고 싶지 않습니다.

표시된 트랜잭션은 일관성 LOG 백업을 수행 도움이 될 것입니다 그리고 당신은 할 수있을 것입니다 복원을 사용하여 RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

인스턴스의 모든 데이터베이스에 대해 표시된 트랜잭션도 데이터베이스 의 dbo.logmarkhistory테이블에 기록 MSDB됩니다.


-1
--]---- Begin Code ----[
--–declaring variables
DECLARE @dbname VARCHAR(100) -- database name
DECLARE @bupath VARCHAR(100) -- path for backup location
DECLARE @filename VARCHAR(100) -- filename used for backup files
DECLARE @datestamp VARCHAR(25) -- date used for backup file timestamp
-- specify database backup directory
SET @bupath = 'D:\DB Bkp\'
-- file date formatting
SELECT @datestamp = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE
(CONVERT(VARCHAR(20),GETDATE(),108),':','')
--specify databases to backup
DECLARE db_cursor CURSOR for
SELECT name
FROM master.dbo.sysdatabases
WHERE name not IN ('tempdb') -- excludes these databases, if excluding multiple databases, seprate them by a comma
--backup process
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @filename = @bupath + @dbname + '_' + @datestamp + '.bak'
   BACKUP DATABASE @dbname TO DISK = @filename WITH INIT,
   CHECKSUM; --init overwrites existing files with the same name, and checksum verifies the backup
       FETCH NEXT from db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor

자세한 내용은 https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/


이것은 동일한 시점 백업을 보장 하지 않습니다 . 단지 연속 백업 순서 일뿐입니다.
vonPryz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.