SQL Linux의 fsync 및 버퍼된 IO (버퍼된 쓰기중 오류가 발생하였을때 파일은 유효할까?)
· Version : SQL Server Linux
PostgreSQL에서 fsync() 오류처리는 안전하지 않으며 XFS에서 데이터 손실이 발생할 수 있다는 내용이 있다.
· PostgreSQL's handling of fsync() errors is unsafe and risks data loss at least on XFS : https://www.postgresql.org/message-id/flat/CAMsr%2BYE5Gs9iPqw2mQ6OHt1aC5Qk5EuBFCyG%2BvzHun1EqMxyQg%40mail.gmail.com#CAMsr+YE5Gs9iPqw2mQ6OHt1aC5Qk5EuBFCyG+vzHun1EqMxyQg@mail.gmail.com
이번 포스트는 SQL Server에서도 Linux 동일한 문제가 발생하는지 유효성을 검증하는 내용으로, SQL Server의 경우 O_DIRECT를 사용하기 때문에 PostgreSQL과 같은 문제가 발생하지 않는다.
· Direct I/O : https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/global_file_system/s1-manage-direct-io
응용 프로그램이 버퍼된 쓰기를 수행하고 성공을 수신한다. (이는 안정된 미디어 파일 시스템 캐시에 데이터를 저장할 수 있음을 의미한다.) fsync/fdatasync는 데이터가 안정적인 미디어에 저장되도록 하는데 사용된다. 안정적인 미디어 쓰기는 동기화 작업중에 발생하며 EIO 오류를 보고하는 여러가지 이유로 (디스크 공간부족, SAN 연결 끊김 등) 실패할 수 있다.
· fsync/fdatasync : http://man7.org/linux/man-pages/man2/fdatasync.2.html
위의 PostgreSQL링크에 설명된 문제는 동기화에서 오류를 반환하지만 캐시된 페이지의 상태를 지울수 있다는 것이다. 다음 동기화는 캐시된 쓰기가 안정적인 미디어로 플러시 되지 않지만 응용 프로그램에 알려졌다는 것을 의미하는 ESUCCESS를 반환한다.
데이터베이스 응용프로그램이 백업 파일을 열어 파일 시스템 캐싱 (~_O_DIRECT)을 허용한다고 가장헌다. SQL Server는 이 작업을 수행하지 않으며 실제로 Linux의 SQL Server에서 이 작업을 수행할 수 없도록 했다.
1. 버퍼링된 I/O를 사용하여 백업이 시작된다.
2. 백업이 진행되면서 파일 시스템 캐시에 쓰기가 발생한다.
3. 파일 시스템 캐시 쓰기가 발생하는 동안 동기화에 대한 외부 호출이 발생한다.
4. 백업에 속한 버퍼에서 동기화쓰기 오류가 발생한다. 데이터베이스 응용프로그램 외부의 응용 프로그램에서 동기화를 호출하여 데이터베이스 응용프로그램이 실패를 인식하지 못한다.
5. 백업이 끝나면 데이터베이스 응용 프로그램에서 fdatasync를 실행하고 EIO를 반호나하는 대신 ESUCCESS가 반환된다.
6. fdatasync가 성공적으로 완료되면 미디어 백업이 안정적으로 강화되고 데이터베이스 응용 프로그램이 트랜잭션 로그의 비활성 부분을 자른다.
7. 데이터베이스에 더 이상 트랜잭션 조작 또는 복구를 수행 할 적절한 로그 레코드가 없고, 일단 유효하다고 생각된 백업파일이 유효하지 않는다.
이 문제는 SQL Server 데이터베이스, 로그 및 백업파일에 영향을 미치지 않는다. SQL Server는 파일 시스템 캐시를 무시하기 위해 O_DIRECT를 사용하여 이러한 파일 형식을 연다. Linux의 SQL Server가 강제 플러시 모드에서 실행 중인 경우에도 파일은 O_Direct로 열리므로 문제가 발생하지 않는다.
[참고자료]
· SQL Server Linux: fsync and Buffered I/O : https://blogs.msdn.microsoft.com/bobsql/2018/12/18/sql-server-linux-fsync-and-buffered-i-o/
2019-09-16 / Sungwook Kang / http://sungwookkang.com
SQL Server, SQL Linux, File System, Windows, Linux, fsync, fdatasync, O_Direct
'SQL Server > SQL Server Tip' 카테고리의 다른 글
SQL Server Login Timeout 디버깅 (0) | 2019.09.19 |
---|---|
SQL Server Worker Thread 기본 계산 (0) | 2019.09.18 |
SQL Server와 SQL Linux에서 인스턴스 파일 초기화 차이점 (0) | 2019.09.14 |
BCP 실행시 동일 세션에서 여러개의 BULK INSERT 문으로 표시되는 이유 (0) | 2019.09.13 |
삭제된 AD 그룹 계정으로 SQL Server 로그인 사례 (로그인 그룹 삭제 후 조치해야할 사항) (1) | 2019.09.12 |