메모리 최적화 테이블을 사용하여 데이터베이스를 복구하거나 복원하는 기본 메커니즘은 디스크 기반 테이블만 있는 데이터베이스와 비슷합니다. 그러나 디스크 기반 테이블과 달리 사용자 액세스에 데이터베이스를 사용할 수 있으려면 메모리 최적화 테이블을 메모리에 로드해야 합니다. 이렇게 하면 데이터베이스 복구에 새 단계가 추가되었습니다. 데이터베이스 복구의 수정된 단계는 다음과 같이 변경됩니다.
SQL Server가 다시 시작되면 각 데이터베이스는 다음 세 단계로 구성된 복구 단계를 진행합니다.
분석 단계입니다. 이 단계에서는 커밋된 트랜잭션과 커밋되지 않은 트랜잭션을 검출하기 위해 활성 트랜잭션 로그가 검토됩니다. 메모리 내 OLTP 엔진은 로드할 검사점을 식별하고 시스템 테이블 로그 항목을 미리 로드합니다. 또한 일부 파일 할당 로그 레코드를 처리합니다.
다시 실행 단계입니다. 이 단계는 디스크 기반 테이블과 메모리 최적화 테이블 모두에서 동시에 실행됩니다.
디스크 기반 테이블의 경우 데이터베이스가 현재 시점으로 이동되고 커밋되지 않은 트랜잭션에서 가져온 잠금을 획득합니다.
메모리 최적화 테이블의 경우 데이터 및 델타 파일 쌍의 데이터가 메모리에 로드된 다음 마지막 지속성 검사점을 기반으로 활성 트랜잭션 로그로 데이터를 업데이트합니다.
디스크 기반 및 메모리 최적화 테이블에 대한 위의 작업이 완료되면 데이터베이스에 액세스할 수 있습니다.
실행 취소 단계입니다. 이 단계에서는 커밋되지 않은 트랜잭션이 롤백됩니다.
메모리 최적화 테이블을 메모리에 로드하면 RTO(복구 시간 목표)에 영향을 줄 수 있습니다. 데이터 및 델타 파일에서 메모리 최적화 데이터의 로드 시간을 개선하기 위해 메모리 내 OLTP 엔진은 다음과 같이 데이터/델타 파일을 병렬로 로드합니다.
델타 맵 필터 만들기 델타 파일은 삭제된 행에 대한 참조를 저장합니다. 컨테이너당 하나의 스레드가 델타 파일을 읽고 델타 맵 필터를 만듭니다. 메모리 최적화 데이터 파일 그룹에는 하나 이상의 컨테이너가 있을 수 있습니다.
데이터 파일 스트리밍 델타 맵 필터가 만들어지면 논리 CPU가 있는 만큼의 스레드를 사용하여 데이터 파일을 읽습니다. 데이터 파일을 읽는 각 스레드는 데이터 행을 읽고, 연결된 델타 맵을 확인하고, 이 행이 삭제된 것으로 표시되지 않은 경우에만 테이블에 행을 삽입합니다. 복구의 이 부분은 아래에 설명된 대로 경우에 따라 CPU 바인딩될 수 있습니다.
메모리 최적화 테이블은 일반적으로 I/O 속도로 메모리에 로드될 수 있지만 데이터 행을 메모리로 로드하는 속도가 느려지는 경우가 있습니다. 구체적인 사례는 다음과 같습니다.
해시 인덱스에 대한 버킷 수가 낮을 경우 과도한 충돌로 인해 데이터 행 삽입 속도가 느려질 수 있습니다. 이로 인해 일반적으로 전체 및 특히 복구가 끝날 때까지 CPU 사용률이 매우 높습니다. 해시 인덱스가 올바르게 구성된 경우 복구 시간에 영향을 주지 않아야 합니다.
하나 이상의 비클러스터형 인덱스가 있는 대규모 메모리 최적화 테이블은 버킷 수가 생성 시 크기가 조정되는 해시 인덱스와 달리 비클러스터형 인덱스가 동적으로 증가하여 CPU 사용률이 높습니다.
메모리 최적화 테이블을 사용하여 데이터베이스 복원
서버에 데이터베이스를 복원하기에 충분한 메모리가 있다는 것을 알고 있지만 데이터베이스에 필요한 메모리가 기존 리소스 풀의 일부로 고려되어야 합니다. 데이터베이스가 존재하기 전에 리소스 풀에 대한 바인딩을 만들 수 없으므로 WITH NORECOVERY 복원을 수행합니다. 이렇게 하면 데이터베이스의 디스크 이미지가 복원되고 데이터베이스가 만들어지지만 데이터베이스가 온라인 상태가 아니므로 In-Memory OLTP 메모리가 사용되지 않습니다.
이 시점에서 리소스 풀을 데이터베이스 바인딩으로 만든 다음 RESTORE WITH RECOVERY를 사용하여 복원된 데이터베이스를 온라인 상태로 만들 수 있습니다. 데이터베이스가 온라인 상태가 되기 전에 바인딩이 준비되었으므로 In-Memory OLTP 메모리 사용량이 적절하게 고려됩니다. 이렇게 하려면 데이터베이스를 한 번만 복원해야 합니다. 첫 번째 RESTORE 명령은 백업 헤더만 읽는 정보 명령이며, 마지막 명령은 실제로 비트를 복원하지 않고 복구를 트리거합니다.