Programing

SQL Server : 데이터베이스가 "복원"상태에서 멈춤

lottogame 2020. 2. 9. 20:29
반응형

SQL Server : 데이터베이스가 "복원"상태에서 멈춤


데이터베이스를 백업했습니다.

BACKUP DATABASE MyDatabase
TO DISK = 'MyDatabase.bak'
WITH INIT --overwrite existing

그런 다음 복원하려고했습니다.

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE --force restore over specified database

이제 데이터베이스가 복원 중 상태에 있습니다.

일부 사람들은 백업에 로그 파일이 없으므로 다음을 사용하여 롤 포워드해야한다고 이론화했습니다.

RESTORE DATABASE MyDatabase
WITH RECOVERY 

물론 그것을 제외하고는 실패합니다.

Msg 4333, Level 16, State 1, Line 1
The database cannot be recovered because the log was not restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

그리고 치명적인 상황에서 정확히 원하는 것은 작동하지 않는 복원입니다.


백업에는 데이터와 로그 파일이 모두 포함됩니다.

RESTORE FILELISTONLY 
FROM DISK = 'MyDatabase.bak'

Logical Name    PhysicalName
=============   ===============
MyDatabase    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf
MyDatabase_log  C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF

복원 프로세스의 일부로 데이터베이스를 온라인 상태로 만들려면 데이터베이스 명령 WITH RECOVERY과 함께이 옵션 을 사용해야합니다 RESTORE.

이것은 트랜잭션 로그 백업을 복원하지 않으려는 경우에만 해당됩니다. 즉, 데이터베이스 백업 만 복원 한 다음 데이터베이스에 액세스 할 수 있어야합니다.

당신의 명령은 다음과 같아야합니다.

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE,RECOVERY

SQL Server Management Studio에서 데이터베이스 복원 마법사를 사용하면 더 성공할 수 있습니다. 이 방법으로 특정 파일 위치, 덮어 쓰기 옵션 및 WITH 복구 옵션을 선택할 수 있습니다.


이 상황에서 Symantec Backup Exec 11d를 사용하여 데이터베이스를 SQL Server 2005 Standard Edition 인스턴스로 복원했습니다. 복원 작업이 완료된 후 데이터베이스는 "복원 중"상태로 유지되었습니다. 디스크 공간 문제가 없었습니다. 데이터베이스가 단순히 "복원"상태에서 나오지 않았습니다.

SQL Server 인스턴스에 대해 다음 쿼리를 실행하고 데이터베이스를 즉시 사용할 수 있음을 발견했습니다.

RESTORE DATABASE <database name> WITH RECOVERY

방법은 다음과 같습니다.

  1. 서비스를 중지하십시오 (MSSQLSERVER).
  2. 데이터베이스 및 로그 파일 (C : \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data ...)의 이름을 바꾸거나 파일이있는 위치
  3. 서비스를 시작하십시오 (MSSQLSERVER).
  4. 문제가있는 데이터베이스를 삭제하십시오.
  5. 데이터베이스를 다시 복원하십시오.

로그 전달 보조 서버를 중지하는 것과 비슷한 사고가 발생했습니다. 로그 전달에서 서버를 제거하고 기본 서버에서 로그 전달을 중지하는 명령 후 명령 후 보조 서버의 데이터베이스가 복원 상태로 멈췄습니다.

RESTORE DATABASE <database name> WITH RECOVERY

데이터베이스 메시지 :

RESTORE DATABASE가 18.530 초 (0.000MB / 초)에서 0 페이지를 성공적으로 처리했습니다.

18 초 후에 데이터베이스를 다시 사용할 수있었습니다.


SQL Management Studio를 사용하여 복원하는 데 비슷한 문제가 있습니다. 데이터베이스 백업을 다른 이름의 새 데이터베이스로 복원하려고했습니다. 처음에는 이것이 실패했고 새 데이터베이스의 파일 이름을 수정 한 후에는 성공적으로 수행되었습니다. 어쨌든 내가 처음부터 이것을 얻었더라도 설명하는 문제가 다시 발생했습니다. 따라서 복원 후 원래 데이터베이스는 이름 옆에 (복원 중 ...)으로 남아있었습니다. 위의 포럼 (Bhusan 's)의 답변을 고려하여 다음과 같은 측면에서 쿼리 편집기에서 실행을 시도했습니다.

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

문제가 해결되었습니다. 특수 문자가 포함 된 데이터베이스 이름으로 인해 처음에 문제가 발생했습니다. 큰 따옴표를 추가하여이 문제를 해결했습니다. 작은 따옴표는 "Incorrect syntax near ..."오류가 발생하지 않습니다.

이것은이 문제를 해결하려고 시도한 최소한의 솔루션 (데이터베이스를 복원하는 상태로 멈춤)이며 더 많은 경우에 적용 할 수 있기를 바랍니다.


좋아, 나는 비슷한 문제가 있으며 Pauk의 경우와 마찬가지로 복원하는 동안 서버의 디스크 공간이 부족하여 영구적으로 복원되는 상태가되었습니다. SQL Server 서비스를 중지하지 않고이 상태를 끝내는 방법은 무엇입니까?

나는 해결책을 찾았다 :)

Drop database *dbname*

WITH RECOVERY 옵션은 RESTORE DATABASE / RESTORE LOG 명령이 실행될 때 기본적으로 사용됩니다. "복원"프로세스가 중단 된 경우 다음을 실행하여 데이터베이스를 온라인 상태로 되돌릴 수 있습니다.

RESTORE DATABASE YourDB WITH RECOVERY
GO

여러 파일을 복원해야하는 경우 CLI 명령에는 각각 WITH NORECOVERY 및 WITH RECOVERY가 필요합니다. 명령의 마지막 파일에만 WITH RECOVERY가 있어야 데이터베이스를 온라인으로 되돌릴 수 있습니다.

RESTORE DATABASE YourDB FROM DISK = 'Z:\YourDB.bak'
WITH NORECOVERY
GO
RESTORE LOG YourDB FROM DISK = 'Z:\YourDB.trn'
WITH RECOVERY
GO

SQL Server Management Studio 마법사를 사용할 수도 있습니다.

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

가상 복원 프로세스도 있지만 타사 솔루션을 사용해야합니다. 일반적으로 데이터베이스 백업을 라이브 온라인 데이터베이스로 사용할 수 있습니다. ApexSQL과 Idera는 자체 솔루션을 가지고 있습니다. ApexSQL 복원에 대해 SQL Hammer 검토합니다 . 많은 수의 백업을 처리하는 경우 가상 복원이 좋은 솔루션입니다. 복원 프로세스가 훨씬 빠르며 디스크 드라이브의 공간을 많이 절약 할 수 있습니다. 여기서 비교를 위해 인포 그래픽을 살펴볼 수 있습니다 .


이것은 매우 분명 할 수 있지만 지금 당장 나에게 넘어졌습니다.

테일 로그 백업을 수행하는 경우 SSMS 복원 마법사에서이 옵션을 선택하여이 문제가 발생할 수도 있습니다. "원본 데이터베이스를 복원 상태로두기 (NOTH NORECOVERY)"

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


나는 왜 그런지 알아 냈다.

RESTORE DATABASE명령 을 실행 한 클라이언트 가 복원 중에 연결을 끊으면 복원이 중단됩니다.

클라이언트 연결로 데이터베이스를 복원하라는 메시지가 표시 될 때 서버가 클라이언트가 계속 연결 상태를 유지하지 않으면 복원을 완료하지 못할 수도 있습니다.


이것은 작동했습니다 :

http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/8dd1b91d-3e14-4486-abe6-e3a550bfe457

데이터베이스에 복원 상태가 표시되어 쿼리를 실행할 수없고 소프트웨어와 연결할 수없는 상황이있었습니다.

이 상황에서 벗어나기 위해 한 것은 :

  1. Windows 서비스에서 모든 SQL 관련 서비스를 중지하십시오.

  2. Ldf 및 Mdf 파일이있는 SQL 폴더에서 DATA 폴더를 열었습니다. 일반적으로 다음과 같습니다. "C : \ Program Files *********** \ MSSQL \ DATA

  3. 그런 다음 데이터베이스의 Ldf 및 Mdf 파일 [db name] .mdf 및 [db name] _log.ldf를 모두 복사했습니다.

이 두 파일을 다른 폴더로 복사했습니다.

  1. 그런 다음 Windows 서비스에서 모든 SQL 관련 서비스 (1 단계)를 다시 시작했습니다.

  2. 일반 로그인으로 MS SQL Management Studio를 시작했습니다.

  3. 범인 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 Delete 키를 눌러 데이터베이스를 전혀 삭제하십시오.

  4. 이 데이터베이스와 관련된 모든 LDF 및 MDF 파일이 DATA 폴더에서 나왔습니다 (2 단계에서 언급 함).

  5. 이름이 같은 새 데이터베이스를 만들었습니다 (6 단계에서 삭제 한 것과 동일한 이름-범인 데이터베이스).

  6. 그런 다음 [데이터베이스 이름]-> 오른쪽 클릭-> 작업-> 오프라인으로 전환하십시오.

  7. 그런 다음 두 파일 (3 단계)을 DATA 폴더 (2 단계)로 다시 복사했습니다.

  8. [데이터베이스 이름]-> 오른쪽 클릭-> 작업-> 온라인 상태로 만듭니다.


나는. 내 데이터베이스 이름에 쿼리가 작동하지 않아 ( '.'근처에 잘못된 구문이 있습니다.) 그런 다음 이름에 대괄호가 필요하다는 것을 깨달았습니다.

RESTORE DATABASE [My.DB.Name] WITH RECOVERY

필자의 경우 SQL 명령을 사용하여 "Restoring ..." 상태에 있는 데이터베이스삭제하는 것으로 충분했습니다.

 drop database <dbname> 

쿼리 창에서.

그런 다음 데이터베이스를 마우스 오른쪽 단추로 클릭 하고 새로 고침선택 하여 Management Studio에서 항목을 제거했습니다. 그 후 나는 잘 작동하는 새로운 복원을 수행했습니다 (오프라인으로 가져 오는 것은 효과가 없으며 SQL 서비스 재시작이 작동하지 않으며 서버 재부팅도 작동하지 않습니다).


이벤트 로그에서 TCP 오류를 수신했을 때이 문제가 발생했습니다 ...

sql로 DB를 삭제하거나 관리자 "삭제"에서 마우스 오른쪽 버튼을 클릭하고 다시 복원하십시오.

실제로 기본적 으로이 작업을 시작했습니다. DB 삭제 스크립트를 작성하고 다시 생성 한 후 복원하십시오.


기본적으로 모든이 RESTORE DATABASE와 함께 제공 RECOVERY세트까지. 'NORECOVERY'옵션은 기본적으로 SQL Server에 데이터베이스가 더 많은 복원 파일을 기다리고 있음을 알려줍니다 ( DIFF 파일 및 LOG 파일 일 수 있으며 가능한 경우 테일 로그 백업 파일을 포함 할 수 있음). 'RECOVERY'옵션은 모든 트랜잭션을 완료하고 데이터베이스가 트랜잭션을 수행 할 수 있도록합니다.

그래서:

  1. 데이터베이스가 SIMPLE 복구 모델 로 설정된 경우 DIFF 백업 이있을 때만 옵션을 사용하여 전체 복원을 수행 할 수 있습니다 . 아니 LOG의 백업에서 허용되는 단순 복구 모델 데이터베이스.NORECOVERY
  2. 그렇지 않으면 데이터베이스가 FULL 또는 BULK-LOGGED 복구 모델 로 설정된 경우 FULL 복원과 NORECOVERY옵션을 차례로 수행 한 다음 DIFF와을 차례로 수행하고 NORECOVERY마지막 으로 옵션을 사용하여 LOG 복원을 수행 할 수 RECOVERY있습니다.

기억, 주의 마지막은 QUERY 있어야 RESTORE RECOVERY옵션을 . 명시적인 방법 일 수도 있고 아닐 수도 있습니다. T-SQL 열에서 상황은 다음과 같습니다.

1.

 USE [master]
    GO
    RESTORE DATABASE Database_name 
    FROM DISK = N'\\path_of_backup_file.bak WITH FILE = 1, [REPLACE],NOUNLOAD, 
    RECOVERY -- This option could be omitted.
    GO

WITH REPLACE 옵션은 데이터 손실로 이어질 수 있으므로주의해서 사용해야합니다

또는 FULL 및 DIFF 백업을 수행하는 경우이를 사용할 수 있습니다

   USE [master]
    GO
    RESTORE DATABASE Database_name
      FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
       NOUNLOAD,NORECOVERY
    GO
    RESTORE DATABASE Database_name
      FROM DISK =N'\\path_of_**diff**backup_file.bak' WITH FILE = 1, 
     NOUNLOAD, RECOVERY
    GO

 2. USE [master]
    GO
   -- Perform a Tail-Log backup, if possible. 
   BACKUP LOG Database_name
   GO
   -- Restoring a FULL backup
   RESTORE DATABASE Database_name
    FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
     NOUNLOAD,NORECOVERY
  GO 
  -- Restore the last DIFF backup
  RESTORE DATABASE Database_name
    FROM DISK = N'\\path_of_DIFF_backup_file.bak' WITH FILE = 1,
     NORECOVERY,NOUNLOAD
  GO
  -- Restore a Log backup
  RESTORE LOG Database_name
    FROM DISK = N'path_of_LOG_backup_file.trn' WITH FILE = 2,
    RECOVERY, NOUNLOAD
  GO

물론 STATS = 10 옵션을 사용하여 복원을 수행하여 완료된 10 %마다 SQL Server 에보고 하도록 지시 할 수 있습니다 .

원하는 경우 프로세스를 관찰하거나 실시간 기반 쿼리로 복원 할 수 있습니다. 다음과 같이:

USE[master]
GO
SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time 
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a 
        WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO

이 도움을 바랍니다.


스냅 샷이 활성화 된 경우 걸린 데이터베이스를 삭제하는 데 문제가있을 수도 있습니다. 나를 위해 이것은 효과가 있었다 :

  1. 먼저 Tipu Delacablu 단계를 따랐 습니다 (몇 개의 게시물 읽기)
  2. run command : drop database [your database] : 스냅 샷 데이터베이스의 이름을 알려주는 오류가 발생합니다.
  3. 명령 실행 : 데이터베이스 [snapshot database]를 삭제 한 다음 2 단계에서 명령을 다시 실행하십시오.

VERIFY 만 실행 해 보셨습니까? 사운드 백업인지 확인하십시오.

http://msdn.microsoft.com/en-us/library/ms188902.aspx


  1. 먼저 SQL 에이전트 서비스를 확인하고 실행하십시오.
  2. 다음 T-SQL 사용 :

    파일 이름을 선택하십시오. master.sys.sysaltfiles WHERE dbid = DB_ID ( 'db_name');

  3. T-SQL을 지속적으로 사용 :

    디스크에서 데이터베이스 복원 = RESTART, REPLACE가있는 'DB_path';

이 도움을 바랍니다!


모든 WITH RECOVERY 기반 옵션이 작동하지 않았습니다.

Management Studio에서 전체 복원을 수행했습니다.

USE [master]
RESTORE DATABASE Sales_SSD
FROM  DISK = N'D:\databaseBackups02\Daily_Sales_20150309_0941.bak' 
WITH  FILE = 1,  
MOVE N'Sales_Data' TO N'C:\Data\SSD\Sales.mdf',  
MOVE N'Sales_Log' TO N'C:\Data\SSD\Sales_1.ldf',  
NOUNLOAD,  REPLACE,  STATS = 5

같은 문제가 발생했습니다. 드라이브가 가득 차지 않아서 데이터베이스가 왜이 문제를 겪었는지 모르겠지만 ... 손상된 것 같습니다. 나는 위의 모든 것을 완전히 시도하지 않았다. 특히 서비스를 중지하고 mdf 및 ldf 파일을 삭제하라는 제안이 효과가 있다고 생각했지만 복원시 여전히 멈췄습니까?

언급 한대로 파일을 삭제 하여이 문제를 해결했지만 DB를 다시 복원하려고하는 대신 새로운 .mdf 및 .ldf 파일을 복사하고 프런트 엔드 첨부 마법사를 사용하여 첨부했습니다. 구호, 그것은 일했다!!

가상 머신을 사용하는 동안 새 파일을 복사하는 데는 시간이 걸렸습니다. 클립 보드를 사용한 복사 및 붙여 넣기는 한 시간 정도 걸리므로 마지막 시도로만 권장합니다.


나는 가지고있다 (복원 중 ...) MyDbName 때문에 SQL 익스프레스의 경우는 제한을 허가합니다.

로그 파일에서 다음을 발견했습니다.

결과 누적 데이터베이스 크기가 라이센스 된 데이터베이스 당 10240MB를 초과 하므로 CREATE DATABASE 또는 ALTER DATABASE가 실패했습니다 .

따라서 더 큰 데이터베이스를 복원하려는 경우 SQL Express 서버를 예를 들어 Developer 에디션으로 전환해야 합니다.


나를 위해 고친 것은

  1. 인스턴스 중지
  2. 데이터 폴더에 .mdf 및 .ldf 파일의 백업 생성
  3. 인스턴스를 다시 시작하십시오.
  4. 복원이 걸린 데이터베이스 삭제
  5. .mdf 및 .ldf 파일을 다시 데이터 폴더에 넣습니다.
  6. .mdf 및 .ldf 파일에 인스턴스를 연결하십시오.

RESTORE DATABASE {DatabaseName}
   FROM DISK = '{databasename}.bak'
   WITH REPLACE, RECOVERY

참고 URL : https://stackoverflow.com/questions/520967/sql-server-database-stuck-in-restoring-state



반응형