介绍
备份只有能够恢复应用数据时才有用。你将把一个小型 D1 数据库导出为 SQL,从导出文件重建第二个临时数据库,并在不改变原始数据库的前提下比较数据和约束。
本实验使用两个合成工单独立开始,最多使用两个 D1 数据库。备份文件保留在 LabEx 虚拟机中;整个流程不需要对象存储账户或存储桶。
请使用你自己的学习账户和全新的虚拟机。设置过程会先准备 Node.js 22.22.0,然后在 /home/labex/project/ticket-database 下运行 npm install,安装项目本地的 Wrangler 4.131.1 以及评估所需的依赖。直接依赖的版本已固定;安装过程会创建自己的锁定文件。设置阶段不会登录云端,也不会操作用于评估的数据库。如果你在个人计算机上操作,请在项目中运行 npm install --save-dev wrangler@4.131.1,安装相同版本的 Wrangler。
本练习使用符合 D1 免费额度 的少量合成记录。账户中已有的用量也会计入这些额度。你不需要购买域名。在确认资源已删除并完成注销之前,请保留此虚拟机。
授权此虚拟机并选择账户
在此步骤中,将这个全新的终端连接到你自己的学习账户。仅登录 Dashboard 不会授权此虚拟机。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,然后读取账户的 name 和 id,即使列表中只有一个账户也要读取。将要使用的账户 ID 复制到下面的配置中。下面的 Shell 变量使用 6 个随机字节(12 个十六进制字符),以避免与其他学习者的资源名称冲突。Here-document 会将 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 使用此虚拟机中的独立 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 指定在此虚拟机中写入的文件。不要使用 --no-schema 和 --no-data,这样可以同时保留架构和数据:
npx wrangler d1 export DB --remote --output backup.sql
如果出现提示,请确认准确的源数据库。查看导出的小型文件:
cat backup.sql
查找 CREATE TABLE 和工单的 INSERT 语句。导出的格式、列引用方式和内部语句可能与原始手写 SQL 不同。仅成功下载并不能证明备份可恢复;下一步会通过重建数据库来测试这个文件。该文件只包含合成数据。将文件保留在虚拟机中;不需要 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);"
行数据和列定义必须与原始数据库一致。使用一条无效的插入语句测试恢复的约束:
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 不同。测试恢复时,绝不要覆盖其他数据库。

此示例显示 -copy 数据库中恢复的两条工单。生成的名称标识本次示例运行,你的资源名称和 UUID 会不同。截图仅确认可见的数据行。上方 CLI 导出和导入命令以及独立检查验证了重建过程、匹配的表结构和保留的约束。
删除临时资源
在此步骤中,在虚拟机仍处于授权状态时,只删除本实验创建的资源。先完成所有功能检查。在完成删除验证前,请保留配置文件。
npx wrangler d1 delete REBUILT
npx wrangler d1 delete DB
查看提示内容,确认其中只有本次运行创建的数据库。然后列出数据库:
npx wrangler d1 list --json
成功响应中必须不再出现记录的两个数据库名称和 UUID。其他资源可以保留。身份验证错误或网络错误无法作为结论:解决访问问题后,重新执行读取操作,再继续后续步骤。仍处于登录状态时,完成此步骤的验证。
结束此虚拟机的授权
在独立的删除检查通过后,才执行此步骤中的授权注销。注销会移除此虚拟机中保存的 Wrangler 授权信息;仅关闭虚拟机并不能完成云端清理。
npx wrangler logout
npx wrangler whoami --json
预期结果为 loggedIn: false。未授权的查询可能以非零状态退出;只有在结构化响应明确表示你已注销时,这种结果才符合预期。完成验证后,关闭实验环境。
总结
你练习了导出并重建数据库,检查了可观察到的数据库结果,明确保留了所选账户和本地状态,并在注销前删除了临时资源。



