暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

像Git一样玩数据库!YashanDB沙箱内测:秒级分支真香

原创 shunwahⓂ️ 1天前
24

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版本控制系统”

这并不是靠脚本、中间件封装出来的外挂功能,而是把分支创建、数据快照、环境隔离、一键回滚、时间点恢复等能力,深度集成到数据库内核中。

  • 想搭独立测试环境?秒级创建分支,告别长时间实例克隆;
  • 操作失误玩崩数据?一键重置恢复,不用复杂回滚脚本;
  • 多人并行开发测试?分支完全隔离,互不干扰、互不污染。

image.png

精准解决了传统测试环境部署慢、操作风险高、数据混乱三大痛点。

你有没有遇到过这种场景:

想验证一条高危SQL,又不敢在生产库上跑;
想给新功能搭个测试环境,DBA说“克隆一套实例,等十几分钟”;
跟同事共用一套开发库,你插的数据被他删了,他建的表把你搞懵了;
手滑删了重要的表,瞬间感觉人生无望……

我反正是天天遇到。做了十几年DBA,被问最多的问题就是:
“有没有一种数据库,能像Git管理代码一样,秒级开分支、随意回滚、互不干扰?”

以前我都是摇摇头:“醒醒,那是科幻片。”

直到最近,我成为 YashanDB 数据沙箱 首批内测体验官(全宇宙首批12人之一,此处应该有掌声👏),在真机上完完整整折腾了一圈。
结论放前面:数据库界的Git,它真的来了!

一、内测整体说明与体验目标

1.1 内测基础规范(先看再动手,别翻车)

  • 操作系统:仅支持 Linux(我用的 openEuler 22.03 LTS-SP4,虚拟机即可)
  • 客户端:内测暂只支持 yasql,别想着用 JDBC/ODBC 连(会报错)
  • 安全警告:这是尝鲜版,不要放真实敏感数据,也别当生产库用

1.2 我们要测什么?

官方给了三个核心任务,我也就盯着这三个方向:

  1. 分支生命周期:创建、切换、冻结、激活、删除……是不是秒级?
  2. 数据时间漫游:删了表能不能一键复活?回滚速度跟数据量有关系吗?
  3. 分支并行与隔离: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 ~]#

image.png

2.2 目录与磁盘规划(⚠️ 这里最容易翻车)不能格式化、不能挂载!

这是部署环节最容易翻车的地方,YashanDB数据沙箱对存储有硬性要求:业务数据盘、系统数据盘必须使用裸分区,禁止格式化文件系统、禁止手动挂载写入fstab,软件目录和数据目录也要物理分离。

  1. 安装包存放目录:/opt/yashandbsoft,统一存放压缩包、校验文件;
  2. 数据库程序目录:/opt/yashandb-23.6.0.1,存放二进制程序、依赖、配置文件;
  3. 裸磁盘分区规划:
    • /dev/sdb1:业务数据裸盘,对应部署参数--data
    • /dev/sdc1:系统数据裸盘,对应部署参数--system-data

我第一次没看清楚,直接 mkfs.ext4 然后挂载到 /data/redo,结果部署卡死,强制 kill 后磁盘还显示“64Z”这种阴间容量(后文有图有真相)。

2.3 前置提醒

  1. 内测尝鲜版仅用于技术体验、功能测试,严禁导入企业敏感数据,禁止直接上线生产环境
  2. 客户端限制:内测阶段仅支持官方yasql客户端连接使用;
  3. 部署架构:本次采用单机架构演示,适合个人学习、功能验证场景。

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

image.png


三、完整部署流程(一步不落,真机实操)

3.1 创建软件包目录

提前规划目录,统一管理安装文件:

[root@bogon ~]# mkdir -p /opt/yashandbsoft
[root@bogon ~]#

image.png

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]#

image.png

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 ~]#

image.png

分区挂载后执行部署,进程会卡死无响应,只能手动强制终止相关进程:

[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 ~]#

image.png

3.3.2 正确示范:裸分区无挂载

标准状态下,df -Th 看不到sdb1sdc1挂载信息,通过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]#

image.png

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]#

image.png

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]#

image.png

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]#

image.png

出现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]#

image.png

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

image.png

部署完成后会返回成功状态,代表集群与分支功能全部启用:

| 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]#

image.png

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]#

image.png

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]#

image.png

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>

image.png

3.8.4 数据库状态校验

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

image.png

到这里,整套部署流程全部完成,接下来进入核心功能实测环节。

四、核心任务实战:像玩 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 分支基础操作(切换、创建、查看)

  1. 切换至master主分支,这是创建业务分支的前置必要步骤
SQL> CALL DBMS_BRANCH.CHECKOUT('master'); Succeed.

创建速度?不到 1 秒,比传统克隆实例快了几条街。

内测指南的示例代码漏了 CALL,直接写 DBMS_BRANCH.CREATE('test_01'); 会报 YAS-04231 keyword expected

  1. 校验当前分支,确认已成功切入master
SQL> show branch; BRANCH ---------------------------------------------------------------- MASTER 1 row fetched.

  1. 在主分支下创建业务分支test_01
SQL> EXEC DBMS_BRANCH.CREATE('test_01'); PL/SQL Succeed.
  1. 切换到新建分支test_01
SQL> EXEC DBMS_BRANCH.CHECKOUT('test_01'); Succeed.

  1. 两种方式查看当前所在分支
    方式一:通用查询命令
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 分支冻结、激活操作

冻结分支后,该分支会被锁定,无法进行读写操作,适合数据归档、版本封存场景。

  1. 切回master分支
SQL> EXEC DBMS_BRANCH.CHECKOUT('master'); Succeed.

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

  1. 激活已冻结分支,恢复正常读写权限
SQL> EXEC DBMS_BRANCH.ACTIVATE('test_01'); PL/SQL Succeed.

4.5 补充:分支删除(按需执行)

如果分支不再使用,可执行删除命令清理:

EXEC DBMS_BRANCH.DELETE('test_01');

💡 实操小总结:

  1. 核心层级:_ADMIN(管理分支)→master(主业务分支)→ 各类自定义子分支,层级不能乱;
  2. 性能体验:创建、切换、冻结、激活操作均为秒级响应,几乎无延迟,体验十分流畅;
  3. 😅 小吐槽文档小细节:官方文档示例省略了EXEC/CALL关键字,在SQL命令行直接执行会报错,命令行调用存储过程必须补充该关键字。

五、任务二:体验数据时间漫游,误操作一键回滚

谁还没试过手滑删表、误改数据?YashanDB的分支重置能力,就像给数据库装了「时光机」,支持数据一键回溯到分支创建之初。这里有个容易踩坑的逻辑误区,我分两次实测讲清楚。

5.1 错误示范:子分支内新建表后重置(典型误区)

很多新手会直接在子分支建表测试,结果发现重置后数据无法恢复,我们先复现这个场景:

  1. 切换至test_01分支
SQL> EXEC DBMS_BRANCH.CHECKOUT('test_01'); Succeed.

为什么?
因为 RESET 只恢复 从父分支(master)继承的数据,不会恢复子分支自己新建的表。

类比 Git:你在分支里新建一个文件,删掉后 git reset --hard 回到分支起点,那个文件当然不存在。

  1. 新建测试表并插入初始数据
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.
  1. 模拟误操作:删除数据表
SQL> DROP TABLE test_rollback; Succeed.

  1. 查询验证,表已不存在
SQL> SELECT COUNT(*) FROM test_rollback; [1:22]YAS-02012 table or view does not exist
  1. 执行分支重置,尝试恢复数据
SQL> EXEC DBMS_BRANCH.RESET(); Succeed.

  1. 再次查询,依旧提示表不存在
SQL> SELECT COUNT(*) FROM test_rollback; [1:22]YAS-02012 table or view does not exist

🔍 原理解析:RESET命令的作用是将分支恢复到「刚创建完成」的状态。这张表是在test_01分支创建后才新建的,分支初始状态本身就没有这张表,因此重置后自然无法恢复。类比Git:新分支里新建文件再删除,执行硬重置后文件也不会回来。

5.2 正确示范:父分支建表,子分支漫游回溯

想要体验「时光机」真正的威力,必须遵循父分支建表、子分支使用的逻辑,这也是该功能的标准使用场景。

  1. 切回master主分支
SQL> EXEC DBMS_BRANCH.CHECKOUT('master'); Succeed.
  1. 在主分支创建测试表、插入数据并提交
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.
  1. 验证主分支数据正常
SQL> SELECT COUNT(*) FROM test_rollback; COUNT(*) --------------------- 1 1 row fetched.

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

  1. 切换至子分支
SQL> EXEC DBMS_BRANCH.CHECKOUT('test_01'); Succeed.

  1. 模拟误操作,删除数据表
SQL> DROP TABLE test_rollback; Succeed.

  1. 执行重置命令,触发数据漫游
SQL> EXEC DBMS_BRANCH.RESET(); Succeed.

  1. 再次查询,数据表和数据全部恢复
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_02branch_03即可绕过冲突,同时先切回主分支做环境整理。

  1. 切回master主分支
SQL> EXEC DBMS_BRANCH.CHECKOUT('master'); Succeed.

  1. 确认当前分支
SQL> SHOW BRANCH; BRANCH ---------------------------------------------------------------- MASTER 1 row fetched.

  1. 尝试删除残留分支(提示不存在也属于正常现象)
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 搭建多分支环境,开始隔离测试

  1. 创建新分支branch_02并切入
SQL> EXEC DBMS_BRANCH.CREATE('branch_02'); PL/SQL Succeed. SQL> EXEC DBMS_BRANCH.CHECKOUT('branch_02'); Succeed.

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

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

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

6.3 多分支交叉验证,见证隔离效果

  1. 切换至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的数据。

  1. 切换至branch_03,查询数据
SQL> EXEC DBMS_BRANCH.CHECKOUT('branch_03'); Succeed. SQL> SELECT * FROM test_rollback; ID NAME ----------- --------------------- 1 init data 1 row fetched.


👉 仅保留主分支原始数据,看不到另外两个分支的新增数据。

  1. 切回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 接着按标准纯净环境复测(彻底验证隔离)

为了让隔离效果更直观,我们重置环境,从零开始复测:

  1. 回到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.

  1. 创建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.

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

  1. 创建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.

  1. 交叉切换分支,最终验证隔离性
  • branch_A:只可见初始数据+A分支数据
  • branch_B:只可见初始数据+B分支数据
  • master:只可见原始初始数据

✅ 隔离能力结论:YashanDB分支完美实现数据读写隔离。多个分支可并行运行、独立修改数据,彼此完全不可见,非常适合多版本迭代、多团队并行开发、压力测试等场景,彻底解决数据互相干扰的难题。

七、内测问题总结与优化建议(吐槽向)

7.1 文档遗漏 CALL/EXEC

内测指南里所有 DBMS_BRANCH.xxx 都没加 CALL, 官方文档示例里漏了 EXEC,希望后面补上,不然小白会卡在第一句。。
建议:官方文档在示例前加一句“在 SQL 命令行需使用 CALLEXEC”。

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数据分支生命周期管理、数据时间漫游、分支并行隔离三大核心能力全流程。

崖山数据库分支功能、配套接口、社区后台界面与使用规则仍在持续迭代优化,后续界面及操作逻辑可能微调,生产环境使用请以崖山官方文档及社区最新公告为准。

本文为个人经验复盘,仅作技术学习与落地参考,不代表任何官方立场。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论