SQLite 내부: 파일 이름 지정
Source: Dev.to
One Database, One File
SQLite 데이터베이스는 본질적으로 하나의 파일입니다.
메타데이터가 들어 있는 디렉터리도 없고, 별도의 백그라운드 데몬이 상태를 관리하지도 않습니다.
데이터베이스는 그 파일 자체이며, 그 이상도 이하도 아닙니다.
애플리케이션이 sqlite3_open으로 데이터베이스를 열 때는 단순히 파일 이름을 전달합니다:
- 현재 작업 디렉터리를 기준으로 한 상대 경로, 혹은
- 파일 시스템 루트부터 시작하는 절대 경로.
운영 체제가 허용하는 모든 파일 이름이 유효합니다. SQLite는 자체적인 이름 규칙을 강제하지 않으며, 단 두 가지 특수한 경우만 예외입니다.
The Two Special Database Names
SQLite는 특정 “파일 이름”을 실제 경로가 아니라 신호로 취급합니다.
1. Temporary Databases (NULL or Empty Names)
sqlite3_open에 전달된 파일 이름이 다음 중 하나일 경우:
NULL포인터- 빈 문자열 (
"") - 공백 문자만으로 이루어진 문자열
SQLite는 임시 데이터베이스를 생성합니다. 내부적으로는 파일을 사용하지만 가능한 한 많은 데이터를 메모리에 보관하려고 합니다. 이러한 호출마다 각기 독립적인 임시 데이터베이스가 만들어지며, 공유나 재사용이 없습니다. 연결이 닫히면 SQLite가 자동으로 삭제하므로 이 데이터베이스는 일시적입니다.
2. In-Memory Databases (:memory:)
파일 이름이 정확히 ":memory:"인 경우, SQLite는 순수 메모리 전용 데이터베이스를 만듭니다:
- 디스크에 파일이 생성되지 않음
- 연결 간에 지속되지 않음
":memory:"를 두 번 열어도 같은 데이터베이스에 대한 두 핸들을 얻는 것이 아니라, 프로세스 주소 공간에 존재하는 완전히 독립적인 두 데이터베이스를 얻게 됩니다. 임시 데이터베이스와 마찬가지로 연결이 닫히면 사라집니다.
How SQLite Names Temporary Files
SQLite가 임시 파일을 만들 때는 이름을 무작위로 선택합니다:
- 접두사:
etilqs_ - 뒤에 16개의 무작위 영숫자 문자
- 파일 확장자 없음
컴파일 시 SQLITE_TEMP_FILE_PREFIX 매크로를 사용해 접두사를 바꿀 수 있습니다.
기본적으로 SQLite는 다음 순서대로 임시 디렉터리를 찾습니다:
/var/tmp/usr/tmp/tmp
TMPDIR 환경 변수를 설정하면 이 동작을 재정의할 수 있습니다.
임시 파일은 정상적으로 닫히면 삭제됩니다. 애플리케이션이나 시스템이 충돌하면 파일이 남아 있을 수 있는데, 이는 무해하지만 고아 파일이 됩니다.
Main and Temp Databases: Two Names You Should Know
각 SQLite 연결에는 최소 두 개의 내부 데이터베이스가 존재합니다:
main– 열었던 기본 데이터베이스 파일temp– 해당 연결에 연결된 별도 임시 데이터베이스
이들은 내부 이름이며 파일 이름이 아니라 SQL에서 의미를 가집니다. 예를 들어:
SELECT * FROM temp.table1;
위 쿼리는 메인 데이터베이스가 아니라 임시 데이터베이스의 table1을 조회합니다.
각 SQLite 라이브러리 연결은 자체적인 임시 데이터베이스를 가집니다. 두 연결이 같은 메인 데이터베이스 파일을 열더라도, 각각의 임시 데이터베이스는 완전히 격리됩니다.
임시 데이터베이스는 처음으로 임시 객체를 만들 때 디스크에 실제 파일로 구현됩니다. 예:
CREATE TEMP TABLE table1 (...);
연결이 닫히면 SQLite는 자동으로 임시 데이터베이스 파일을 삭제합니다. 임시 데이터베이스의 구조는 메인 데이터베이스와 동일한 페이지 레이아웃과 내부 조직을 가집니다. 이러한 임시 파일을 직접 이름을 바꾸거나 삭제·수정하는 것은 즉시 손상을 초래할 수 있으며, SQLite는 파일에 대한 독점적인 제어를 기대합니다.
References
- SQLite Database System: Design and Implementation. Sibsankar Haldar
- GitHub examples: