Hexter

Mac에서 SQLite 데이터베이스 파일을 보는 방법

Mac 어딘가에서, 앱의 지원 폴더에서, 백업에서, 디버깅 중인 프로젝트에서 .sqlite, .db, .sqlite3 파일을 발견했고, 그 안에 실제로 무엇이 들어 있는지 알고 싶습니다. 더블 클릭해도 쓸모 있는 일은 없습니다. Quick Look은 빈 미리보기나 깨진 텍스트를 보여줍니다. 진짜 SQLite 파일 뷰어가 필요한데, 어떤 도구를 집어야 할지 분명하지 않습니다.

그냥 보통 파일처럼 열 수 없는 이유

SQLite 데이터베이스는 텍스트가 아니라 바이너리 파일입니다. 처음 100바이트는 고정 헤더입니다. SQLite format 3으로 읽히는 매직 문자열, 그다음 페이지 크기, 텍스트 인코딩, 그리고 테이블 구조가 바뀔 때마다 변하는 스키마 쿠키 같은 필드가 이어집니다. 그 헤더 다음에는 b-트리로 구성된 실제 페이지 데이터가 오는데, 그래서 텍스트 편집기는 이를 잡음으로 렌더링합니다.

Finder의 Quick Look은 이 중 아무것도 파싱하지 않습니다. TextEdit는 이를 일반 텍스트로 해석해 대부분 읽을 수 없는 문자에 알아볼 수 있는 문자열 몇 개(테이블 이름, 열 이름, 그리고 테이블에 저장된 텍스트 데이터가 대체로 살아남는데, SQLite가 문자열을 대체로 있는 그대로 저장하기 때문입니다)가 섞인 모습을 보여줍니다. 그 어느 것도 파일이 실제로 유효한지, 어떤 페이지 크기로 만들어졌는지, 왜 다른 어떤 앱이 그것을 열기를 거부하는지 알려주지 않습니다.

속을 들여다보는 선택지

sqlite3 명령줄 도구. macOS에는 Terminal에 sqlite3이 들어 있습니다. sqlite3 yourfile.db ".schema"를 실행하면 테이블 정의를 얻고, .tables로는 간단한 목록을 얻습니다. 이미 유효한 데이터베이스라는 걸 알고 쿼리하고 싶을 때 잘 작동합니다. 애초에 파일이 유효한지 확신하지 못한다면 덜 유용한데, 손상된 헤더는 무엇이 잘못됐는지에 대한 세부 정보 없이 그저 알쏭달쏭한 오류만 내놓기 때문입니다.

DB Browser for SQLite. 실제 목적이 테이블 행을 둘러보거나, 데이터를 편집하거나, SQL 쿼리를 실행하는 것이라면 이것이 올바른 도구입니다. 무료이고, 잘 유지 관리되며, 바로 그 일을 위해 만들어졌습니다. 테이블 안의 데이터를 탐색해야 한다면, 이 글은 그만 읽고 DB Browser를 받으러 가세요.

SQLite를 인식하는 16진수 편집기. 이것은 다른 질문을 위한 선택지입니다. “테이블에 무엇이 들어 있나"가 아니라 “이 파일이 실제로 무엇인가” 말입니다. 그것이 Hexter가 채우는 빈틈입니다. 파일을 열면 기본값이 읽기 전용이라, 그저 들여다보는 것만으로는 파일을 위험에 빠뜨리지 않습니다. 분석 탭은 SQLite 헤더를 보자마자 인식해 필드(페이지 크기, 인코딩, 스키마 쿠키)를 원시 16진수 옆에 풀어놓습니다. 그래서 그 파일이 정말 SQLite인지 확인하거나, 어떤 페이지 크기로 만들어졌는지 살피거나, 깨끗한 데이터베이스를 기대하는 무언가에 넘기기 전에 헤더가 잘리거나 덮어써졌는지 짚어낼 수 있습니다.

SQLite 파일의 처음 100바이트를 헤더 필드로 나눈 다이어그램: 매직 문자열, 페이지 크기, 인코딩, 스키마 쿠키가 Hexter가 표시하는 원시 16진수 바이트 옆에 놓여 있습니다.
모든 SQLite 파일의 처음 100바이트는 고정 헤더입니다. Hexter는 이를 원시 바이트에서 직접 읽어 냅니다.

원시 바이트 뷰가 실제로 중요할 때

쿼리 결과만이 아니라 헤더를 직접 보는 것이 시간을 아껴 주는 몇 가지 상황:

  • 파일이 앱에서 열리지 않는데, 그것이 정말 SQLite인지 확신할 수 없을 때. 어떤 앱은 SQLite가 전혀 아닌 파일에 .db 확장자를 붙여 저장합니다. 처음 16바이트에 SQLite format 3 매직 문자열이 있는지 확인하면 몇 초 만에 답이 나옵니다.
  • 동기화나 백업 파이프라인을 디버깅하며 파일이 전송 중에 잘리거나 손상됐다고 의심할 때. 짧게 잘린 헤더나, 파일의 실제 크기와 맞지 않는 페이지 크기 필드는 빠른 진단 수단입니다.
  • 데이터베이스의 텍스트 인코딩(UTF-8 대 UTF-16)을 확인하고 싶을 때, 그것을 읽는 코드를 작성하기 전에, 그 하나의 질문만 하려고 전체 데이터베이스 라이브러리를 띄우지 않고 말입니다.
  • 앱의 로컬 저장소를 역공학하며 제대로 된 SQL 쿼리를 작성할 가치가 있는지 결정하기 전에 디스크에 정확히 무엇이 있는지 보고 싶을 때.

하는 방법

  1. .sqlite.db 파일을 Hexter에서 엽니다. 읽기 전용으로 열리므로, 온전히 유지해야 할 데이터베이스를 실수로 수정할 위험이 없습니다.
  2. 인스펙터 사이드바를 열고 분석 탭으로 전환합니다.
  3. Hexter가 SQLite 헤더를 자동으로 감지해, 파싱된 필드를 그것이 나온 바이트 오프셋 옆에 보여줍니다.
  4. 페이지 크기나 스키마 쿠키 같은 특정 필드를 더 자세히 봐야 한다면, 16진수 그리드에서 그 바이트를 선택하세요. 그러면 인스펙터가 숫자 해석을 곧바로 보여줍니다.

그 뒤에 실제로 필요한 것이 테이블을 쿼리하는 일이라면, 그때 sqlite3이나 DB Browser로 전환하세요. 그 일에는 그것들이 올바른 도구입니다. Hexter는 그 직전의 10초, 지금 보고 있는 것이 무엇인지 알아야 하는 그 순간을 위한 도구입니다.

Hexter는 바로 이런 종류의 파일 검사를 기본적으로 안전하게 만들기 위해 제작된 네이티브 macOS 16진수 편집기입니다. 편집을 명시적으로 켜기 전까지는 읽기 전용이며, SQLite, PNG, ZIP, Mach-O, WAV 파일에 대한 내장 구조 파싱을 갖추고 있습니다.