데이터베이스 내보내기 및 재구축

CloudflareBeginner
지금 연습하기

소개

백업은 애플리케이션 데이터를 복구할 수 있을 때만 유용합니다. 이 실습에서는 작은 D1 데이터베이스를 SQL 로 내보내고, 내보낸 파일에서 두 번째 임시 데이터베이스를 재구축합니다. 그런 다음 원본을 변경하지 않은 상태로 데이터와 제약 조건을 비교합니다.

이 실습은 두 개의 합성 티켓으로 독립적으로 시작하며, D1 데이터베이스는 최대 두 개만 사용합니다. 백업 파일은 LabEx VM 에 보관하며, 이 작업 흐름에는 오브젝트 스토리지 계정이나 버킷이 필요하지 않습니다.

자신의 학습 계정과 새 VM 을 사용합니다. 먼저 설정 과정에서 Node.js 22.22.0 을 준비한 다음 /home/labex/project/ticket-database에서 프로젝트 로컬 Wrangler 4.131.1 과 평가에 필요한 의존성을 설치하기 위해 npm install을 실행합니다. 직접 의존성 버전은 고정되어 있으며, 설치 과정에서 자체 lockfile 이 생성됩니다. 설정 과정에서는 클라우드 로그인이나 평가 대상 데이터베이스 작업을 수행하지 않습니다. 개인 컴퓨터에서는 프로젝트에서 npm install --save-dev wrangler@4.131.1을 실행해 동일한 Wrangler 버전을 설치합니다.

이 실습에서는 D1 Free 허용량 범위 내의 작은 합성 레코드를 사용합니다. 기존 계정 사용량도 해당 허용량에 포함됩니다. 구매한 도메인은 필요하지 않습니다. 리소스 삭제와 로그아웃을 모두 확인할 때까지 이 VM 을 유지합니다.

이 VM 을 인증하고 계정 선택하기

이 단계에서는 새 터미널을 자신의 학습 계정에 연결합니다. Dashboard 에 로그인하는 것만으로는 VM 이 인증되지 않습니다. D1 권한이 있어야 데이터베이스 생성, SQL 변경 및 삭제를 수행할 수 있습니다. 인증하기 전에 Background Access 를 포함한 실제 동의 화면을 확인합니다.

준비된 프로젝트로 이동하고 고정된 CLI 버전을 확인합니다.

cd /home/labex/project/ticket-database
npx wrangler --version

4.131.1이 출력되어야 합니다. 디바이스 인증을 시작합니다. --device는 브라우저 코드를 표시하고, --browser=false는 브라우저를 직접 선택할 수 있게 합니다.

npx wrangler login --device --browser=false --scopes account:read user:read d1:write

브라우저에서 표시된 URL 을 열고 현재 코드를 입력합니다. 학습 계정과 권한을 확인한 후 인증합니다. 터미널에서 성공을 확인할 때까지 기다립니다. 비밀번호나 토큰을 프로젝트 파일에 붙여 넣지 마세요.

npx wrangler whoami --json

loggedIn: true인지 확인한 다음, 계정이 하나만 표시되더라도 계정의 nameid를 읽습니다. 사용할 계정의 ID 를 복사해 아래 설정에 입력합니다. 다음 셸 변수는 충돌을 방지하기 위해 임의의 6 바이트 (16 진수 12 자) 를 사용합니다. here-document 는 JSON 줄 사이의 JSON 을 작성하며, 내부에서 $RUN이 확장됩니다.

$schema 앞의 백슬래시는 이 JSON 키를 그대로 유지하며, $RUN 은 이번 실행의 고유 이름으로 확장됩니다.

RUN=labex-c04-d06-$(openssl rand -hex 6)
cat > wrangler.jsonc <<JSON
{
  "\$schema": "./node_modules/wrangler/config-schema.json",
  "name": "$RUN",
  "account_id": "YOUR_ACCOUNT_ID",
  "main": "src/index.js",
  "compatibility_date": "2026-09-15",
  "workers_dev": true,
  "preview_urls": false
}
JSON

블록을 실행하기 전에 YOUR_ACCOUNT_ID를 실제 계정 ID 로 바꿉니다. RUN을 계속 사용할 수 있도록 이 터미널을 열어 둡니다. name은 이번 실행을 식별하고, account_id는 클라우드 작업에 사용할 계정을 선택합니다. 이 파일은 일반 JSON 이며 유효한 JSONC 이기도 합니다. 이 파일을 작성한다고 해서 Worker 가 배포되지는 않습니다.

보존할 데이터베이스 준비하기

이 단계에서는 작은 원본 데이터베이스를 생성합니다. 설정 과정에서 티켓 스키마를 제공합니다. 여러분이 할 일은 원본을 변경하지 않고 제약 조건을 포함해 데이터베이스를 내보내고 재구축하는 것입니다.

임시 클라우드 데이터베이스를 생성합니다. --binding DB는 애플리케이션 코드에서 사용할 짧은 이름을 지정하고, --update-config는 실제 이름과 UUID 를 wrangler.jsonc에 기록하며, --use-remote=false는 개발 작업을 로컬로 유지합니다.

npx wrangler d1 create "$RUN-db" --binding DB --update-config --use-remote=false

생성된 이름과 ID 를 읽은 다음 저장된 바인딩을 확인합니다.

cat wrangler.jsonc

DB 항목에 이번 실행에서 생성한 데이터베이스가 지정되어 있어야 합니다. 바인딩은 코드와 리소스를 연결하도록 설정된 연결 정보입니다. UUID 는 클라우드 데이터베이스를 식별하고, --local을 사용하면 이 VM 의 별도 SQLite 데이터베이스를 사용합니다. SQL 명령에는 항상 --local 또는 --remote 중 하나를 명시합니다.

cat schema.sql
npx wrangler d1 execute DB --remote --file schema.sql

내보내기 전에 원본 데이터와 스키마를 확인합니다.

npx wrangler d1 execute DB --remote --command "SELECT id, subject, status, source FROM tickets ORDER BY id; SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'tickets';"

티켓은 두 개입니다. 다음 내용을 기록합니다. ID 1 은 Cannot sign in이며 상태는 open 입니다. ID 2 는 Invoice copy이며 상태는 closed 입니다. 두 티켓의 source 는 모두 seed입니다. 스키마에는 기본 키, 필수 값 및 상태 제약 조건이 포함되어 있습니다.

완전한 SQL 백업 내보내기

이 단계에서는 이식 가능한 SQL 파일을 생성합니다. 내보내기는 테이블 정의와 데이터를 SQL 로 기록한 것입니다. 이 파일을 가져오면 다른 위치에서 데이터베이스를 재구축할 수 있습니다. 이는 데이터베이스의 기존 위치에서 기록을 복원하는 D1 Time Travel 과는 다릅니다.

--remote는 클라우드 원본을 선택하고, --output은 이 VM 에 작성할 파일 이름을 지정합니다. --no-schema--no-data를 생략해 스키마와 데이터를 모두 포함합니다.

npx wrangler d1 export DB --remote --output backup.sql

프롬프트가 표시되면 정확한 원본 데이터베이스를 확인합니다. 생성된 작은 백업 파일을 확인합니다.

cat backup.sql

CREATE TABLE과 티켓의 INSERT 문을 찾습니다. 내보내기 형식, 열 인용 방식 및 내부 문은 직접 작성한 원본 SQL 과 다를 수 있습니다. 다운로드가 성공했다는 사실만으로는 복구 가능성을 증명할 수 없습니다. 다음 단계에서 이 파일로 데이터베이스를 재구축해 백업 결과를 검증합니다. 이 파일에는 합성 데이터만 포함되어 있습니다. 파일은 VM 에 보관하며 R2 버킷은 필요하지 않습니다.

별도의 데이터베이스 재구축하기

이 단계에서는 두 번째 빈 데이터베이스로 복원하고 원본은 변경하지 않습니다. 별도의 대상 데이터베이스를 사용하면 애플리케이션 바인딩을 변경하기 전에 복구된 데이터를 비교할 수 있습니다.

REBUILT 바인딩으로 두 번째 리소스를 생성합니다. 설정을 업데이트하면 DB와 함께 두 번째 바인딩이 추가됩니다.

npx wrangler d1 create "$RUN-copy" --binding REBUILT --update-config --use-remote=false
cat wrangler.jsonc

두 바인딩의 데이터베이스 UUID 가 서로 다르고 이름에 예상한 -db-copy가 포함되어 있는지 확인합니다. REBUILT에만 가져옵니다.

npx wrangler d1 execute REBUILT --remote --file backup.sql

이 명령은 새 클라우드 대상에 내보낸 SQL 을 실행합니다. 프롬프트가 표시되면 해당 대상을 확인합니다. 대상 데이터베이스를 조회합니다.

npx wrangler d1 execute REBUILT --remote --command "SELECT id, subject, status, source FROM tickets ORDER BY id; PRAGMA table_info(tickets);"

행과 열 정의가 원본과 일치해야 합니다. 잘못된 INSERT 를 실행해 복원된 제약 조건 중 하나를 테스트합니다.

npx wrangler d1 execute REBUILT --remote --command "INSERT INTO tickets (id, subject, status, source) VALUES (3, 'Invalid', 'lost', 'probe');"

CHECK constraint failed가 출력되어야 합니다. 의도적인 실패로 세 번째 행이 추가되어서는 안 됩니다. 두 데이터베이스를 다시 읽습니다.

npx wrangler d1 execute DB --remote --command "SELECT id, subject, status, source FROM tickets ORDER BY id;"
npx wrangler d1 execute REBUILT --remote --command "SELECT id, subject, status, source FROM tickets ORDER BY id;"

두 데이터베이스 모두 원래의 두 행만 정확히 포함해야 합니다. Dashboard 에서 두 리소스의 정확한 이름을 열어 읽기 전용 확인을 진행합니다. 재구축된 테이블을 확인하기 전에 두 리소스의 ID 가 서로 다른지 검증합니다. 복구를 테스트하기 위해 다른 데이터베이스를 절대 덮어쓰지 마세요.

별도 D1 데이터베이스에 복원된 티켓

이 예시는 -copy 데이터베이스에 복원된 티켓 두 개를 보여 줍니다. 생성된 이름은 이 예시 실행을 식별하므로 실제 리소스 이름과 UUID 는 다릅니다. 스크린샷은 표시된 행만 확인합니다. 위의 CLI 내보내기 및 가져오기 명령과 독립 검사는 재구축, 일치하는 스키마, 유지된 제약 조건을 검증합니다.

임시 리소스 삭제하기

이 단계에서는 VM 이 아직 인증된 상태에서 이 실습의 리소스만 삭제합니다. 먼저 모든 기능 확인을 완료합니다. 삭제 확인이 끝날 때까지 설정 파일을 유지합니다.

npx wrangler d1 delete REBUILT
npx wrangler d1 delete DB

프롬프트를 확인하고 이번 실행에서 생성한 데이터베이스만 삭제하는지 확인합니다. 그런 다음 데이터베이스 목록을 표시합니다.

npx wrangler d1 list --json

성공적인 응답에 기록해 둔 두 데이터베이스 이름과 UUID 가 모두 없어야 합니다. 다른 리소스는 남아 있을 수 있습니다. 인증 또는 네트워크 오류가 발생하면 삭제 여부를 판단할 수 없습니다. 액세스 문제를 해결한 다음 계속하기 전에 조회를 다시 실행합니다. 로그인 상태를 유지한 채 이 단계의 확인을 수행합니다.

이 VM 의 인증 종료하기

이 단계에서는 독립적인 삭제 확인이 통과한 후에만 인증을 종료합니다. 로그아웃하면 이 VM 에 저장된 Wrangler 인증 정보가 삭제됩니다. VM 을 닫는 것만으로는 클라우드 리소스가 정리되지 않습니다.

npx wrangler logout
npx wrangler whoami --json

loggedIn: false가 출력되어야 합니다. 인증되지 않은 이 조회 명령은 0 이 아닌 종료 코드를 반환할 수 있습니다. 구조화된 응답에 로그아웃 상태가 명시된 경우에만 이를 정상적인 결과로 간주합니다. 확인을 완료한 다음 실습 환경을 종료합니다.

요약

데이터베이스를 내보내고 재구축하는 방법을 실습했습니다. 데이터베이스에서 확인할 수 있는 결과를 검증하고, 선택한 계정과 로컬 상태를 명시적으로 관리했으며, 로그아웃하기 전에 임시 리소스를 삭제했습니다.