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

崖山数据库沙箱体验分享

原创 曹海峰 2天前
42

前提

最近参与了崖山数据库沙箱体验活动,在这里将我的体验分享一下。

安装前的准备

安装沙箱功能,需要使用单机共享集群的模式,在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得到修复。未来说需要一个测试环境,或者临时要做一个报表开发需求,可以用它。

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

评论