저는 ARM9에서 실행되는 임베디드 리눅스에서 일하고 있습니다. 파일 시스템이 ext4 유형입니다 (rw, sync, noatime, data = writeback) 비동기 사용이 가능한 WAL (Write-Ahead-Loggin) 모드로 SQLite3 데이터베이스에 쓰거나 읽는 프로세스를 구현했습니다. 전원 손실이 발생하면 DB를 동기화하고 검사 점을 지정하여 모든 데이터를 저장하는 데 약 2 초가 걸립니다. 그러나 여전히, 나는 때때로 DB가 손상되어 실제로 제 경우에 좋지 않다는 것을 알게됩니다.데이터 손상 방지
SQLite와 비슷한 방식으로 DB가 하나의 파일에 저장되는 새로운 DB 엔진을 작성하고 싶습니다. 하지만이 경우 헤더 데이터를 한 섹터에 쓰고 나머지 데이터는 적어도 두 섹터 이상 쓰기 때문에 DB 크기가 커지므로 데이터를 쓰면 헤더가 망가지는 일은 없을 것입니다. 그 방법으로, SQLite가 동작 할 때 마지막 파일 만 손상되고 모든 파일은 손상되지 않습니다.
내 접근 방식이 맞습니까?
나 자신에게 DB 엔진이 과장된 것처럼 들립니다. 데이터 일관성은 SQLite를 포함한 모든 중요한 DB 시스템에서 제공되어야합니다. 사용중인 파일 시스템과 하드웨어 및 구성 (저널링, 캐시 쓰기 등)에 대해서는 자세히 언급하지 않았습니다. 어쩌면 현재 설정에서 실제 문제를 먼저 찾아야합니까? –
내 질문을 업데이트했습니다 - 일부 파일 시스템 정보를 제공했습니다. 아마도 그것은 잔인한 일이지만 강력한 DB를 구축해야합니다. 차이점은 디자인에서 데이터가 손상되면 메타 데이터를 보유하는 헤더 (DB 파일 작성시 한 번만 기록됨)가 손상되지 않으므로 DB를 읽을 수 있다는 것입니다. –
왜 DB 검사 점을 사용합니까? 하지마. 어쨌든, 전력 손실 중에 쓰기가 진행 중일 때 관련없는 * 섹터를 손상시키는 플래시 저장 장치를 사용하고 있다면 할 수있는 일이 많지 않습니다. –