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 数据沙箱首批内测资格。
这篇文章我完全用真机实操、踩坑实录、大白话讲透,不搞官方话术、不写机器味文案,跟着做就能跑通。
一、先聊大白话:YashanDB数据沙箱到底是什么?
简单打个比方:它就是内置在数据库内核里的“Git版本控制系统”。
这并不是靠脚本、中间件封装出来的外挂功能,而是把分支创建、数据快照、环境隔离、一键回滚、时间点恢复等能力,深度集成到数据库内核中。
- 想搭独立测试环境?秒级创建分支,告别长时间实例克隆;
- 操作失误玩崩数据?一键重置恢复,不用复杂回滚脚本;
- 多人并行开发测试?分支完全隔离,互不干扰、互不污染。

精准解决了传统测试环境部署慢、操作风险高、数据混乱三大痛点。
你有没有遇到过这种场景:
想验证一条高危SQL,又不敢在生产库上跑;
想给新功能搭个测试环境,DBA说“克隆一套实例,等十几分钟”;
跟同事共用一套开发库,你插的数据被他删了,他建的表把你搞懵了;
手滑删了重要的表,瞬间感觉人生无望……
我反正是天天遇到。做了十几年DBA,被问最多的问题就是:
“有没有一种数据库,能像Git管理代码一样,秒级开分支、随意回滚、互不干扰?”
以前我都是摇摇头:“醒醒,那是科幻片。”
直到最近,我成为 YashanDB 数据沙箱 首批内测体验官(全宇宙首批12人之一,此处应该有掌声👏),在真机上完完整整折腾了一圈。
结论放前面:数据库界的Git,它真的来了!
一、内测整体说明与体验目标
1.1 内测基础规范(先看再动手,别翻车)
- 操作系统:仅支持 Linux(我用的 openEuler 22.03 LTS-SP4,虚拟机即可)
- 客户端:内测暂只支持
yasql,别想着用 JDBC/ODBC 连(会报错) - 安全警告:这是尝鲜版,不要放真实敏感数据,也别当生产库用
1.2 我们要测什么?
官方给了三个核心任务,我也就盯着这三个方向:
- 分支生命周期:创建、切换、冻结、激活、删除……是不是秒级?
- 数据时间漫游:删了表能不能一键复活?回滚速度跟数据量有关系吗?
- 分支并行与隔离:A分支改的数据,B分支能看见吗?会不会“串味”?
1.3 我的内测目标(很朴素)
- 帮官方 找 bug、挑刺、吐槽文档(越早发现问题越好)
- 如果觉得好用,写篇真实体验分享出来
- 最后拿张京东卡买几本书(官方说的,不是我贪心😄)
二、真机环境明细(可直接复刻)
本次全程基于企业级通用物理机部署,软硬件配置、目录规划、磁盘划分全部公开,大家可以对照搭建。
2.1 系统基础信息
[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 ~]#

2.2 目录与磁盘规划(⚠️ 这里最容易翻车)不能格式化、不能挂载!
这是部署环节最容易翻车的地方,YashanDB数据沙箱对存储有硬性要求:业务数据盘、系统数据盘必须使用裸分区,禁止格式化文件系统、禁止手动挂载写入fstab,软件目录和数据目录也要物理分离。
- 安装包存放目录:
/opt/yashandbsoft,统一存放压缩包、校验文件; - 数据库程序目录:
/opt/yashandb-23.6.0.1,存放二进制程序、依赖、配置文件; - 裸磁盘分区规划:
/dev/sdb1:业务数据裸盘,对应部署参数--data;/dev/sdc1:系统数据裸盘,对应部署参数--system-data。
我第一次没看清楚,直接 mkfs.ext4 然后挂载到 /data、/redo,结果部署卡死,强制 kill 后磁盘还显示“64Z”这种阴间容量(后文有图有真相)。
2.3 前置提醒
- 内测尝鲜版仅用于技术体验、功能测试,严禁导入企业敏感数据,禁止直接上线生产环境;
- 客户端限制:内测阶段仅支持官方
yasql客户端连接使用; - 部署架构:本次采用单机架构演示,适合个人学习、功能验证场景。
2.4 安装包文件清单
[root@bogon yashandbsoft]# ls
database-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

三、完整部署流程(一步不落,真机实操)
3.1 创建软件包目录
提前规划目录,统一管理安装文件:
[root@bogon ~]# mkdir -p /opt/yashandbsoft
[root@bogon ~]#

3.2 上传安装包并查看文件清单
将官方安装包上传至/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]#

3.3 磁盘状态校验(关键排坑)
3.3.1 错误示范:分区挂载后无法部署
如果将裸分区格式化并手动挂载,部署流程会卡死停滞,无法正常完成安装:
[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 ~]#

3.3.2 正确示范:裸分区无挂载
标准状态下,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]#

3.4 双层安装包解压(安装包特殊结构)
YashanDB安装包分为外层程序包、内层数据库包两层,必须分步解压:
3.4.1 解压外层安装包
[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]#

3.4.2 解压内层数据库包至指定目录
[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]#

3.5 生成集群部署配置(开启分支核心功能)
执行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代表配置文件生成成功。
3.6 执行软件包安装
读取主机配置文件,自动完成环境校验、程序部署:
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]#

3.7 集群部署与服务启动
执行集群部署命令,-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]#

3.8 部署验证与数据库连接
3.8.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]#

3.8.2 加载环境变量
[root@bogon yashandb-23.6.0.1]# source /opt/yashandb/23.6.0.1/conf/yashan.bashrc
[root@bogon yashandb-23.6.0.1]#

3.8.3 使用yasql客户端登录数据库
[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>

3.8.4 数据库状态校验
SQL> SELECT NAME, OPEN_MODE FROM V$DATABASE;
NAME OPEN_MODE
---------------------------------------------------------------- -----------------
test READ_WRITE
1 row fetched.
SQL>

到这里,整套部署流程全部完成,接下来进入核心功能实测环节。
四、核心任务实战:像玩 Git 一样玩数据库
前面折腾了半天,总算把 YashanDB 数据沙箱部署起来了。
现在才是真正的高光时刻——亲自验证“秒级分支、时间漫游、多分支隔离”是不是吹牛。
以下所有操作都是我真机敲出来的,有坑有解,有笑有泪,跟着走你也能成。
四、任务一:吃透分支全生命周期管理
数据分支和Git代码分支逻辑很相似,拥有完整的创建、切换、重命名、冻结、激活、删除等生命周期。但YashanDB分支有专属使用规则,踩坑点我先帮大家排雷。
4.1 初始状态与经典报错踩坑
翻车现场,刚登录数据库,默认处于_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。仅用于运维管理,不允许直接作为父分支创建业务分支,这是核心规则,一定要记牢。
4.2 初始化Master主分支
全新数据库环境大概率没有master分支,需要先在_ADMIN分支初始化它(仅需执行一次):
-- 初始化主分支master
CALL DBMS_BRANCH.CREATE('master');
4.3 分支基础操作(切换、创建、查看)
- 切换至
master主分支,这是创建业务分支的前置必要步骤
SQL> CALL DBMS_BRANCH.CHECKOUT('master');
Succeed.
创建速度?不到 1 秒,比传统克隆实例快了几条街。

内测指南的示例代码漏了 CALL,直接写 DBMS_BRANCH.CREATE('test_01'); 会报 YAS-04231 keyword expected。
- 校验当前分支,确认已成功切入
master
SQL> show branch;
BRANCH
----------------------------------------------------------------
MASTER
1 row fetched.

- 在主分支下创建业务分支
test_01
SQL> EXEC DBMS_BRANCH.CREATE('test_01'); PL/SQL Succeed.
- 切换到新建分支
test_01
SQL> 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.

4.4 分支冻结、激活操作
冻结分支后,该分支会被锁定,无法进行读写操作,适合数据归档、版本封存场景。
- 切回
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.

4.5 补充:分支删除(按需执行)
如果分支不再使用,可执行删除命令清理:
EXEC DBMS_BRANCH.DELETE('test_01');
💡 实操小总结:
- 核心层级:
_ADMIN(管理分支)→master(主业务分支)→ 各类自定义子分支,层级不能乱; - 性能体验:创建、切换、冻结、激活操作均为秒级响应,几乎无延迟,体验十分流畅;
- 😅 小吐槽文档小细节:官方文档示例省略了
EXEC/CALL关键字,在SQL命令行直接执行会报错,命令行调用存储过程必须补充该关键字。
五、任务二:体验数据时间漫游,误操作一键回滚
谁还没试过手滑删表、误改数据?YashanDB的分支重置能力,就像给数据库装了「时光机」,支持数据一键回溯到分支创建之初。这里有个容易踩坑的逻辑误区,我分两次实测讲清楚。
5.1 错误示范:子分支内新建表后重置(典型误区)
很多新手会直接在子分支建表测试,结果发现重置后数据无法恢复,我们先复现这个场景:
- 切换至
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:新分支里新建文件再删除,执行硬重置后文件也不会回来。
5.2 正确示范:父分支建表,子分支漫游回溯
想要体验「时光机」真正的威力,必须遵循父分支建表、子分支使用的逻辑,这也是该功能的标准使用场景。
- 切回
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_01
SQL> 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的分支天然具备数据隔离能力,每个分支都是独立的数据空间,互不干扰。本次实测同时解决「磁盘文件残留」报错问题。
6.1 第三次翻车:目录残留导致创建失败,磁盘文件残留问题
当我尝试创建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

6.2 搭建多分支环境,开始隔离测试
- 创建新分支
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_03
SQL> 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.

6.3 多分支交叉验证,见证隔离效果
- 切换至
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.

😅 这不还是能看到两个!
6.4 接着按标准纯净环境复测(彻底验证隔离)
为了让隔离效果更直观,我们重置环境,从零开始复测:
- 回到
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分支完美实现数据读写隔离。多个分支可并行运行、独立修改数据,彼此完全不可见,非常适合多版本迭代、多团队并行开发、压力测试等场景,彻底解决数据互相干扰的难题。
七、内测问题总结与优化建议(吐槽向)
7.1 文档遗漏 CALL/EXEC
内测指南里所有 DBMS_BRANCH.xxx 都没加 CALL, 官方文档示例里漏了 EXEC,希望后面补上,不然小白会卡在第一句。。
建议:官方文档在示例前加一句“在 SQL 命令行需使用 CALL 或 EXEC”。
7.2 裸磁盘要求对新手不友好
大部分人在虚拟机里习惯直接 mkfs 挂载,突然要求用裸设备,卡住不少人。
建议:提供一个“简单模式”用于测试(比如允许普通目录,性能差一点但能跑通)。
7.3 错误提示可以更友好
比如 cannot create branch from root,可以加一句“请先切换到 master”。
file already exists 这种可以自动清理残留,不用用户手动介入。
7.4 缺少分支 Diff 和 Merge
目前只能独立分支,不能对比两个分支的数据差异,也不能合并。官方白皮书说未来会支持,我先蹲一个。
总结
折腾完这一圈,我对 YashanDB 数据沙箱的评价是:
理念超前,基础扎实,小毛病不少,但值得期待。
如果你有以下场景,强烈推荐试一试:
- AI/ML 实验需要大量并行数据环境
- 数据变更前想在分支上预演(比如删表、改结构、跑批处理)
- 多人/多智能体需要隔离的数据库工作空间
- 受够了每次测试都要克隆实例的漫长等待
数据库像 Git 一样管理数据,这件事已经从科幻片变成纪录片了。
作者注
本文所有操作及测试均基于 openEuler 22.03 (LTS-SP4) 与 yashandb-23.6.0 环境完成,全程实测YashanDB数据分支生命周期管理、数据时间漫游、分支并行隔离三大核心能力全流程。
崖山数据库分支功能、配套接口、社区后台界面与使用规则仍在持续迭代优化,后续界面及操作逻辑可能微调,生产环境使用请以崖山官方文档及社区最新公告为准。
本文为个人经验复盘,仅作技术学习与落地参考,不代表任何官方立场。




