본문 바로가기
데이터 베이스

SQLITE_BUSY: Database is Locked 오류 해결 방법 - WAL 모드 활성화

by 코끼리_땃쥐 2024. 12. 10.

SQLite를 사용하는 환경에서 SQLITE_BUSY: database is locked 오류를 경험한 적이 있으신가요? 이 오류는 SQLite가 동시에 여러 쓰기 작업을 잘 처리하지 못하기 때문에 발생하며, 쓰기 작업 중에 읽기 작업이 차단되는 경우도 있습니다.

이 문제를 해결하는 간단하고 효과적인 방법은 Write-Ahead Logging (WAL) 모드를 활성화하는 것입니다. 이번 포스트에서는 Python과 Node.js에서 WAL 모드를 활성화하는 방법을 예제로 보여드리겠습니다.

 


 

WAL 모드란?

Write-Ahead Logging(WAL)은 SQLite의 동시성을 개선하는 모드입니다. WAL 모드를 사용하면 다음과 같은 장점이 있습니다:

  • 동시 읽기/쓰기 허용: 하나의 쓰기와 여러 개의 읽기 작업이 동시에 가능합니다.
  • 더 나은 성능: 쓰기 작업이 메인 데이터베이스 파일을 직접 수정하지 않고 별도의 WAL 파일에 기록됩니다.
  • 간단한 전환: 데이터베이스에 한 줄의 명령어만 추가하면 됩니다.

 

1. Python에서 WAL 모드 활성화

아래는 Python 스크립트를 사용하여 WAL 모드를 활성화하는 예제입니다.

import sqlite3

# 데이터베이스 연결 열기
conn = sqlite3.connect('example.db')

# WAL 모드 활성화
conn.execute('PRAGMA journal_mode=WAL;')

print("WAL 모드가 활성화되었습니다.")
conn.close()

 

작동 방식:

  1. SQLite 데이터베이스 파일에 연결합니다.
  2. PRAGMA journal_mode=WAL; 명령어를 실행하여 WAL 모드를 활성화합니다.
  3. 연결을 종료합니다.

2. Node.js에서 WAL 모드 활성화

다음은 Node.js에서 WAL 모드를 활성화하는 코드입니다.

const sqlite3 = require('sqlite3').verbose();

// 데이터베이스 연결 열기
const db = new sqlite3.Database('example.db', (err) => {
  if (err) {
    console.error("데이터베이스 열기 실패:", err.message);
  } else {
    // WAL 모드 활성화
    db.exec('PRAGMA journal_mode=WAL;', (err) => {
      if (err) {
        console.error("WAL 모드 활성화 실패:", err.message);
      } else {
        console.log("WAL 모드가 활성화되었습니다.");
      }
    });
  }
});

작동 방식:

  1. SQLite의 sqlite3 모듈을 사용하여 데이터베이스에 연결합니다.
  2. db.exec()를 사용하여 PRAGMA journal_mode=WAL; 명령어를 실행합니다.
  3. 오류를 처리하고 WAL 모드가 활성화되었음을 확인합니다.

 

WAL 모드를 활성화해야 하는 이유

  • 동시성 개선: 읽기 작업이 쓰기 작업에 의해 차단되지 않습니다.
  • 성능 향상: 쓰기 작업이 WAL 파일에 기록되므로 데이터베이스 파일을 직접 수정하지 않습니다.
  • 간편한 전환: 데이터베이스 파일에 한 번만 설정하면 지속적으로 WAL 모드가 활성화됩니다.

 

WAL 모드가 유용한 환경

  • 동시 작업: 센서 데이터 수집, 다수의 사용자 요청을 처리하는 웹 애플리케이션 등.
  • 배경 작업: 데이터를 SQLite에 저장하면서 MySQL과 같은 외부 서버로 업로드해야 하는 경우.

 

추가 팁

  • WAL 모드 지속성: 한 번 활성화하면 데이터베이스 파일에 영구적으로 적용됩니다(명시적으로 비활성화하지 않는 한).
  • SQLite 버전 확인: WAL 모드는 SQLite 3.7.0 이상에서 지원됩니다.
  • 잠금 문제 해결: WAL 모드를 사용해도 다른 애플리케이션이 SQLite 파일을 잠그는 경우 오류가 발생할 수 있습니다. 이러한 경우 접근 동기화가 필요합니다.

 


 

결론

WAL 모드를 활성화하면 SQLITE_BUSY 오류를 방지하고 SQLite의 동시성을 크게 개선할 수 있습니다. Python과 Node.js에서 제공된 예제 코드를 활용하여 WAL 모드를 손쉽게 활성화해 보세요. SQLite가 더욱 강력한 데이터베이스로 변모할 것입니다!

여러분의 프로젝트에서 WAL 모드가 어떻게 도움이 되었는지 댓글로 공유해주세요!

댓글