YashanDB数据沙箱:从0到1部署+实战,数据库居然也能“git branch”了?
作者: 数据库界的华少
持有认证: OceanBase、MySQL、OpenGauss、崖山、金仓KingBase、KaiwuDB、 亚信AntDBCA、翰高、GBase、Galaxybase、Neo4j 、NebulaGraph、东方通TongTech、TiDB等多项权威认证。
获奖经历: 崖山YashanDB YVP、浪潮KaiwuDB MVP、墨天轮 MVP、金仓社区KVA、TiDB社区MVA、NebulaGraph社区之星、IFClub星珩联盟·智库星系技术专家、ITPUB 技术专家,社区版主及布道师。在OceanBase&墨天轮征文大赛、OpenGauss、TiDB、YashanDB、Kingbase、KWDB、Navicat 征文等赛事中多次斩获一、二、三等奖,原创技术文章常年被墨天轮、CSDN、ITPUB 等平台首页推荐。
做数据库运维和技术分享这么多年,我相信不少同行都有同款“头疼日常”:搭建一套测试环境耗时动辄十几分钟甚至半小时,多个人共用一套库,数据互相篡改、脏数据满天飞;线上做变更、验证新功能时更是步步惊心,就怕手滑误删表、改数据,出了问题回滚流程又繁琐到让人崩溃。
近两年数据库领域风向变化很明显,海外产品凭借轻量分支能力收获大额融资也印证了一件事:进入AI时代,数据库不能只追求跑得快、存得多, 灵活、易用、可快速回滚、多环境隔离,已经成为开发、测试、运维群体的核心刚需。
最近“数据分支”彻底.火了,Neon 被 10 亿美元收购更是证明一件事:
AI 时代,数据库必须像 Git 一样轻、一样灵活。
作为 YashanDB YVP、数据库布道师,我第一时间拿到
YashanDB 数据沙箱首批内测资格。
这篇文章我完全用
真机实操、踩坑实录、大白话讲透,不搞官方话术、不写机器味文案,跟着做就能跑通。
简单打个比方: 它就是内置在数据库内核里的“Git版本控制系统”。
这并不是靠脚本、中间件封装出来的外挂功能,而是把分支创建、数据快照、环境隔离、一键回滚、时间点恢复等能力,深度集成到数据库内核中。

精准解决了传统测试环境 部署慢、操作风险高、数据混乱三大痛点。
你有没有遇到过这种场景:
想验证一条高危SQL,又不敢在生产库上跑;
想给新功能搭个测试环境,DBA说“克隆一套实例,等十几分钟”;
跟同事共用一套开发库,你插的数据被他删了,他建的表把你搞懵了;
手滑删了重要的表,瞬间感觉人生无望……
我反正是天天遇到。做了十几年DBA,被问最多的问题就是:
“有没有一种数据库,能像Git管理代码一样,秒级开分支、随意回滚、互不干扰?”
以前我都是摇摇头:“醒醒,那是科幻片。”
直到最近,我成为
YashanDB 数据沙箱 首批内测体验官(全宇宙首批12人之一,此处应该有掌声👏),在真机上完完整整折腾了一圈。
结论放前面:数据库界的Git,它真的来了!
yasql,别想着用 JDBC/ODBC 连(会报错)官方给了三个核心任务,我也就盯着这三个方向:
本次全程基于企业级通用物理机部署,软硬件配置、目录规划、磁盘划分全部公开,大家可以对照搭建。
[root@bogon ~]# cat /etc/os-release NAME="openEuler" VERSION="22.03 (LTS-SP4)" ID="openEuler" VERSION_ID="22.03" PRETTY_NAME="openEuler 22.03 (LTS-SP4)" ANSI_COLOR="0;31" [root@bogon ~]# uname -r 5.10.0-216.0.0.115.oe2203sp4.x86_64 [root@bogon ~]#

这是部署环节最容易翻车的地方,YashanDB数据沙箱对存储有硬性要求: 业务数据盘、系统数据盘必须使用裸分区,禁止格式化文件系统、禁止手动挂载写入fstab,软件目录和数据目录也要物理分离。
/opt/yashandbsoft,统一存放压缩包、校验文件;/opt/yashandb-23.6.0.1,存放二进制程序、依赖、配置文件;/dev/sdb1:业务数据裸盘,对应部署参数
--data;/dev/sdc1:系统数据裸盘,对应部署参数
--system-data。我第一次没看清楚,直接
mkfs.ext4 然后挂载到
/data、
/redo,结果部署卡死,强制 kill 后磁盘还显示“64Z”这种阴间容量(后文有图有真相)。
yasql客户端连接使用;[root@bogon yashandbsoft]# lsdatabase-23.6.0.1-linux-x86_64.tar.gz yashandb-23.6.0.1-release.sha512 yashandb-23.6.0.1-linux-x86_64.tar.gz yashandb-client-23.6.0.1-linux-x86_64.tar.gz

提前规划目录,统一管理安装文件:
[root@bogon ~]# mkdir -p /opt/yashandbsoft [root@bogon ~]#

将官方安装包上传至
/opt/yashandbsoft目录,确认文件完整:
[root@bogon ~]# cd /opt/yashandbsoft/ [root@bogon yashandbsoft]# ls yashandb-23.6.0.1-linux-x86_64.tar.gz yashandb-client-23.6.0.1-linux-x86_64.tar.gz yashandb-23.6.0.1-release.sha512 [root@bogon yashandbsoft]#

如果将裸分区格式化并手动挂载,部署流程会卡死停滞,无法正常完成安装:
[root@bogon ~]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 16G 0 16G 0% /dev/shm tmpfs tmpfs 6.2G 17M 6.2G 1% /run tmpfs tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup /dev/mapper/openeuler-root ext4 59G 3.6G 52G 7% / tmpfs tmpfs 16G 0 16G 0% /tmp /dev/sda2 ext4 974M 173M 734M 20% /boot /dev/mapper/openeuler-home ext4 29G 24K 27G 1% /home /dev/sda1 vfat 599M 6.2M 593M 2% /boot/efi /dev/sdb1 ext4 196G 800M 186G 1% /data /dev/sdc1 ext4 196G 28K 186G 1% /redo [root@bogon ~]#

分区挂载后执行部署,进程会卡死无响应,只能手动强制终止相关进程:
[root@bogon ~]# ps aux | grep yas root 295360 0.0 0.0 2058376 28656 ? Ssl 10:57 0:00 /data/yashandb/23.6.0.1/bin/yasagent --init -c yashan -l 127.0.0.1:1676 --host-id host0001 -k -L /data/yashandb/log -d root 295381 0.2 0.1 2208928 35484 ? Ssl 10:57 0:07 /data/yashandb/23.6.0.1/bin/yasom --init -c yashan -l 127.0.0.1:1675 -k -L /data/yashandb/log -d root 309551 0.0 0.0 1981232 27108 pts/0 Sl+ 11:02 0:01 bin/yasboot cluster deploy -t yashan.toml -p -d root 309818 2.7 6.8 2473828 2203764 ? Sl 11:02 1:09 /data/yashandb/23.6.0.1/bin/yasfs -D /data/yashandb/yasdb_data/ycs/ce-1-1 root 434967 0.0 0.0 22116 2220 pts/1 S+ 11:44 0:00 grep --color=auto yas [root@bogon ~]# kill -9 295360 [root@bogon ~]# kill -9 309551 [root@bogon ~]# kill -9 295381 [root@bogon ~]# kill -9 309818 [root@bogon ~]# ps aux | grep yas root 445379 0.0 0.0 22116 2392 pts/1 S+ 11:47 0:00 grep --color=auto yas [root@bogon ~]#

标准状态下,
df -Th 看不到
sdb1、
sdc1挂载信息,通过
lsblk查看分区即可:
[root@bogon yashandb-23.6.0.1]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev tmpfs tmpfs 16G 0 16G 0% /dev/shm tmpfs tmpfs 6.2G 17M 6.2G 1% /run tmpfs tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup /dev/mapper/openeuler-root ext4 59G 4.4G 51G 8% / tmpfs tmpfs 16G 0 16G 0% /tmp /dev/sda2 ext4 974M 173M 734M 20% /boot /dev/mapper/openeuler-home ext4 29G 24K 27G 1% /home /dev/sda1 vfat 599M 6.2M 593M 2% /boot/efi [root@bogon yashandb-23.6.0.1]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 600M 0 part /boot/efi ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 98.4G 0 part ├─openeuler-root 253:0 0 59.4G 0 lvm / ├─openeuler-swap 253:1 0 10G 0 lvm [SWAP] └─openeuler-home 253:2 0 29G 0 lvm /home sdb 8:16 0 200G 0 disk └─sdb1 8:17 0 200G 0 part sdc 8:32 0 200G 0 disk └─sdc1 8:33 0 200G 0 part sr0 11:0 1 3.8G 0 rom [root@bogon yashandb-23.6.0.1]#

YashanDB安装包分为外层程序包、内层数据库包两层,必须分步解压:
[root@bogon yashandbsoft]# tar -zxf yashandb-23.6.0.1-linux-x86_64.tar.gz [root@bogon yashandbsoft]# ls bin plugins database-23.6.0.1-linux-x86_64.tar.gz yashandb-23.6.0.1-linux-x86_64.tar.gz depends yashandb-23.6.0.1-release.sha512 install.sh yashandb-client-23.6.0.1-linux-x86_64.tar.gz om [root@bogon yashandbsoft]#

[root@bogon yashandbsoft]# mkdir -p /opt/yashandb-23.6.0.1 [root@bogon yashandbsoft]# tar -zxf database-23.6.0.1-linux-x86_64.tar.gz -C /opt/yashandb-23.6.0.1/ # 进入数据库程序目录 [root@bogon yashandbsoft]# cd /opt/yashandb-23.6.0.1 [root@bogon yashandb-23.6.0.1]# ls admin conf include lib om scripts bin gitmoduleversion.dat java LICENSE plug-in third [root@bogon yashandb-23.6.0.1]#

执行
yasboot命令生成配置文件,
--enable-branch是开启数据沙箱分支能力的核心参数,密码使用单引号包裹,避免特殊字符被系统解析:
[root@bogon yashandb-23.6.0.1]# bin/yasboot package ce gen \ > --cluster yashan \ > -u root \ > -p 'fP3qjQc%fFCtx!hZ' \ > --ip 127.0.0.1 \ > --port 22 \ > --install-path /opt/yashandb \ > --begin-port 1688 \ > --data /dev/sdb1 \ > --system-data /dev/sdc1 \ > --disk-found-path /dev \ > --node 1 \ > -f \ > --enable-branch Warning: I/O fencing check skipped, cluster is configured with I/O protection algorithm. Please confirm that DISK_HB_KEEP_ALIVE is configured exceeding the theoretical maximum latency of shared storage device. +-------------------------------------------------------------------------------------------------------+ | hostid | group | node_type | node_name | listen_addr | inter_connect | data_path | +-------------------------------------------------------------------------------------------------------+ | host0001 | ceg1 | ce | 1-1 | 127.0.0.1:1688 | 127.0.0.1:1689 | /opt/yashandb/yasdb_data | +----------+-------+-----------+-----------+----------------+----------------+--------------------------+ Generate config completed [root@bogon yashandb-23.6.0.1]#

出现
Generate config completed代表配置文件生成成功。
读取主机配置文件,自动完成环境校验、程序部署:
bin/yasboot package install -t hosts.toml -f
[root@bogon yashandb-23.6.0.1]# bin/yasboot package install -t hosts.toml -f verify database package, please wait... checking install profile.toml... install version: yashandb 23.6.0.1 update host to yasom... [root@bogon yashandb-23.6.0.1]# ls admin conf hosts.toml java LICENSE plug-in third bin gitmoduleversion.dat include lib om scripts yashan.toml [root@bogon yashandb-23.6.0.1]#

执行集群部署命令,
-p后紧跟数据库sys用户密码,
--yfs-force-create适配裸设备场景:
[root@bogon yashandb-23.6.0.1]# bin/yasboot cluster deploy -t yashan.toml -p 'Cod-YashanDB#2026' --yfs-force-create -d enable_branch0=true

部署完成后会返回成功状态,代表集群与分支功能全部启用:
| task | 17d91469a410c5f4 | DeployYasdbCluster | - | yashan | RUNNING | - | 50 | - | +-------+------------------+--------------------+----------+------------+---------+---------- +-----------------------------------------------------------------------------------------------------------------+ | type | uuid | name | hostid | index | status | return_code | progress | cost | +-----------------------------------------------------------------------------------------------------------------+ | task | 17d91469a410c5f4 | DeployYasdbCluster | - | yashan | SUCCESS | 0 | 100 | 52 | +-------+------------------+--------------------+----------+------------+---------+-------------+----------+------+ | child | 8c3c698921ee5635 | DeployDBBranch | host0001 | yashan.1-1 | SUCCESS | 0 | 100 | 52 | + +------------------+--------------------+----------+------------+---------+-------------+----------+------+ | | ff6b1548b845e94d | SyncNodeConfig | - | yashan | SUCCESS | 0 | 1 | +-------+------------------+--------------------+----------+------------+---------+-------------+----------+------+ task completed, status: SUCCESS [root@bogon yashandb-23.6.0.1]#

[root@bogon yashandb-23.6.0.1]# bin/yasboot cluster status -c yashan +----------------------------------------+ | host_id | node_type | nodeid | pid | +----------------------------------------+ | host0001 | ce | 1-1:1 | 491564 | +----------+-----------+--------+--------+ [root@bogon yashandb-23.6.0.1]#

[root@bogon yashandb-23.6.0.1]# source /opt/yashandb/23.6.0.1/conf/yashan.bashrc [root@bogon yashandb-23.6.0.1]#

[root@bogon yashandb-23.6.0.1]# cd bin/ [root@bogon bin]# ./yasql sys/'Cod-YashanDB#2026'@127.0.0.1:1688 YashanDB SQL Enterprise Edition Release 23.6.0.1 x86_64 Connected to: YashanDB Server Enterprise Edition Release 23.6.0.1 x86_64 - Linux SQL>

SQL> SELECT NAME, OPEN_MODE FROM V$DATABASE; NAME OPEN_MODE ---------------------------------------------------------------- ----------------- test READ_WRITE 1 row fetched. SQL>

到这里,整套部署流程全部完成,接下来进入核心功能实测环节。
前面折腾了半天,总算把 YashanDB 数据沙箱部署起来了。
现在才是真正的高光时刻—— 亲自验证“秒级分支、时间漫游、多分支隔离”是不是吹牛。
以下所有操作都是我真机敲出来的,有坑有解,有笑有泪,跟着走你也能成。
数据分支和Git代码分支逻辑很相似,拥有完整的创建、切换、重命名、冻结、激活、删除等生命周期。但YashanDB分支有专属使用规则,踩坑点我先帮大家排雷。
翻车现场,刚登录数据库,默认处于
_ADMIN管理分支,我兴冲冲地连上数据库,先查看当前分支:
SQL> show branch; BRANCH ---------------------------------------------------------------- _ADMIN 1 row fetched.
“_ADMIN” 是什么鬼?不管了,很多人上来就直接新建分支,执行语句如下:
CALL DBMS_BRANCH.CREATE('test_01');
随即会抛出报错 YAS-02952 cannot create branch from root。
😱 报错了!原来
_ADMIN 是数据库的
“管理层办公室”,你不能在办公室里直接开子公司,得先到
master 分支去。
教训:
_ADMIN≠ 业务父分支,别在这儿CREATE。 仅用于运维管理,不允许直接作为父分支创建业务分支,这是核心规则,一定要记牢。
全新数据库环境大概率没有
master分支,需要先在
_ADMIN分支初始化它(仅需执行一次):
-- 初始化主分支masterCALL DBMS_BRANCH.CREATE('master');
master主分支,这是创建业务分支的
前置必要步骤SQL> CALL DBMS_BRANCH.CHECKOUT('master');
Succeed.
创建速度? 不到 1 秒,比传统克隆实例快了几条街。

内测指南的示例代码漏了
CALL,直接写
DBMS_BRANCH.CREATE('test_01'); 会报
YAS-04231 keyword expected。
masterSQL> show branch; BRANCH ---------------------------------------------------------------- MASTER 1 row fetched.

test_01SQL> EXEC DBMS_BRANCH.CREATE('test_01');
PL/SQL Succeed.
test_01SQL> EXEC DBMS_BRANCH.CHECKOUT('test_01');
Succeed.

SQL> SHOW BRANCH; BRANCH ---------------------------------------------------------------- TEST_01 1 row fetched.

方式二:函数查询
SQL> SELECT DBMS_BRANCH.CURRENT() FROM DUAL; DBMS_BRANCH.CURRENT() ---------------------------------------------------------------- TEST_01 1 row fetched.

冻结分支后,该分支会被锁定,无法进行读写操作,适合数据归档、版本封存场景。
master分支SQL> EXEC DBMS_BRANCH.CHECKOUT('master');
Succeed.

test_01分支(冻结后不可读写,相当于归档)SQL> EXEC DBMS_BRANCH.FREEZE('test_01');
PL/SQL Succeed.

SQL> EXEC DBMS_BRANCH.ACTIVATE('test_01');
PL/SQL Succeed.

如果分支不再使用,可执行删除命令清理:
EXEC DBMS_BRANCH.DELETE('test_01');
💡 实操小总结:
_ADMIN(管理分支)→
master(主业务分支)→ 各类自定义子分支,层级不能乱;EXEC/CALL关键字,在SQL命令行直接执行会报错,命令行调用存储过程必须补充该关键字。谁还没试过手滑删表、误改数据?YashanDB的分支重置能力,就像给数据库装了「时光机」,支持数据一键回溯到分支创建之初。这里有个容易踩坑的逻辑误区,我分两次实测讲清楚。
很多新手会直接在子分支建表测试,结果发现重置后数据无法恢复,我们先复现这个场景:
test_01分支SQL> EXEC DBMS_BRANCH.CHECKOUT('test_01');
Succeed.
为什么?
因为
RESET 只恢复
从父分支(master)继承的数据,不会恢复子分支自己新建的表。
类比 Git:你在分支里新建一个文件,删掉后
git reset --hard回到分支起点,那个文件当然不存在。
SQL> CREATE TABLE test_rollback(id NUMBER, name VARCHAR2(20)); Succeed. SQL> INSERT INTO test_rollback VALUES(1, 'init data'); 1 row affected. SQL> COMMIT; Succeed.
SQL> DROP TABLE test_rollback; Succeed.

SQL> SELECT COUNT(*) FROM test_rollback; [1:22]YAS-02012 table or view does not exist
SQL> EXEC DBMS_BRANCH.RESET(); Succeed.

SQL> SELECT COUNT(*) FROM test_rollback; [1:22]YAS-02012 table or view does not exist

🔍 原理解析:
RESET命令的作用是
将分支恢复到「刚创建完成」的状态。这张表是在
test_01分支创建后才新建的,分支初始状态本身就没有这张表,因此重置后自然无法恢复。类比Git:新分支里新建文件再删除,执行硬重置后文件也不会回来。
想要体验「时光机」真正的威力,必须遵循 父分支建表、子分支使用的逻辑,这也是该功能的标准使用场景。
master主分支SQL> EXEC DBMS_BRANCH.CHECKOUT('master');
Succeed.
SQL> CREATE TABLE test_rollback(id NUMBER, name VARCHAR2(20)); Succeed. SQL> INSERT INTO test_rollback VALUES(1, 'init data'); 1 row affected. SQL> COMMIT; Succeed.
SQL> SELECT COUNT(*) FROM test_rollback; COUNT(*) --------------------- 1 1 row fetched.

master创建子分支
test_01SQL> EXEC DBMS_BRANCH.CREATE('test_01');
PL/SQL Succeed.

SQL> EXEC DBMS_BRANCH.CHECKOUT('test_01');
Succeed.

SQL> DROP TABLE test_rollback; Succeed.

SQL> EXEC DBMS_BRANCH.RESET(); Succeed.

SQL> SELECT COUNT(*) FROM test_rollback; COUNT(*) --------------------- 1 1 row fetched.

✅ 功能总结:数据时间漫游适合测试环境、生产应急场景。
父分支的基础数据,子分支可通过
RESET一键还原;子分支独立新增的数据,重置后会被清空,使用时一定要区分场景。
日常开发中,多个团队、多个版本并行测试最害怕数据互相串扰。YashanDB的分支天然具备数据隔离能力,每个分支都是独立的数据空间,互不干扰。本次实测同时解决「磁盘文件残留」报错问题。
当我尝试创建
BRANCH_A时,抛出如下报错:
SQL> EXEC DBMS_BRANCH.CREATE('branch_A');
YAS-02887 container 'CDB$ROOT' failed to process request, errcode: 2887, errmsg: container 'BRANCH_A' failed to process request, errcode: 5521, errmsg: file or directory '/containers/BRANCH_A/archive/arch_0_2.ARC' already exists
YAS-04015 at line 1
查看当前分支:
SQL> SHOW BRANCH; BRANCH ---------------------------------------------------------------- TEST_01 1 row fetched.

🔍 问题原因:此前删除分支时,数据库元数据清理完成,但服务器磁盘上的日志、目录文件残留,导致同名分支无法重建。
💡 快速解决方案:无需登录主机删文件,
更换分支名称(比如
branch_02、
branch_03即可绕过冲突,同时先切回主分支做环境整理。
master主分支SQL> EXEC DBMS_BRANCH.CHECKOUT('master');
Succeed.

SQL> SHOW BRANCH; BRANCH ---------------------------------------------------------------- MASTER 1 row fetched.

SQL> EXEC DBMS_BRANCH.DELETE('BRANCH_A');
YAS-02887 container 'CDB$ROOT' failed to process request, errcode: 2881, errmsg: container 'BRANCH_A' is not found
YAS-04015 at line 1

branch_02并切入SQL> EXEC DBMS_BRANCH.CREATE('branch_02');
PL/SQL Succeed.
SQL> EXEC DBMS_BRANCH.CHECKOUT('branch_02');
Succeed.

branch_02插入专属测试数据SQL> INSERT INTO test_rollback VALUES(2, 'branch_02 data'); 1 row affected. SQL> COMMIT; Succeed.

master,创建第二个并行分支
branch_03SQL> EXEC DBMS_BRANCH.CHECKOUT('master');
Succeed.
SQL> EXEC DBMS_BRANCH.CREATE('branch_03');
PL/SQL Succeed.

branch_03插入专属测试数据SQL> INSERT INTO test_rollback VALUES(3, 'branch_03 data'); 1 row affected. SQL> COMMIT; Succeed.

branch_02,查询数据SQL> EXEC DBMS_BRANCH.CHECKOUT('branch_02');
Succeed.
SQL> SELECT * FROM test_rollback;
ID NAME
----------- ---------------------
1 init data
2 branch_02 data
2 rows fetched.
👉 仅能看到主分支原始数据 + 本分支新增数据,看不到
branch_03的数据。
branch_03,查询数据SQL> EXEC DBMS_BRANCH.CHECKOUT('branch_03');
Succeed.
SQL> SELECT * FROM test_rollback;
ID NAME
----------- ---------------------
1 init data
1 row fetched.
👉 仅保留主分支原始数据,看不到另外两个分支的新增数据。
master主分支,查询数据SQL> EXEC DBMS_BRANCH.CHECKOUT('master');
Succeed.
SQL> SELECT * FROM test_rollback;
ID NAME
----------- ---------------------
1 init data
3 branch_03 data
2 rows fetched.

😅 这不还是能看到两个!
为了让隔离效果更直观,我们重置环境,从零开始复测:
master,清空数据仅保留初始记录SQL> EXEC DBMS_BRANCH.CHECKOUT('master');
PL/SQL Succeed.
SQL> TRUNCATE TABLE test_rollback;
Succeed.
SQL> INSERT INTO test_rollback VALUES (1, 'init data');
1 row affected.
SQL> COMMIT;
Succeed.
SQL> SELECT * FROM test_rollback;
ID NAME
----------- ---------------------
1 init data
1 row fetched.

branch_A并插入专属数据SQL> EXEC DBMS_BRANCH.CREATE('branch_A');
PL/SQL Succeed.
SQL> EXEC DBMS_BRANCH.CHECKOUT('branch_A');
Succeed.
SQL> INSERT INTO test_rollback VALUES (2, 'data from A');
1 row affected.
SQL> COMMIT;
Succeed.
SQL> SELECT * FROM test_rollback;
ID NAME
----------- ---------------------
1 init data
2 data from A
2 rows fetched.

master,查询无分支A的数据SQL> EXEC DBMS_BRANCH.CHECKOUT('master');
Succeed.
SQL> SELECT * FROM test_rollback;
ID NAME
----------- ---------------------
1 init data
1 row fetched.

branch_B并插入专属数据SQL> EXEC DBMS_BRANCH.CREATE('branch_B');
PL/SQL Succeed.
SQL> EXEC DBMS_BRANCH.CHECKOUT('branch_B');
Succeed.
SQL> INSERT INTO test_rollback VALUES (3, 'data from B');
1 row affected.
SQL> COMMIT;
Succeed.
SQL> SELECT * FROM test_rollback;
ID NAME
----------- ---------------------
1 init data
3 data from B
2 rows fetched.

branch_A:只可见初始数据+A分支数据branch_B:只可见初始数据+B分支数据master:只可见原始初始数据✅ 隔离能力结论:YashanDB分支完美实现 数据读写隔离。多个分支可并行运行、独立修改数据,彼此完全不可见,非常适合多版本迭代、多团队并行开发、压力测试等场景,彻底解决数据互相干扰的难题。
CALL/
EXEC内测指南里所有
DBMS_BRANCH.xxx 都没加
CALL, 官方文档示例里漏了
EXEC,希望后面补上,不然小白会卡在第一句。。
建议:官方文档在示例前加一句“在 SQL 命令行需使用
CALL 或
EXEC”。
大部分人在虚拟机里习惯直接
mkfs 挂载,突然要求用裸设备,卡住不少人。
建议:提供一个“简单模式”用于测试(比如允许普通目录,性能差一点但能跑通)。
比如
cannot create branch from root,可以加一句“请先切换到 master”。
file already exists 这种可以自动清理残留,不用用户手动介入。
目前只能独立分支,不能对比两个分支的数据差异,也不能合并。官方白皮书说未来会支持,我先蹲一个。
折腾完这一圈,我对 YashanDB 数据沙箱的评价是:
理念超前,基础扎实,小毛病不少,但值得期待。
如果你有以下场景,强烈推荐试一试:
数据库像 Git 一样管理数据,这件事已经从科幻片变成纪录片了。
作者注
本文所有操作及测试均基于 openEuler 22.03 (LTS-SP4) 与 yashandb-23.6.0 环境完成,全程实测YashanDB数据分支生命周期管理、数据时间漫游、分支并行隔离三大核心能力全流程。
崖山数据库分支功能、配套接口、社区后台界面与使用规则仍在持续迭代优化,后续界面及操作逻辑可能微调,生产环境使用请以崖山官方文档及社区最新公告为准。
本文为个人经验复盘,仅作技术学习与落地参考,不代表任何官方立场
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70042915/viewspace-3173312/ ,如需转载,请注明出处,否则将追究法律责任。