Git for Data¶
Git for Data 将常见的版本管理概念——快照、分支、差异对比、选择性应用和合并——通过 SQL 直接作用于数据库表和数据。它支持具名恢复点、时间点恢复、隔离的数据实验、行级变更审查、选择性发布以及可审计的合并工作流,无需将数据导出到外部工具。
核心概念¶
Git for Data 将数据库数据视为可版本化的对象。无需在每次实验、迁移或发布前将数据复制到独立的版本管理系统中,直接通过 SQL 命令即可完成与 Git 类似的操作:
Git 概念 |
Git for Data 等效操作 |
功能说明 |
|---|---|---|
|
在集群、账号、数据库或表级别创建具名恢复点。 |
|
|
PITR + 时间旅行 |
在可配置的保留窗口内,查询或恢复任意历史时刻的数据。 |
|
从当前状态或具名快照创建表或数据库分支。分支保留谱系信息,系统知晓其与源数据的关系。 |
|
|
逐行比较两个表,显示所有 |
|
|
按主键选择性应用特定行,或应用两个快照之间的所有变更,无需合并完整差异集。 |
|
|
将分支变更应用到目标表,支持 |
|
|
删除不再需要的分支表或分支数据库。 |
上述所有操作均通过标准 SQL 执行,并受细粒度权限控制约束。无需外部工具、文件导出或独立的版本管理仓库。
快照、时间旅行与 PITR——如何选择¶
这三项能力分别满足不同的恢复和历史需求。下表帮助您做出选择:
能力 |
适用场景 |
工作原理 |
保留策略 |
|---|---|---|---|
快照 |
变更前基线、发布关卡、手动检查点 |
|
持久保留,直到显式删除。 |
时间旅行 |
临时历史查询、调试过去状态 |
|
受快照生命周期和 PITR 窗口限制。 |
PITR |
持续保护、灾难恢复、合规要求 |
|
由 |
可以组合使用:配置 PITR 做持续后台保护,在重大变更前创建快照,在需要临时调查时使用时间旅行查询。
快照和 PITR 的作用范围¶
快照和 PITR 均支持四个层级的作用范围,从最广到最细:
级别 |
作用范围 |
典型用途 |
|---|---|---|
|
集群内所有账号、数据库和表 |
全集群灾难恢复 |
|
单个账号内的所有数据库和表 |
租户级检查点 |
|
单个数据库内的所有表 |
迁移前安全保障 |
|
单张表 |
高风险操作前的定向保护 |
在较广范围创建的快照可以恢复该范围内的单个数据库或表。较广范围的 PITR 同样覆盖其内的所有对象。
数据分支——谱系与 DAG¶
分支谱系的工作原理¶
当您使用 DATA BRANCH CREATE 创建数据分支时,MatrixOne 会记录源与分支之间的父子关系。这种谱系信息形成一个有向无环图(DAG):分支本身可以再次被分支,形成任意拓扑的多级历史。
谱系是实现高效差异对比与合并的关键:
最近公共祖先(LCA): 系统自动沿 DAG 追溯,找到任意两个有谱系关联的表之间的公共祖先。DIFF 和 MERGE 随后仅计算从该祖先到当前状态的增量变更——而非全表扫描。
任意 DAG 深度: LCA 解析支持兄弟节点、表亲节点和跨子树节点,不限于直接父子关系。
无谱系回退: 没有公共祖先的两个表仍可进行比较或合并,但系统会回退到全量数据比较,无法利用谱系优化。
表分支与数据库分支¶
表分支(
DATA BRANCH CREATE TABLE):创建单表分支。适用于仅需对单表数据进行实验或转换的场景。数据库分支(
DATA BRANCH CREATE DATABASE):一次性创建数据库中所有表的分支。适用于变更涉及多张关联表、需要一个跨表一致性快照的场景。
两者均支持从当前状态或具名 SNAPSHOT 创建,且均保留谱系信息。
CREATE CLONE 与 DATA BRANCH CREATE 的区别¶
CREATE CLONE 会创建独立副本,但不会记录分支元数据或谱系。需要独立副本且不进行后续分支操作时,可使用 CREATE CLONE。如需后续执行 DIFF、PICK 或 MERGE,应使用 DATA BRANCH CREATE——记录的谱系可辅助这些操作计算变更。
数据分支生命周期¶
一个典型的分支经历以下阶段:
CREATE(创建)→ Work(开发)→ DIFF(审查)→ PICK / MERGE(发布)→ DELETE(清理)
1. CREATE——隔离工作区¶
-- 先保护基线
CREATE SNAPSHOT before_release FOR DATABASE production_db;
-- 从快照创建表分支
DATA BRANCH CREATE TABLE staging_db.customers FROM production_db.customers {SNAPSHOT = 'before_release'};
分支创建后即为独立数据副本。分支上的变更不影响源数据,源数据的变更也不影响分支。
2. Work——开发、测试与转换¶
像操作普通表一样操作分支,执行应用测试、验证数据转换或模拟生产场景。DIFF、PICK 和 MERGE 可接受受支持的历史映射和 target-only 列,但映射列类型与属性、NULL 约束、生成列和主键定义必须兼容。各操作的具体规则见已证实的限制。
USE staging_db;
UPDATE customers SET tier = 'premium' WHERE lifetime_value > 10000;
DELETE FROM customers WHERE last_active < '2020-01-01';
INSERT INTO customers SELECT * FROM imported_leads WHERE qualified = true;
3. DIFF——审查行级变更¶
在发布变更之前,检查具体差异:
-- 查看完整的逐行差异
DATA BRANCH DIFF staging_db.customers AGAINST production_db.customers;
-- 仅获取聚合计数
DATA BRANCH DIFF staging_db.customers AGAINST production_db.customers OUTPUT SUMMARY;
-- 限定输出列
DATA BRANCH DIFF staging_db.customers AGAINST production_db.customers COLUMNS (tier, lifetime_value);
-- 将差异导出到 Stage 目录
DATA BRANCH DIFF staging_db.customers AGAINST production_db.customers OUTPUT FILE 'stage://reviews/branch_diff/';
每行输出包含一个 flag 列(INSERT、DELETE 或 UPDATE)以及所有表列(或通过 COLUMNS 指定的列子集)。OUTPUT FILE 在增量差异场景下生成 SQL 文件;如果基表为空,则生成 CSV 文件。
OUTPUT SUMMARY 变体仅返回聚合计数:
DATA BRANCH DIFF staging_db.customers AGAINST production_db.customers OUTPUT SUMMARY;
4. PICK 或 MERGE——发布变更¶
在选择性发布和完整发布之间做出选择:
PICK——按主键选择特定行,或应用快照窗口内的所有变更:
-- 选择单个已知主键
DATA BRANCH PICK staging_db.customers INTO production_db.customers KEYS (1001);
-- 选择多个复合主键
DATA BRANCH PICK staging_db.customers INTO production_db.customers KEYS (('US', 1001), ('EU', 2042));
-- 选择两个快照之间的所有变更
DATA BRANCH PICK staging_db.customers INTO production_db.customers BETWEEN SNAPSHOT before_release AND after_qa;
-- 从子查询结果中选择主键
DATA BRANCH PICK staging_db.customers INTO production_db.customers KEYS (SELECT id FROM review_approved);
PICK 要求至少指定 KEYS 或 BETWEEN SNAPSHOT 中的一个,且源表必须具有显式主键。DATA BRANCH PICK 不支持仅有 MatrixOne 内部行标识符的表。
MERGE——一次性应用所有分支变更:
-- 默认:遇冲突即报错
DATA BRANCH MERGE staging_db.customers INTO production_db.customers;
-- 跳过冲突行,保留目标数据
DATA BRANCH MERGE staging_db.customers INTO production_db.customers WHEN CONFLICT SKIP;
-- 使用源数据覆盖目标冲突行
DATA BRANCH MERGE staging_db.customers INTO production_db.customers WHEN CONFLICT ACCEPT;
MERGE 与 PICK 中的冲突处理¶
MERGE 和 PICK 都可能遇到冲突——即源和目标中对同一主键的行做了不同修改。三种策略可供选择:
策略 |
行为 |
适用场景 |
|---|---|---|
|
检测到冲突行时报错并中止。 |
需要逐一人工审查每个冲突。 |
|
保留目标行不变,丢弃源的冲突变更。 |
目标数据为权威版本,源变更仅为建议。 |
|
以源行值覆盖目标行。 |
源分支包含最终确定的版本。 |
5. DELETE——清理分支¶
变更发布并验证后,删除不再需要的分支:
-- 删除表分支
DATA BRANCH DELETE TABLE staging_db.customers;
-- 删除数据库分支
DATA BRANCH DELETE DATABASE staging_db;
系统会校验目标是否为活跃分支(记录在分支元数据中),并检查调用者是否具有所需权限。
权限模型¶
每项 Git for Data 操作都需要特定的、按操作范围划分的权限。该模型遵循最小权限原则:读取源数据需要 SELECT,修改目标数据需要相应的写权限。
操作 |
源权限 |
目标权限 |
|---|---|---|
|
对源表的 |
对目标数据库的 |
|
对源表的 |
对账户的 |
|
对目标表的 |
对基准表的 |
|
对源表的 |
对目标表的 |
|
对源表及主键子查询表的 |
对目标表的 |
|
无需 |
对目标数据库的 |
|
无需 |
对目标账号的 |
完整权限参考见 Data Branch 权限模型。
已证实的限制¶
以下约束适用:
非 sys 租户不支持跨账号分支创建。 只有
sys租户可通过TO ACCOUNT在其他账号中创建分支,且跨账号创建必须指定快照。系统数据库不能作为分支目标。 例如,
DATA BRANCH CREATE TABLE不允许在mo_catalog中创建目标表;但sys账号可将mo_catalog中受支持的 cluster table 分支到普通数据库,具体源对象是否支持取决于其对象类型。DATA BRANCH DIFF OUTPUT AS table_name会创建新的持久化普通表。 目标必须不存在且不能带快照,并要求CREATE TABLE;结果使用冲突安全的__mo_diff_source和__mo_diff_flag元数据列。详见DATA BRANCH DIFF。DATA BRANCH DIFF COLUMNS与OUTPUT FILE不兼容。 列投影和文件导出不可同时使用。DATA BRANCH PICK不能在事务中执行。 显式BEGIN和autocommit=0都会被拒绝;MERGE 支持显式事务,但拒绝没有显式BEGIN的autocommit=0隐式事务。DATA BRANCH PICK拒绝子查询中的NULL键值。DATA BRANCH PICK要求显式主键。 不支持仅有 MatrixOne 内部行标识符的表。Schema 兼容规则因操作而异。 在列血缘可证明时,历史映射和 target-only 列可以工作,但映射列类型/属性、NULL 约束、生成列定义和主键定义必须兼容。DIFF 和 MERGE 会拒绝源列缺失、同名列重新创建以及不兼容映射。
数据库分支的对象范围是选择性的。 基础表成为 branch node,view 会重建但不成为 branch node,sequence 不会纳入。
普通 DROP 也参与分支清理。 删除 branch lineage 中的表或数据库时,会标记并回收对应的 branch protection metadata。
分支保护快照由系统管理。
DATA BRANCH CREATE会自动创建内部快照,在后代分支存在时保护祖先数据。这些快照不会显示在SHOW SNAPSHOTS中,不能直接删除,并会在分支子树删除后自动回收。分支元数据按账号隔离。 在一个账号中创建的分支在另一账号中不可见。
典型工作流¶
开发与测试¶
为生产数据库创建快照。
从该快照创建数据库分支。
在保持分支与源表 schema 等价的前提下,执行应用测试和数据转换。
通过 DIFF 审查,确认仅发生了预期的变更。
测试完成后删除分支(
DATA BRANCH DELETE)。
安全的数据转换¶
在开始前对目标表创建快照。
从快照创建表分支。
在分支上执行转换(批量 UPDATE、数据清洗、格式调整)。
使用 DIFF 验证转换产生了预期的变更。
将分支 MERGE 回源表,或仅 PICK 已通过验证的变更子集。
选择性发布¶
多个团队在同一基表的各自分支上独立工作。
通过 DIFF 独立审查各团队的变更。
QA 批准各分支中特定的行。
使用 PICK 配合
KEYS仅将已批准的行发布到主表。使用 PICK 配合
BETWEEN SNAPSHOT发布来自时间限定 QA 窗口内的所有变更。
恢复与审计¶
为关键表配置 PITR,设置符合合规要求的保留窗口。
发生问题时,使用
{TIMESTAMP = '...'}查询问题发生前的数据状态。如需恢复,使用
RESTORE ... FROM PITR name 'timestamp'恢复到问题发生前的某个时间点。出于审计目的,使用定期创建的快照比较数据状态,追溯历史变更。
相关页面¶
CREATE SNAPSHOT —— 完整语法参考
CREATE PITR —— PITR 配置参考
RESTORE … {SNAPSHOT = ‘name’} —— 快照恢复参考
RESTORE … FROM PITR —— PITR 恢复参考
DATA BRANCH CREATE —— 分支创建参考
DATA BRANCH DIFF —— 差异对比参考,含所有输出选项
DATA BRANCH PICK —— 选择性应用参考
DATA BRANCH MERGE —— 合并与冲突处理参考
DATA BRANCH DELETE —— 分支删除参考
Data Branch 权限模型 —— 完整权限参考
备份与恢复概述 —— 备份策略概述