前提
最近参与了崖山数据库沙箱体验活动,在这里将我的体验分享一下。
安装前的准备
安装沙箱功能,需要使用单机共享集群的模式,在oracle里叫oracle restart,单机上采用ASM的架构。至于为什么采用这种架构,我个人猜测是跳过文件系统,可以更好的掌握数据的操作,比如生成快照,再用快照来产生数据。以前用oracle的时候,就可以通过asm的快照来创建数据库,甚至后来我用acfs+asm快照实现ogg的主备切换。
存储是使用fdisk分了两个100g的分区,下面是udev的规则。
99-yashan-yfs.rules
KERNEL=="nvme0n1p3", SUBSYSTEM=="block", SYMLINK+="yfs/dg",OWNER="yashan",GROUP="yashan",MODE="0666",OPTIONS:="nowatch",RUN+="/bin/sh -c 'chown -R yashan:yashan /dev/yfs/dg'" KERNEL=="nvme0n1p4", SUBSYSTEM=="block", SYMLINK+="yfs/system",OWNER="yashan",GROUP="yashan",MODE="0666",OPTIONS:="nowatch",RUN+="/bin/sh -c 'chown -R yashan:yashan /dev/yfs/system'"
沙箱安装
准备安装文件
将安装文件解压缩
tar zxvf yashandb-23.6.0.1-linux-x86_64.tar.gz -C /data
生成配置文件
bin/yasboot package ce gen --cluster yashandb -u yashn -p password --ip 127.0.0.1 --port 22 --install-path /data/yashan/yasdb --begin-port 1688 --data /dev/yfs/dg --system-data /dev/yfs/system --disk-found-path /dev/yfs --node 1 -f --enable-branch
该命令生成hosts.toml和yashandb.toml配置文件。下面是参数说明
| 参数 | 说明 | 默认值 | 是否必填 |
|---|---|---|---|
--cluster |
集群名称 | - | 是 |
-u / --user |
部署机器的SSH用户名 | - | 是 |
-p / --password |
部署机器的SSH密码 | - | 是 |
-N |
免密登录(使用SSH密钥) | - | 否 |
--ip |
部署机器的IP地址 | - | 是 |
--port |
SSH端口 | 22 | 否 |
-i / --install-path |
安装目录 | - | 是 |
--begin-port |
起始端口 | 1688 | 否 |
--data |
数据磁盘路径(建议50G以上) | - | 是 |
--system-data |
系统数据磁盘路径(建议1G以上) | - | 是 |
--disk-found-path |
磁盘发现路径 | /dev/yfs | 否 |
--node / -n |
集群节点数量 | 1 | 是(指定为1) |
-f / --force |
强制执行,不检查主机信息 | false | 否 |
--enable-branch |
启用分支数据库模式 | false | 是(分支部署时) |
安装数据库
使用 yasboot package install 命令将数据库软件包安装到目标机器。
bin/yasboot package install -t hosts.toml -f
参数说明
| 参数 | 说明 | 默认值 | 是否必填 |
|---|---|---|---|
-t / --hosts-file |
指定主机配置文件(hosts.toml) | - | 是 |
-f / --force |
忽略检查错误,强制安装 | false | 否 |
--deps |
指定依赖包路径(.tar.gz) | - | 否 |
创建数据库实例
使用 yasboot cluster deploy 命令完成部署和启动。
bin/yasboot cluster deploy -t yashandb.toml -p passwod --yfs-force-create -d
参数说明
| 参数 | 说明 | 默认值 | 是否必填 |
|---|---|---|---|
-t / --cluster-file |
集群配置文件(yashan.toml) | - | 是 |
-p / --sys-password |
数据库sys用户密码 | - | 是 |
--yfs-force-create |
强制创建YFS磁盘组 | false | 否 |
-d / --dev |
开发模式部署 | false | 否 |
正常成功部署的时候,沙箱就创建成功了。
但不幸的是,我用rhel8.10和rocky linux 9.7都只成功了一次。安装的时候都是报一下错误:
task completed, status: FAILED
retcode: 1
stdout: create branch database
stderr: YAS-00402 failed to connect socket, errno 111, error message "Connection refused"
根据研发小伙伴的反馈,这个时候只要登录数据库,手动创建下就好了。
先导入环境变了
source /data/yashan/yasdb/23.6.0.1/conf/yashandb.bashrc
登录数据库
yasql sys/password@127.0.0:1688
手动创建
create database yashandb enable branch archivelog;
创建成功之后,查看brance
SQL> show branch; BRANCH ---------------------------------------------------------------- MASTER 1 row fetched.
游玩之旅
登录分支
用yasql sys/password@IP:1688/branch登录分支
yasql sys/password@127.0.0:1688
我没写名字,默认登录到ADMIN。
SQL> show branch BRANCH ---------------------------------------------------------------- _ADMIN 1 row fetched.
在ADMIN无法执行创建分支的命令,需要在MASTER创建。
这个时候可以登录到MASTER
yasql sys/password@127.0.0:1688/MASTER
或者用DBMS_BRANCH.CHECKOUT('MASTER')切换到MASTER
SQL> exec DBMS_BRANCH.CHECKOUT('MASTER');
Succeed.
SQL> show branch;
BRANCH
----------------------------------------------------------------
MASTER
1 row fetched.
准备数据
这里随便准备100w的数据
create user test identified by *****;
grant dba to test;
create table test.t1 as select * from dba_tables;
insert into test.t1 select * from test.t1;
insert 多执行几次,让t1表的数据达到100w。
查看当时表的信息
--纪录行数
SQL> select count(*) from test.t1;
COUNT(*)
---------------------
2768896
1 row fetched.
--大小
SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='T1';
SUM(BYTES)/1024/1024
--------------------
439
1 row fetched.
下面进asm看下数据文件
--登录asm yfscmd -D /data/yashan/yasdb/yasdb_data/ycs/ce-1-1/
经过查找,终于到了最终文件的位置在+DG0/containers/MASTER
YFSCMD > ls -l
Type Time Size Space Name
FILE 2026-06-02 13:52:25 24.20MB 25.00MB ctrl1
FILE 2026-06-02 13:52:25 24.20MB 25.00MB ctrl2
FILE 2026-06-02 13:52:26 24.20MB 25.00MB ctrl3
FILE 2026-06-02 13:52:26 64.00MB 64.00MB system
FILE 2026-06-02 13:52:26 64.00MB 64.00MB sysaux
FILE 2026-06-02 13:52:26 64.00MB 64.00MB temp
FILE 2026-06-02 13:52:26 64.00MB 64.00MB swap
FILE 2026-06-02 13:52:26 448.00MB 448.00MB users
FILE 2026-06-02 13:52:26 64.00MB 64.00MB undo
FILE 2026-06-02 13:52:26 128.00MB 128.00MB redo1
FILE 2026-06-02 13:52:26 128.00MB 128.00MB redo2
FILE 2026-06-02 13:52:26 128.00MB 128.00MB redo3
YFSCMD > pwd
+DG0/containers/MASTER/dbfiles
当前没用创建新的表空间,users是448m,跟结果还是相符的。
新建branch
SQL> exec DBMS_BRANCH.CREATE('branch1');
PL/SQL Succeed.
此时创建了一个branch1的分支。
然后我们到ASM看下底层文件,然后发现+DG0/containers/目录下面新增了BRANCH1
YFSCMD > cd +DG0/containers/
YFSCMD > ls
BRANCH$TEMPLATE
MASTER
BRANCH1
看下数据文件大小
YFSCMD > ls -l Type Time Size Space Name FILE 2026-06-02 14:27:25 24.20MB 25.00MB ctrl1 FILE 2026-06-02 14:27:25 24.20MB 25.00MB ctrl2 FILE 2026-06-02 14:27:25 24.20MB 25.00MB ctrl3 FILE 2026-06-02 14:27:25 64.00MB 64.00MB system FILE 2026-06-02 14:27:25 64.00MB 64.00MB sysaux FILE 2026-06-02 14:27:25 64.00MB 64.00MB temp FILE 2026-06-02 14:27:25 64.00MB 64.00MB swap FILE 2026-06-02 14:27:25 448.00MB 448.00MB users FILE 2026-06-02 14:27:25 64.00MB 64.00MB undo FILE 2026-06-02 14:27:26 128.00MB 128.00MB redo1 FILE 2026-06-02 14:27:26 128.00MB 128.00MB redo2 FILE 2026-06-02 14:27:26 128.00MB 128.00MB redo3
跟上面MASTER是一致的。
操作分支
我们登录branch1,查询下数据
[yashan@yashan-db04 install]$ yasql sys/Abcd1234#@172.16.2.91:1688/branch1
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> show branch;
BRANCH
----------------------------------------------------------------
BRANCH1
1 row fetched.
SQL> select count(*) from test.t1;
COUNT(*)
---------------------
2768896
1 row fetched.
在BRANCH1里把数据都删除
SQL> delete test.t1; 2768896 rows affected. SQL> commit; Succeed. SQL> select count(*) from test.t1; COUNT(*) --------------------- 0 1 row fetched.
再去master查询
SQL> show branch; BRANCH ---------------------------------------------------------------- MASTER 1 row fetched. SQL> select count(*) from test.t1; COUNT(*) --------------------- 2768896 1 row fetched.
master里还是2768896。因为使用的是单独的数据文件,所以操作分支,不会影响master。
重置分支
SQL> exec DBMS_BRANCH.RESET('branch1');
YAS-04253 PL/SQL compiling errors:
[1:7] YAS-04323 arguments count must be 0
--重置不能带参数,因此只能去branch1执行
SQL> exec DBMS_BRANCH.checkout('branch1');
Succeed.
SQL> exec DBMS_BRANCH.reset();
Succeed.
再次查询下数据
SQL> show branch; BRANCH ---------------------------------------------------------------- BRANCH1 1 row fetched. SQL> select count(*) from test.t1; COUNT(*) --------------------- 2768896 1 row fetched.
重置是恢复到创建分支时候的状态。
删除分支
SQL> exec DBMS_BRANCH.DELETE('branch1');
YAS-02947 cannot delete current branch
YAS-04015 at line 1
不能登录的分支里删除
SQL> exec DBMS_BRANCH.DELETE('branch1');
PL/SQL Succeed.
看看底层文件
发现目录还在,只剩归档文件。
DIR dbfiles DIR archive DIR backup DIR config DIR local_fs YFSCMD > du Used_MB 128.00
结论
沙箱还是非常有用的特性,期待它的功能得到完善,bug得到修复。未来说需要一个测试环境,或者临时要做一个报表开发需求,可以用它。




