Git for Data

Git for Data 将常见的版本管理概念——快照、分支、差异对比、选择性应用和合并——通过 SQL 直接作用于数据库表和数据。它支持具名恢复点、时间点恢复、隔离的数据实验、行级变更审查、选择性发布以及可审计的合并工作流,无需将数据导出到外部工具。

核心概念

Git for Data 将数据库数据视为可版本化的对象。无需在每次实验、迁移或发布前将数据复制到独立的版本管理系统中,直接通过 SQL 命令即可完成与 Git 类似的操作:

Git 概念

Git for Data 等效操作

功能说明

git tag

CREATE SNAPSHOT

在集群、账号、数据库或表级别创建具名恢复点。

git log / reflog

PITR + 时间旅行

在可配置的保留窗口内,查询或恢复任意历史时刻的数据。

git branch

DATA BRANCH CREATE

从当前状态或具名快照创建表或数据库分支。分支保留谱系信息,系统知晓其与源数据的关系。

git diff

DATA BRANCH DIFF

逐行比较两个表,显示所有 INSERTDELETEUPDATE

git cherry-pick

DATA BRANCH PICK

按主键选择性应用特定行,或应用两个快照之间的所有变更,无需合并完整差异集。

git merge

DATA BRANCH MERGE

将分支变更应用到目标表,支持 FAILSKIPACCEPT 三种冲突处理策略。

git branch -d

DATA BRANCH DELETE

删除不再需要的分支表或分支数据库。

上述所有操作均通过标准 SQL 执行,并受细粒度权限控制约束。无需外部工具、文件导出或独立的版本管理仓库。

快照、时间旅行与 PITR——如何选择

这三项能力分别满足不同的恢复和历史需求。下表帮助您做出选择:

能力

适用场景

工作原理

保留策略

快照

变更前基线、发布关卡、手动检查点

CREATE SNAPSHOT name FOR {CLUSTER|ACCOUNT|DATABASE|TABLE} 创建具名恢复点。通过 RESTORE ... {SNAPSHOT = 'name'} 恢复所需范围。

持久保留,直到显式删除。

时间旅行

临时历史查询、调试过去状态

SELECT ... {SNAPSHOT = 'name'}SELECT ... {TIMESTAMP = '...'} 读取历史数据,不执行恢复。

受快照生命周期和 PITR 窗口限制。

PITR

持续保护、灾难恢复、合规要求

CREATE PITR name FOR ... RANGE N {'h'|'d'|'mo'|'y'} 设置自动滚动历史窗口。通过 RESTORE ... FROM PITR name 'timestamp' 恢复。

RANGE 定义的滚动窗口。

可以组合使用:配置 PITR 做持续后台保护,在重大变更前创建快照,在需要临时调查时使用时间旅行查询。

快照和 PITR 的作用范围

快照和 PITR 均支持四个层级的作用范围,从最广到最细:

级别

作用范围

典型用途

CLUSTER

集群内所有账号、数据库和表

全集群灾难恢复

ACCOUNT

单个账号内的所有数据库和表

租户级检查点

DATABASE

单个数据库内的所有表

迁移前安全保障

TABLE

单张表

高风险操作前的定向保护

在较广范围创建的快照可以恢复该范围内的单个数据库或表。较广范围的 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——开发、测试与转换

像操作普通表一样操作分支,执行应用测试、验证数据转换或模拟生产场景。DIFFPICKMERGE 可接受受支持的历史映射和 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 列(INSERTDELETEUPDATE)以及所有表列(或通过 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 要求至少指定 KEYSBETWEEN 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 都可能遇到冲突——即源和目标中对同一主键的行做了不同修改。三种策略可供选择:

策略

行为

适用场景

FAIL(默认)

检测到冲突行时报错并中止。

需要逐一人工审查每个冲突。

SKIP

保留目标行不变,丢弃源的冲突变更。

目标数据为权威版本,源变更仅为建议。

ACCEPT

以源行值覆盖目标行。

源分支包含最终确定的版本。

5. DELETE——清理分支

变更发布并验证后,删除不再需要的分支:

-- 删除表分支
DATA BRANCH DELETE TABLE staging_db.customers;

-- 删除数据库分支
DATA BRANCH DELETE DATABASE staging_db;

系统会校验目标是否为活跃分支(记录在分支元数据中),并检查调用者是否具有所需权限。

权限模型

每项 Git for Data 操作都需要特定的、按操作范围划分的权限。该模型遵循最小权限原则:读取源数据需要 SELECT,修改目标数据需要相应的写权限。

操作

源权限

目标权限

DATA BRANCH CREATE TABLE

对源表的 SELECT

对目标数据库的 CREATE TABLE

DATA BRANCH CREATE DATABASE

对源表的 SELECT

对账户的 CREATE DATABASE

DATA BRANCH DIFF

对目标表的 SELECT

对基准表的 SELECT;使用 OUTPUT AS 时还需对输出数据库的 CREATE TABLE 权限

DATA BRANCH MERGE

对源表的 SELECT

对目标表的 SELECT, INSERT, UPDATE, DELETE

DATA BRANCH PICK

对源表及主键子查询表的 SELECT

对目标表的 SELECT, INSERT, UPDATE, DELETE

DATA BRANCH DELETE TABLE

无需

对目标数据库的 DROP TABLE

DATA BRANCH DELETE DATABASE

无需

对目标账号的 DROP DATABASE

完整权限参考见 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 COLUMNSOUTPUT FILE 不兼容。 列投影和文件导出不可同时使用。

  • DATA BRANCH PICK 不能在事务中执行。 显式 BEGINautocommit=0 都会被拒绝;MERGE 支持显式事务,但拒绝没有显式 BEGINautocommit=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 中,不能直接删除,并会在分支子树删除后自动回收。

  • 分支元数据按账号隔离。 在一个账号中创建的分支在另一账号中不可见。

典型工作流

开发与测试

  1. 为生产数据库创建快照。

  2. 从该快照创建数据库分支。

  3. 在保持分支与源表 schema 等价的前提下,执行应用测试和数据转换。

  4. 通过 DIFF 审查,确认仅发生了预期的变更。

  5. 测试完成后删除分支(DATA BRANCH DELETE)。

安全的数据转换

  1. 在开始前对目标表创建快照。

  2. 从快照创建表分支。

  3. 在分支上执行转换(批量 UPDATE、数据清洗、格式调整)。

  4. 使用 DIFF 验证转换产生了预期的变更。

  5. 将分支 MERGE 回源表,或仅 PICK 已通过验证的变更子集。

选择性发布

  1. 多个团队在同一基表的各自分支上独立工作。

  2. 通过 DIFF 独立审查各团队的变更。

  3. QA 批准各分支中特定的行。

  4. 使用 PICK 配合 KEYS 仅将已批准的行发布到主表。

  5. 使用 PICK 配合 BETWEEN SNAPSHOT 发布来自时间限定 QA 窗口内的所有变更。

恢复与审计

  1. 为关键表配置 PITR,设置符合合规要求的保留窗口。

  2. 发生问题时,使用 {TIMESTAMP = '...'} 查询问题发生前的数据状态。

  3. 如需恢复,使用 RESTORE ... FROM PITR name 'timestamp' 恢复到问题发生前的某个时间点。

  4. 出于审计目的,使用定期创建的快照比较数据状态,追溯历史变更。

相关页面