데이터베이스 원장은 무엇인가요?
적용 대상: SQL Server 2022(16.x) Azure SQL 데이터베이스 Azure SQL Managed Instance
데이터베이스 원장은 원장 기능의 일부입니다. 원장 테이블에서 업데이트가 발생하는 동안 데이터베이스는 시간이 지남에 따라 진화하고, 데이터베이스 원장은 데이터베이스 상태를 증분식으로 캡처합니다. 블록체인 및 Merkle 트리 데이터 구조를 논리적으로 사용합니다.
원장 테이블을 업데이트하는 모든 작업은 기록 데이터를 유지하고 데이터베이스 원장에 캡처된 다이제스트를 계산하기 위해 몇 가지 추가 작업을 수행해야 합니다. 특히 업데이트된 모든 행에 대해 다음을 수행해야 합니다.
- 기록 테이블에서 이전 버전의 행을 유지합니다.
- 트랜잭션 ID를 할당하고 새 시퀀스 번호를 생성하여 적절한 시스템 열에 유지합니다.
- 행 콘텐츠를 직렬화하고 이 트랜잭션에 의해 업데이트된 모든 행에 대한 해시를 계산할 때 포함합니다.
원장은 원장 테이블을 대상으로 하는 모든 삽입, 업데이트, 삭제 작업의 DML(데이터 조작 언어) 쿼리 계획을 확장하여 이를 달성합니다. 트랜잭션 ID 및 새로 생성된 시퀀스 번호는 새 버전의 행에 대해 설정됩니다. 그런 다음, 쿼리 계획 연산자는 행 콘텐츠를 직렬화하고 해당 해시를 계산하는 특수 식을 실행하여 트랜잭션 수준에 저장되고 이 원장 테이블에 대해 이 트랜잭션에 의해 업데이트된 모든 행 버전의 해시를 포함하는 Merkle 트리에 추가합니다. 트리의 루트는 이 원장 테이블에서 이 트랜잭션에 의해 수행되는 모든 업데이트 및 삭제를 나타냅니다. 트랜잭션이 여러 테이블을 업데이트하는 경우 각 테이블에 대해 별도의 Merkle 트리가 유지됩니다. 아래 그림에서는 원장 테이블의 업데이트된 행 버전과 행을 직렬화하는 데 사용되는 형식을 저장하는 Merkle 트리의 예를 보여 줍니다. 각 열의 직렬화된 값 이외에 행의 열 수, 개별 열의 서수, 데이터 형식, 길이, 값 해석 방법에 영향을 주는 기타 정보에 대한 메타데이터가 포함됩니다.
데이터베이스의 상태를 캡처하기 위해 데이터베이스 원장은 모든 트랜잭션에 대한 항목을 저장합니다. 커밋 타임스탬프 및 트랜잭션을 실행한 사용자의 ID와 같은 트랜잭션에 대한 메타데이터를 캡처합니다. 또한 각 원장 테이블에서 업데이트된 행의 Merkle 트리 루트도 캡처합니다(위 참조). 그런 다음, 이러한 항목이 변조 방지 데이터 구조에 추가되어 나중에 무결성을 확인할 수 있습니다. 블록은 다음과 같이 닫힙니다.
- 데이터베이스가 자동 데이터베이스 다이제스트 스토리지에 대해 구성된 경우 약 30초마다
- 사용자가 sys.sp_generate_database_ledger_digest 저장 프로시저를 실행하여 수동으로 데이터베이스 다이제스트를 생성하는 경우
- 100K 트랜잭션이 포함된 경우.
블록을 닫으면 새 트랜잭션이 새 블록에 삽입됩니다. 블록 생성 프로세스는 다음과 같습니다.
- 메모리 내 큐와 sys.database_ledger_transactions 시스템 카탈로그 뷰 모두에서 닫힌 블록에 속하는 모든 트랜잭션을 검색합니다.
- 이러한 트랜잭션과 이전 블록의 해시에 대한 Merkle 트리 루트를 계산합니다.
- sys.database_ledger_blocks 시스템 카탈로그 뷰에서 닫힌 블록을 유지합니다.
이는 일반 테이블 업데이트이므로 시스템은 자동으로 내구성을 보장합니다. 단일 블록 체인을 유지하기 위해 이 작업은 단일 스레드입니다. 그러나 트랜잭션 정보에 대한 해시만 계산하고 비동기적으로 발생하기 때문에 효율적입니다. 트랜잭션 성능에는 영향을 주지 않습니다.
원장이 데이터 무결성을 제공하는 방법에 대한 자세한 내용은 다이제스트 관리 및 데이터베이스 확인 문서를 참조하세요.
데이터베이스 트랜잭션 및 블록 데이터는 어디에 저장되어 있나요?
트랜잭션 및 블록에 대한 데이터는 두 개의 시스템 카탈로그 뷰에 행으로 물리적으로 저장됩니다.
- sys.database_ledger_transactions: 데이터베이스 원장에서 각 트랜잭션의 정보를 포함하는 행을 유지합니다. 정보에는 이 트랜잭션이 속한 블록의 ID와 블록 내의 트랜잭션 서수가 포함됩니다.
- sys.database_ledger_blocks: 블록 내의 트랜잭션에 대한 Merkle 트리의 루트와 블록체인을 형성하기 위한 이전 블록의 해시를 포함하여 원장의 모든 블록에 대해 행을 유지 관리합니다.
데이터베이스 원장을 보려면 SQL Server Management Studio, Azure Data Studio 또는 SQL Server Developer Tools에서 다음 T-SQL 명령문을 실행합니다.
SELECT * FROM sys.database_ledger_transactions;
GO
SELECT * FROM sys.database_ledger_blocks;
GO
원장 테이블의 다음 예제는 데이터베이스 원장의 블록체인에서 하나의 블록을 구성하는 4개의 트랜잭션으로 구성됩니다.
사용 권한
데이터베이스 원장을 보려면 VIEW LEDGER CONTENT
권한이 필요합니다. 원장 테이블과 관련된 권한에 대한 자세한 내용은 권한을 참조하세요.