2014-09-17 2 views
0

저는 ARM9에서 실행되는 임베디드 리눅스에서 일하고 있습니다. 파일 시스템이 ext4 유형입니다 (rw, sync, noatime, data = writeback) 비동기 사용이 가능한 WAL (Write-Ahead-Loggin) 모드로 SQLite3 데이터베이스에 쓰거나 읽는 프로세스를 구현했습니다. 전원 손실이 발생하면 DB를 동기화하고 검사 점을 지정하여 모든 데이터를 저장하는 데 약 2 초가 걸립니다. 그러나 여전히, 나는 때때로 DB가 손상되어 실제로 제 경우에 좋지 않다는 것을 알게됩니다.데이터 손상 방지

SQLite와 비슷한 방식으로 DB가 하나의 파일에 저장되는 새로운 DB 엔진을 작성하고 싶습니다. 하지만이 경우 헤더 데이터를 한 섹터에 쓰고 나머지 데이터는 적어도 두 섹터 이상 쓰기 때문에 DB 크기가 커지므로 데이터를 쓰면 헤더가 망가지는 일은 없을 것입니다. 그 방법으로, SQLite가 동작 할 때 마지막 파일 만 손상되고 모든 파일은 손상되지 않습니다.

내 접근 방식이 맞습니까?

+0

나 자신에게 DB 엔진이 과장된 것처럼 들립니다. 데이터 일관성은 SQLite를 포함한 모든 중요한 DB 시스템에서 제공되어야합니다. 사용중인 파일 시스템과 하드웨어 및 구성 (저널링, 캐시 쓰기 등)에 대해서는 자세히 언급하지 않았습니다. 어쩌면 현재 설정에서 실제 문제를 먼저 찾아야합니까? –

+0

내 질문을 업데이트했습니다 - 일부 파일 시스템 정보를 제공했습니다. 아마도 그것은 잔인한 일이지만 강력한 DB를 구축해야합니다. 차이점은 디자인에서 데이터가 손상되면 메타 데이터를 보유하는 헤더 (DB 파일 작성시 한 번만 기록됨)가 손상되지 않으므로 DB를 읽을 수 있다는 것입니다. –

+0

왜 DB 검사 점을 사용합니까? 하지마. 어쨌든, 전력 손실 중에 쓰기가 진행 중일 때 관련없는 * 섹터를 손상시키는 플래시 저장 장치를 사용하고 있다면 할 수있는 일이 많지 않습니다. –

답변

0

ping pong technique을 사용할 수 있습니다.

핑퐁 기술에서는 2 개의 개별 파일을 사용하여 하나 또는 다른 파일을 번갈아 쓸 수 있습니다. 최악의 경우 전력 손실이 발생하면 최대 1 개의 손상된 파일이 있으며 다른 하나는 안전하게 사용할 수 있습니다. 가장 좋은 경우에는 그 중 하나도 손상되어 최신 것을 계속 사용할 수 있습니다.

손상된 파일

은 쉽게 해시 기능이나 다른 CRC 제도

를 사용하는 경우 감지 분명히 후드를 작동 할 수 쓰기 캐시 또는 다른 디스크 캐싱 메커니즘에서 당신을 저장하지 않습니다이 계획.

다른 방법으로, 데이터 무결성 보호 기능을 저널링 파일 시스템을 사용하여 그것의 자신의

탁구 및 저널링 기법은 데이터 무결성을 보장주의하십시오. 데이터 손실이 여전히 발생할 수 있습니다. 데이터 무결성과 데이터 손실은 완전히 다른 두 가지입니다.

+0

문제는 DB 파일의 인덱스와 메타 데이터가 포함 된 헤더 근처에없는 섹터의 파일에 데이터를 쓰는 경우 데이터 손실이 발생해야하는 이유는 무엇입니까? 헤더에 쓰지 않기 때문에 잃을 수있는 유일한 데이터는 DB 파일에 추가 된 최신 데이터입니다. –

+0

부분 데이터에서 "올바른"데이터를 식별 할 수있는 강력한 방법이 있으면 좋습니다. 시스템이 완전히 종료되기 2 초 전까지는 블록이 디스크에 부분적으로 기록 될 수 있습니다.부분 블록을 거부해야하므로이를 탐지하는 방법이 필요합니다. –

+0

예, 파일에 쓰여지는 모든 데이터 블록이 검사 합계되고 서명이 끝에 추가됩니다. –