
Oracle 데이터베이스용 Docker 이미지를 생성 중이며 동일한 이미지에서 다양한 컨테이너가 생성됩니다.
Oracle 인스턴스를 시작하면 어떤 이유로 모든 활성 데이터 파일에 몇 바이트가 기록됩니다. Docker는 컨테이너의 diff를 기본 이미지에 저장하고 diff는 변경된 전체 파일이므로 컨테이너를 시작할 때마다 데이터베이스 시작을 위해 6GB 이상이 디스크에 기록됩니다.
그렇다면 Oracle은 데이터베이스를 시작할 때 왜 데이터 파일에 기록합니까? 가장 논리적인 동작은 데이터가 변경되고 커밋될 때만 데이터 파일에 쓰는 것입니다. 그것을 바꾸기 위해 뭔가를 할 수 있을까요?
내 이미지의 기반인 Oracle Linux 외에도 Windows에서도 시도해 보았지만 동작은 동일하며 모든 데이터 파일이 기록됩니다.
테이블스페이스를 읽기 전용으로 설정해 보았습니다. 그러면 쓰기 작업이 방지되지만 테이블스페이스를 읽기/쓰기로 설정하면 즉시 파일에 쓰기 때문에 문제가 다시 발생합니다.
확실히 말하자면, 쓰기 가능한 테이블스페이스가 필요하지만 데이터가 실제로 변경될 때만 가능합니다.
답변1
그것을 피할 방법은 없습니다. 사용자 데이터 외에도 Oracle에는 많은 메타데이터가 포함되어 있으므로 이러한 메타데이터도 유지 관리해야 합니다. Oracle은 내부적으로 SCN(System Change Number)이라는 번호를 유지 관리합니다. 이 숫자는 데이터베이스에서 "무언가"가 변경될 때마다 증가합니다.
이 SCN 번호는 모든 데이터 파일의 헤드와 모든 제어 파일에 기록됩니다. 데이터베이스를 열 때(시작할 때) Oracle은 이 번호가 모든 파일에서 동일한지 확인합니다. 그런 다음 파일이 일관성이 있다고 가정합니다.
이 SCN은 데이터베이스에 대한 로드가 없더라도 증가합니다. 또한 통계 수집과 같은 백그라운드 작업이 약간의 로드를 수행합니다. 또한 사용자는 ON DATABASE STARTUP
데이터베이스가 시작될 때 일부 작업을 실행하는 시스템 트리거를 생성할 수도 있습니다.
일반적으로 Oracle 데이터베이스 서버는 가상화에 적합하지 않습니다. 저널링 Oracle 직원도 내부적으로 수행하므로 동일한 데이터를 두 번 보관합니다(이 파일을 Archive redo-logs라고 함). 따라서 컨테이너 diff(데이터 파일에만 해당)를 삭제하면 Oracle은 다시 실행 로그에서 트랜잭션을 재생할 수 있기 때문에 살아남을 수 있습니다.
추신: 데이터베이스를 복제할 때 데이터베이스 SID를 고유하게 변경하는 것도 고려해야 합니다. 또는 최소한 nid를 사용하여 데이터베이스 고유 번호 DBID를 변경해야 합니다. 그렇지 않으면 RMAN 데이터베이스 백업을 복원할 때 문제가 발생할 수 있습니다.