PlanetScale 分支操作 #
数据库分支是 PlanetScale 最具创新性的功能之一,本章将详细介绍如何使用分支进行开发和 Schema 变更。
分支概念回顾 #
分支类型 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分支类型对比 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 生产分支(Production Branch) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 特点: │ │
│ │ ├── 通常命名为 main │ │
│ │ ├── 包含真实生产数据 │ │
│ │ ├── 受保护,不能直接修改 Schema │ │
│ │ ├── 可以创建连接密码 │ │
│ │ └── 应用连接此分支 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 开发分支(Development Branch) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 特点: │ │
│ │ ├── 从生产分支创建 │ │
│ │ ├── Schema 可以自由修改 │ │
│ │ ├── 不包含生产数据 │ │
│ │ ├── 用于开发和测试 │ │
│ │ └── 变更通过 Deploy Request 合并 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
分支关系 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分支层级结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ main (生产) │
│ ┌─────┐ │
│ │ │ │
│ └──┬──┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ develop │ │ feature │ │ hotfix │ │
│ │ (开发) │ │ (功能) │ │ (修复) │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ │ test │ │ exp │ │
│ │ (测试) │ │ (实验) │ │
│ └─────────┘ └─────────┘ │
│ │
│ 注意:开发分支只能从 main 创建 │
│ │
└─────────────────────────────────────────────────────────────┘
创建分支 #
通过 Web 控制台创建 #
text
┌─────────────────────────────────────────────────────────────┐
│ 创建分支界面 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Create a branch │
│ │
│ Branch name │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ add-user-phone-field │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Parent branch │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ main ▼ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Region (optional) │
│ ○ Same as parent (recommended) │
│ ○ Different region │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Create branch │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
通过 CLI 创建 #
bash
# 基本创建
pscale branch create my-database develop
# 从指定父分支创建
pscale branch create my-database feature-x --from main
# 指定区域
pscale branch create my-database develop --region us-east-1
# 查看创建状态
pscale branch show my-database develop
输出示例:
text
NAME PARENT READY CREATED AT
develop main false 2024-01-15 12:00:00
分支命名建议 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分支命名规范 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 功能开发: │
│ ├── feature/add-user-phone │
│ ├── feature/new-auth-system │
│ └── feature/order-status │
│ │
│ Bug 修复: │
│ ├── fix/login-error │
│ ├── hotfix/security-patch │
│ └── bugfix/null-pointer │
│ │
│ 重构: │
│ ├── refactor/user-table │
│ └── refactor/indexes │
│ │
│ 实验: │
│ ├── exp/new-index-strategy │
│ └── exp/partition-test │
│ │
│ 环境: │
│ ├── develop │
│ ├── staging │
│ └── preview │
│ │
└─────────────────────────────────────────────────────────────┘
分支操作 #
查看分支 #
bash
# 列出所有分支
pscale branch list my-database
# 输出示例
NAME PARENT READY CREATED AT
main - true 2024-01-10 10:00:00
develop main true 2024-01-15 12:00:00
feature-auth main true 2024-01-16 09:00:00
# 查看分支详情
pscale branch show my-database develop
# 查看 Schema
pscale branch schema my-database develop
连接分支 #
bash
# 使用 Shell 连接
pscale shell my-database develop
# 使用代理连接
pscale connect my-database develop
# 指定本地端口
pscale connect my-database develop --port 3307
删除分支 #
bash
# 删除分支
pscale branch delete my-database develop
# 确认提示
# Are you sure you want to delete branch "develop"? [y/N] y
# 强制删除
pscale branch delete my-database develop --force
Schema 变更 #
在开发分支修改 Schema #
bash
# 连接到开发分支
pscale shell my-database develop
# 执行 DDL 语句
mysql> ALTER TABLE users ADD COLUMN phone VARCHAR(20);
mysql> CREATE INDEX idx_email ON users(email);
mysql> DROP TABLE old_table;
# 验证变更
mysql> DESCRIBE users;
Schema 变更示例 #
sql
-- 添加列
ALTER TABLE users
ADD COLUMN phone VARCHAR(20),
ADD COLUMN address TEXT;
-- 修改列
ALTER TABLE users
MODIFY COLUMN name VARCHAR(200);
-- 添加索引
CREATE INDEX idx_created_at ON users(created_at);
CREATE UNIQUE INDEX idx_email ON users(email);
-- 创建新表
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
total DECIMAL(10, 2),
status ENUM('pending', 'paid', 'shipped', 'completed'),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user (user_id)
);
-- 删除列
ALTER TABLE users DROP COLUMN deprecated_field;
Schema 变更限制 #
text
┌─────────────────────────────────────────────────────────────┐
│ 变更限制 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 支持的操作: │
│ ✅ ADD COLUMN │
│ ✅ DROP COLUMN │
│ ✅ MODIFY COLUMN │
│ ✅ ADD INDEX │
│ ✅ DROP INDEX │
│ ✅ CREATE TABLE │
│ ✅ DROP TABLE │
│ ✅ RENAME TABLE │
│ │
│ 不支持的操作: │
│ ❌ 添加外键约束 │
│ ❌ 添加触发器 │
│ ❌ 添加存储过程 │
│ ❌ 修改主键(需要特殊处理) │
│ │
│ 注意事项: │
│ - 删除列会永久丢失数据 │
│ - 修改列类型可能导致数据丢失 │
│ - 大表变更需要更多时间 │
│ │
└─────────────────────────────────────────────────────────────┘
Schema 对比 #
查看差异 #
bash
# 对比两个分支的 Schema
pscale branch diff my-database develop main
# 输出示例
# --- main
# +++ develop
# @@ -1,5 +1,6 @@
# CREATE TABLE users (
# id INT AUTO_INCREMENT PRIMARY KEY,
# name VARCHAR(100) NOT NULL,
# email VARCHAR(255) UNIQUE NOT NULL,
# + phone VARCHAR(20),
# created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
# );
Web 控制台对比 #
text
┌─────────────────────────────────────────────────────────────┐
│ Schema 对比视图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Comparing: develop → main │
│ │
│ users table │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ - main │ + develop │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ CREATE TABLE users ( │ CREATE TABLE users ( │ │
│ │ id INT PRIMARY KEY, │ id INT PRIMARY KEY, │ │
│ │ name VARCHAR(100), │ name VARCHAR(100), │ │
│ │ email VARCHAR(255) │ email VARCHAR(255), │ │
│ │ │ + phone VARCHAR(20), │ │
│ │ created_at TIMESTAMP │ created_at TIMESTAMP│ │
│ │ ); │ ); │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Changes summary: │
│ - 1 table modified │
│ - 1 column added │
│ │
└─────────────────────────────────────────────────────────────┘
Deploy Request #
创建部署请求 #
bash
# 创建 Deploy Request
pscale deploy-request create my-database develop
# 输出示例
# Deploy request #1 created successfully
# View at: https://app.planetscale.com/my-org/my-database/deploy-requests/1
Deploy Request 流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ Deploy Request 流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 创建 Deploy Request │
│ ┌─────────────┐ │
│ │ develop │ │
│ └──────┬──────┘ │
│ │ │
│ │ pscale deploy-request create │
│ ▼ │
│ ┌─────────────┐ │
│ │ DR #1 │ │
│ │ (待审核) │ │
│ └─────────────┘ │
│ │
│ 2. 审核变更 │
│ - 查看 Schema 差异 │
│ - 检查是否有冲突 │
│ - 团队成员审批 │
│ │
│ 3. 部署变更 │
│ ┌─────────────┐ │
│ │ DR #1 │ │
│ │ (部署中) │ │
│ └──────┬──────┘ │
│ │ │
│ │ 自动应用 │
│ ▼ │
│ ┌─────────────┐ │
│ │ main │ ← Schema 已更新 │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
管理 Deploy Request #
bash
# 列出所有 Deploy Request
pscale deploy-request list my-database
# 查看详情
pscale deploy-request show my-database 1
# 查看变更
pscale deploy-request diff my-database 1
# 部署(需要权限)
pscale deploy-request deploy my-database 1
# 取消
pscale deploy-request close my-database 1
Deploy Request 状态 #
text
┌─────────────────────────────────────────────────────────────┐
│ 状态说明 │
├─────────────────────────────────────────────────────────────┤
│ │
│ pending_review - 等待审核 │
│ approved - 已批准,等待部署 │
│ in_progress - 部署进行中 │
│ complete - 部署完成 │
│ closed - 已关闭(取消或拒绝) │
│ error - 部署错误 │
│ │
│ 状态流转: │
│ │
│ pending_review ──> approved ──> in_progress ──> complete │
│ │ │ │
│ └────────────────┴──> closed │
│ │
└─────────────────────────────────────────────────────────────┘
分支数据管理 #
数据同步 #
text
┌─────────────────────────────────────────────────────────────┐
│ 数据说明 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 重要:开发分支不包含生产数据! │
│ │
│ 创建分支时: │
│ ├── Schema 从父分支复制 │
│ ├── 数据不会复制 │
│ └── 分支是空的 │
│ │
│ 添加测试数据: │
│ ├── 手动 INSERT │
│ ├── 使用数据导入功能 │
│ └── 使用种子数据脚本 │
│ │
└─────────────────────────────────────────────────────────────┘
添加测试数据 #
bash
# 连接到开发分支
pscale shell my-database develop
# 插入测试数据
mysql> INSERT INTO users (name, email) VALUES
-> ('Test User 1', 'test1@example.com'),
-> ('Test User 2', 'test2@example.com'),
-> ('Test User 3', 'test3@example.com');
# 验证数据
mysql> SELECT * FROM users;
数据导入 #
bash
# 从文件导入
pscale database restore-dump my-database develop --dir ./data-dump
# 从生产分支复制数据(付费功能)
# 需要联系支持
分支策略 #
推荐工作流 #
text
┌─────────────────────────────────────────────────────────────┐
│ Git 风格工作流 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 功能开发 │
│ main ──> feature/xxx ──> Deploy Request ──> main │
│ │
│ 2. 紧急修复 │
│ main ──> hotfix/xxx ──> Deploy Request ──> main │
│ │
│ 3. 长期开发 │
│ main ──> develop ──> feature/xxx │
│ └──> Deploy Request ──> main │
│ │
│ 最佳实践: │
│ ├── 每个 Schema 变更创建独立分支 │
│ ├── 分支命名清晰描述变更内容 │
│ ├── 变更完成后及时合并 │
│ ├── 合并后删除开发分支 │
│ └── 保持分支数量精简 │
│ │
└─────────────────────────────────────────────────────────────┘
团队协作 #
text
┌─────────────────────────────────────────────────────────────┐
│ 团队协作流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 开发者 A: │
│ 1. 创建分支 feature/add-users-table │
│ 2. 执行 Schema 变更 │
│ 3. 创建 Deploy Request │
│ │
│ 开发者 B: │
│ 1. 审核 Deploy Request │
│ 2. 检查 Schema 差异 │
│ 3. 批准或提出修改意见 │
│ │
│ 开发者 A: │
│ 1. 根据反馈修改 │
│ 2. 部署变更 │
│ 3. 删除开发分支 │
│ │
└─────────────────────────────────────────────────────────────┘
常见问题 #
分支创建失败 #
text
问题:分支创建卡在 creating 状态
原因:
- 达到分支数量限制
- 资源不足
解决:
1. 检查分支数量限制
2. 删除不需要的分支
3. 升级计划
Schema 变更冲突 #
text
问题:Deploy Request 显示冲突
原因:
- 多个分支修改同一表
- 父分支已有新变更
解决:
1. 从最新的 main 重新创建分支
2. 重新应用变更
3. 创建新的 Deploy Request
变更部署失败 #
text
问题:Deploy Request 部署失败
原因:
- Schema 变更不兼容
- 数据类型转换问题
- 系统错误
解决:
1. 检查错误信息
2. 修改 Schema 变更
3. 重新创建 Deploy Request
4. 联系支持
下一步 #
现在你已经掌握了分支操作,接下来学习 Schema 变更,深入了解非阻塞 DDL 的工作原理!
最后更新:2026-03-29