【YashanDB认证】之二:Docker部署一体YashanDB(YDC,YCM)

Docker部署YashanDB一体化方案

前言

        YashanDB是对标Oracle的数据库,深度兼容Oracle。因此在信创运动中备爱广大开发者喜爱,另外笔者对postgresql、yashan、oceandb、mysql9、mysql8、mysql5做过横向性能对比测试,测试结果显示yashandb的性能在千万数据量情况下优于其他几个数据库。因此笔者也很喜欢yashan数据库。而yashandb官方的安装教程来看物理机安装的步骤过于繁杂,而官网虽提供了docker镜像,但ydc和ycm都需要手工另外安装。由于大多数情况下,开发的项目体量都比较小,因此想要一个yashan,ydc,ycm一体的程序应用。
        本文记录用官方的docker镜像和ydc,ycm制作一体的镜像程序的安装过程。这里“一体”的意思是:** 安装yashandb的docker镜像的同时自动将ydc和ycm也装在容器中**,只要docker容器启动,则yashandb和ydc和ycm也同时自动启动。
        本文采用的是龙蜥操作系统+YashanDB 23.4.1.102版本。

想要参加【YashanDB认证】的同学,请移步官网https://www.yashandb.com/YCA_courses了解更多详情。

1、环境准备

1.1 系统与网络

        本文演练环境说明如下:
因本机资源有限,在局域网中另一台windows电脑(实验电脑)上用virtualbox安装龙蜥操作系统8.9 64位。然后在龙蜥系统中安装Docker,再用Docker加载YashanDB镜像安装容器。因此,整个网络的IP整理如下:

电脑名称IP及说明
开发者电脑192.168.1.46
实验电脑192.168.1.58(办公局域网IP)
192.168.56.1(Virtualbox的HostOnly虚拟网关)
龙蜥系统10.0.2.15(NAT网卡)用于访问互联网
192.168.56.112(HostOnly网卡)给宿主访问
172.17.0.1(docker的网关)
YashanDB容器172.17.0.3(容器内部的IP地址)

其中端口映射关系如下:

映射方式宿主子系统用途
nginx192.168.1.58:8228192.168.56.112:8228YDC-Web端口
nginx192.168.1.58:8260192.168.56.112:8260YCM-Web端口
nginx192.168.1.58:8288192.168.56.112:8288YashanDB端口
docker172.17.0.1:8228172.17.0.3:9328YDC-Web端口
docker172.17.0.1:8260172.17.0.3:9060YCM-Web端口
docker172.17.0.1:8288172.17.0.3:1688YashanDB端口

如上所述192.168.56.112和172.17.0.1都是龙蜥系统上的IP地址,因此搭建完成后,从开发者电脑可以直接访问到YashanDB容器中的三个应用。
为了从开发者电脑能够访问到龙蜥系统,需要在实验电脑上安装一个nginx,然后在{nginx目录}/conf/nginx.conf中添加与http平级的配置。如下:

stream {
  upstream anolis2Ydc{
     server 192.168.56.112:8228 weight=1;
  }
  server {
    listen 8228;
    proxy_pass anolis2Ydc;
  }
  upstream anolis2Ycm{
     server 192.168.56.112:8260 weight=1;
  }
  server {
    listen 8260;
    proxy_pass anolis2Ycm;
  }
  upstream anolis2Yashan{
     server 192.168.56.112:8288 weight=1;
  }
  server {
    listen 8288;
    proxy_pass anolis2Yashan;
  }
}

这一步骤先安装一个龙蜥操作系统,并用root用户在其上创建shell用户anolis。熟悉虚拟机的朋友可以在操作系统安装的过程中完成root帐号和密码设置,以及创建anolis用户。
这些是前置条件,龙蜥操作系统的安装步骤请读者自行百度,并在windows电脑上用virtualbox安装好龙蜥操作系统8.9 64位。
安装完成后,在设置窗口中进行网络设置。示例如下:
网卡1NAT:主虚拟机可以连接外网。
网卡2Host-Only:是让宿主要可以通过网络访问虚拟机。
在这里插入图片描述
在这里插入图片描述
开机后登录root用户,并通过修改host-only的网卡配置,为其设置固定IP。
vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
输入以下内容并保存

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
# 静态 IP
BOOTPROTO=static
DEFROUTE=yes
# 与宿主机同网段,如 192.168.56.x(x≠1,避免冲突)
IPADDR=192.168.56.112  
NETMASK=255.255.255.0
# 与宿主机 Host-Only 网关一致
GATEWAY=192.168.56.1

NAME=enp0s8
UUID=655ce8a3-3cc4-4a6b-b1fc-26d9ab1d4ec3
DEVICE=enp0s8
ONBOOT=yes

** 注意:这里有个UUID参数,通常复制一个然后改掉其中任意一个字符,使得它在整个网络环境中唯一即可。**

重启网卡

nmcli c reload
nmcli c up enp0s8

1.2、创建shell用户

在操作系统安装过程中已经设置好帐号的同学,可跳过此步骤,但仍然要验证anolis用户是否可以通过shell远程。
通常情况下linux的root用户不应开放shell远程,为贴近生产环境的使用场景。
这里用root创建一个远程用户。用户名anolis,密码:AnoUser,.()
在这里插入图片描述
在virtualbox的窗口中进入terminal,登录root用户并执行:
#创建用户anolis同时强制创建/home/anolis目录
useradd -m anolis
#设置anolis用户的密码
passwd anolis
这里提示New password:或Retype new password:时输入AnoUser,.()然后按回车即可。

继续执行以下命令:
#加入wheel组。多数linux发行版中,wheel组是预定义的“sudo特权组”,加入该组的用户可通过sudo进行提权。
usermod -aG wheel anolis
#linux的用户默认不允许通过shell远程连接需要开放权限
#授予ssh登录权限
vim /etc/ssh/sshd_config
#查找以下行,如果不存在则添加到文件末尾。
AllowUsers anolis
#重启ssh服务:使配置生效
systemctl restart sshd
#创建目录用来存放程序包
mkdir -p /data/yaspack
chmod -R 777 /data/yaspack

1.3工具包下载

在下载页https://download.yashandb.com/download 下载以下程序包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

软件包名说明
yashandb-image-23.4.1.102-linux-x86_64.tar.gzdocker镜像
ydc-web-v23.4.1.2-linux-x86_64.tar.gzydc程序,一个执行sql语句的可视化工具。
yashandb-cloud-manager-23.4.1.3-linux-x86_64.tar.gzyashandb云管理器,用于定期备份等。

将下载的文件上传到/data/yaspack目录,如下图:
在这里插入图片描述

1.4安装docker

# 1. 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 2. 添加阿里云Docker仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 3. 更新yum缓存
sudo yum makecache
# 4. 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 5. 启动服务
sudo systemctl start docker
sudo systemctl enable docker

2、YashanDB安装

2.1 Docker安装(无ydc,ycm)

说明:这一步的目的是通过手工执行yashandb的容器,得到镜像内部的entrypoint.sh文件。无需安装ydc或ycm。记录此步骤只是为了复现完整的步骤,让读者知晓来龙去脉。只要结果的同学可直接跳到2.2章节。
在开发者电脑上用shell工具远程连接实验电脑。

#进入镜像文件目录
cd /data/yaspack
#加载镜像
sudo docker load < yashandb-image-23.4.1.102-linux-x86_64.tar.gz
#执行目录删除与重建(这里先删除目录,是为了使整个脚本可以反复执行)
sudo rm -rf /data/docker-data/yashan_23_4_1_102/
sudo mkdir -p /data/docker-data/yashan_23_4_1_102/
sudo mkdir -p /data/docker-data/yashan_23_4_1_102/data
sudo mkdir -p /data/docker-data/yashan_23_4_1_102/tmp/
sudo mkdir -p /data/docker-data/yashan_23_4_1_102/scripts/
sudo chmod -R 777 /data/docker-data/yashan_23_4_1_102/

执行docker run如下:

sudo docker run -d \
  -it \
  -p 8188:1688 \
  -p 8128:9328 \
  -p 8160:9060 \
  --dns 8.8.8.8 \
  --dns 114.114.114.114 \
  --name yashan_23_4_1_102 \
  -v /data/docker-data/yashan_23_4_1_102/tmp/:/tmp/ \
  -v /data/docker-data/yashan_23_4_1_102/data/:/data/yashan/ \
  -e SYS_PASSWD=AnoUser1234+ \
  yashandb:yashandb-image-23.4.1.102-linux-x86_64 

查看docker日志:

sudo docker logs yashan_23_4_1_102 -f 

返回task completed表示安装成功,如下图:
在这里插入图片描述

2.2 Docker一体安装(YDC,YCM)

2.2.1 准备entrypoint.sh脚本

其实我们可以通过手工安装的方式将ydc,ycm复制到容器内部去安装,但存在一些使用不便的情况:假设yashandb的docker容器重启,此时需要重新执行docker exec -it {容器名} /bin/bash手工进入容器并执行命令将ydc拉起,这在实际使用中非常不便。假设在开发环境下,通过ydc管理N多个yashan数据库实例当然ydc只需要部署一个实例即可,这是非常便利的。但是实际投产的时候,大多数情况下我的项目都比较小,快速高效解决部署时各种环境问题才是正道。因此我希望ydc,ycm能够随yashandb实例启动或停止。这也是编写本文的最终目的。
要想在不修改镜像的情况下实现我们的需求,只需要在docker start {容器名}启动docker容器的同时执行一段写好的程序逻辑即可。当然不嫌麻烦的同学也可以只装yashan容器,然后进入容器中去修改entrypoint.sh,本文是将其复制出来修改并挂载到宿主目录,所有步骤行云流水,一步到位。

其实docker run这个命令,最后一个参数可以是/bin/bash,它有两种写法:
** /bin/bash ** 则docker run或docker start {xxx}后都会自动执行** /bin/bash 这个程序。
** /bin/bash xxx.sh ** 则docker run或docker start {xxx}后都会自动执行
/bin/bash xxx.sh 这个命令。
由此可看出假设docker run的时候最后一个命令写的是/bin/bash,则docker start {xxx}后进程总是会自动退出。因为/bin/bash不是一个服务只是开了一个/bin/bash进程。
** 而/bin/bash xxx.sh则不同,这里的xxx.sh可以是我们自己写的脚本,只需要在该脚本的末尾写一个死循环,就可以保证容器进程不会自动退出。

先用docker history {镜像名}查看一个yashandb的镜像挂载的.sh脚本。这里需要用到“镜像名”,可通过sudo docker ps查看,返回结果有一个COMMAND字段即是入口脚本。如下:
在这里插入图片描述
注:这里的容器名是IMAGE字段值:** yashandb:yashandb-image-23.4.1.102-linux-x86_64**
继续执行

docker history yashandb:yashandb-image-23.4.1.102-linux-x86_64

将返回内容贴到notepad++可看到,挂载脚本全路径:/usr/local/bin/entrypoint.sh如下:
在这里插入图片描述
以下命令在宿主的shell窗口执行

#复制挂载的脚本到宿主的/data/yaspack
docker cp yashan_23_4_1_102:/usr/local/bin/entrypoint.sh /data/yaspack/entrypoint.sh

得到的文件原始内容如下:

#!/bin/bash

set -e

is_init() {
    [ ! -f "/home/yashan/.yasboot/yashandb.env" ]
}

stop() {
    echo "stop"

    if [ ! -d "/data/yashan/yasdb_home" ]; then
        return
    fi

    cd /data/yashan/yasdb_home
    
    ./bin/yasboot process yasdb stop -c yashandb
    ./bin/yasboot process yasom stop -c yashandb
    ./bin/yasboot process yasagent stop -c yashandb

    exit 0
}

trap "stop" SIGTERM

init() {
    echo "init"

    PASSWORD="$SYS_PASSWD"

    if [ -z "$SYS_PASSWD" ]; then
        echo "enviroment SYS_PASSWD should not be empty"
        exit 1
    fi

    # 安装数据库
    if [ ! -d "/data/yashan" ]; then
        sudo mkdir -p /data/yashan
    fi

    sudo chown yashan:yashan /data/yashan
    mkdir /data/yashan/yasdb_home
    mkdir /data/yashan/yasdb_data
    mv /home/yashan/yashandb-*.tar.gz /data/yashan/yasdb_home
    cd /data/yashan/yasdb_home
    ls yashandb-*.tar.gz | xargs -n1 tar -zxf
    deps_path="/data/yashan/yasdb_home/yashandb-deps-*.tar.gz"
    plugin_path="/data/yashan/yasdb_home/yashandb-plugins-*.tar.gz"
    if [ -f $deps_path ]; then
        file_name=$(basename $deps_path)
        install_args=$install_args" --deps $file_name"
    fi
    if [ -f $plugin_path ]; then
        file_name=$(basename $plugin_path)
        install_args=$install_args" --plugin $file_name"
    fi

    ./bin/yasboot package se gen -c yashandb -L --listen-cidr 0.0.0.0 --data-path /data/yashan/yasdb_data
    set_config
    if [ -z "$install_args" ]; then
        ./bin/yasboot package install -t hosts.toml
    else
        ./bin/yasboot package install -t hosts.toml $install_args
    fi
    ./bin/yasboot cluster deploy -t yashandb.toml --sys-password "$PASSWORD"

    cat ~/.yasboot/yashandb_yasdb_home/conf/yashandb.bashrc >> ~/.bashrc
    source ~/.bashrc
}

set_config() {
    # 如果存在,则修改;如果不存在,则插入
    if [ -n "$DB_BLOCK_SIZE" ]; then
        if grep "DB_BLOCK_SIZE" yashandb.toml; then
            sed -i "s/DB_BLOCK_SIZE.*/DB_BLOCK_SIZE=\"$DB_BLOCK_SIZE\"/g" yashandb.toml
        else
            sed -i "/\\[group.node.config\\]/a\DB_BLOCK_SIZE=\"$DB_BLOCK_SIZE\"" yashandb.toml
        fi
    fi

    for enviroment in $(env | grep YAS_); do
        if [[ $enviroment == YAS_* ]]; then
            env_key=$(echo "$enviroment" | awk -F"=" '{print $1}')
            key=$(echo ${env_key#*YAS_})
            val=$(echo "$enviroment" | awk -F"=" '{print $2}')
            if grep "$key" yashandb.toml; then
                sed -i "s/$key.*/$key=\"$val\"/g" yashandb.toml
            else
                sed -i "/\\[group.config\\]/a\\$key=\"$val\"" yashandb.toml
            fi
        fi
    done
}

reload() {
    echo "reload"
    cd /data/yashan/yasdb_home
    ./bin/yasboot process yasom start -c yashandb
    ./bin/yasboot process yasagent start -c yashandb
    ./bin/yasboot cluster start -c yashandb
}

if is_init; then
    init
else
    reload
fi

while true; do
    sleep 1
done

以上脚本逻辑有点长,有兴趣的朋友可以细读。这里我们抓住几个关键点即可。
1、init函数,执行yashandb数据库的安装。
2、reload函数,执行yasboot命令启动yashandb数据库。
3、is_init函数,用于判断是否第一次运行此脚本。
是第一次执行,则调用init方法。
不是第一次执行,则调用reload就去。
4、文件末尾通过一个while死循环,防止进程退出。
来到这里,我们要做的事情其实很简单,就是把前面手工安装ydc、ycm的步骤,嵌入到这个脚本的逻辑中。
得到了entrypoint.sh文件后,前面安装的那个yashandb镜像已经没用了.可将其删除。

#卸载容器
docker rm -f yashan_23_4_1_102
#删除数据库文件夹
sudo rm -rf /data/docker-data/yashan_23_4_1_102/

2.2.2 执行安装

#目录准备
sudo rm -rf /data/docker-data/yashan_23_4_1_102_YdcYcm/
sudo mkdir -p /data/docker-data/yashan_23_4_1_102_YdcYcm/
sudo mkdir -p /data/docker-data/yashan_23_4_1_102_YdcYcm/data/yasdb-backup
sudo mkdir -p /data/docker-data/yashan_23_4_1_102_YdcYcm/tmp/
sudo mkdir -p /data/docker-data/yashan_23_4_1_102_YdcYcm/scripts/
#开放权限,使得shell工具可以上传文件到/tmp/
sudo chmod -R 777 /data/docker-data/yashan_23_4_1_102_YdcYcm/
将ydc-web-v23.4.1.2-linux-x86_64.tar.gz、yashandb-cloud-manager-23.4.1.3-linux-x86_64.tar.gz、yashandb-cloud-manager-23.4.1.3-linux-x86_64.tar.gz三个文件上传到/data/docker-data/yashan_23_4_1_102_YdcYcm/tmp/目录中。

#创建阿里云镜像文件,用于重置容器内部的软件仓库镜像
sudo vi /data/docker-data/yashan_23_4_1_102_YdcYcm/tmp/CentOS-Aliyun.repo

输入以下内容并保存:

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#
 
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#released updates 
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

注:粘贴并保存后,请再次执行vi命令,查看文件头内容是否正确。

sudo vi /data/docker-data/yashan_23_4_1_102_YdcYcm/scripts/entrypoint.sh

粘贴以下修改好的entrypoint.sh内容:

#!/bin/bash
set -e  # Exit immediately if any command exits with a non-zero status

echo ""
echo "=== entrypoint.sh run by user:$(whoami) , uid:$(id -u) ==="
echo ""

# Log function: standardize log format for easier troubleshooting (added)

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

is_init() {
    # Check if initialization is needed (first run)
    [ ! -f "/home/yashan/.yasboot/yashandb.env" ]
}

stop() {
    log "Stopping services (SIGTERM signal received)"

    if [ ! -d "/data/yashan/yasdb_home" ]; then
        log "Database directory /data/yashan/yasdb_home does not exist, no need to stop"
        return
    fi

    cd /data/yashan/yasdb_home
    log "Stopping yasdb service"
    ./bin/yasboot process yasdb stop -c yashandb
    log "Stopping yasom service"
    ./bin/yasboot process yasom stop -c yashandb
    log "Stopping yasagent service"
    ./bin/yasboot process yasagent stop -c yashandb

    exit 0
}

# Trap container stop signal (e.g., docker stop) to perform graceful shutdown
trap "stop" SIGTERM

init() {
    log "init"

    PASSWORD="$SYS_PASSWD"
    if [ -z "$SYS_PASSWD" ]; then
        log "enviroment SYS_PASSWD should not be empty"
        exit 1  # Critical variable missing, exit immediately
    fi

    # Install database
    if [ ! -d "/data/yashan" ]; then
        log "Creating database root directory /data/yashan"
        sudo mkdir -p /data/yashan  # Use sudo to ensure permissions (yashan has passwordless sudo)
    fi

    log "Setting permissions for /data/yashan to yashan:yashan"
    sudo chown yashan:yashan /data/yashan
    # Create necessary directories in one command
    mkdir /data/yashan/yasdb_home
    mkdir /data/yashan/yasdb_data
    # Move database tar package (handle possible multiple packages, avoid xargs issues)
    mv /home/yashan/yashandb-*.tar.gz /data/yashan/yasdb_home
    cd /data/yashan/yasdb_home
    log "Extracting database tar package"
    ls yashandb-*.tar.gz | xargs -n1 tar -zxf

    # Process dependency packages and plugin packages (fix unquoted variable issue)
    deps_path="/data/yashan/yasdb_home/yashandb-deps-*.tar.gz"
    plugin_path="/data/yashan/yasdb_home/yashandb-plugins-*.tar.gz"
    if [ -f $deps_path ]; then
        file_name=$(basename $deps_path)
        install_args=$install_args" --deps $file_name"
    fi
    if [ -f $plugin_path ]; then
        file_name=$(basename $plugin_path)
        install_args=$install_args" --plugin $file_name"
    fi

    # Generate configuration and install database (add logs for clarity)
    log "Generating database configuration file (listen-cidr: 0.0.0.0, data path: /data/yashan/yasdb_data)"
    ./bin/yasboot package se gen -c yashandb -L --listen-cidr 0.0.0.0 --data-path /data/yashan/yasdb_data
    
    log "Executing database configuration adjustments (set_config function)"
    set_config
    
    log "Installing database (installation parameters: $install_args)"
    if [ -z "$install_args" ]; then
        ./bin/yasboot package install -t hosts.toml
    else
        ./bin/yasboot package install -t hosts.toml $install_args
    fi

    log "Deploying database cluster (configuring system password with SYS_PASSWD)"
    ./bin/yasboot cluster deploy -t yashandb.toml --sys-password "$PASSWORD"

    # Configure environment variables (add logs to confirm execution)
    log "Adding database environment variables to ~/.bashrc"
    cat ~/.yasboot/yashandb_yasdb_home/conf/yashandb.bashrc >> ~/.bashrc
    source ~/.bashrc  # Apply environment variables
    log "Database initialization process completed"
}

set_config() {
    log "Entering set_config function to adjust database configuration"
    # Modify DB_BLOCK_SIZE (fix sed escape issue, add logs)
    if [ -n "$DB_BLOCK_SIZE" ]; then
        log "Adjusting configuration: DB_BLOCK_SIZE = $DB_BLOCK_SIZE"
        if grep "DB_BLOCK_SIZE" yashandb.toml; then
            sed -i "s/DB_BLOCK_SIZE.*/DB_BLOCK_SIZE=\"$DB_BLOCK_SIZE\"/g" yashandb.toml
        else
            # Fix sed newline escape (original script missing backslash, causing insertion failure)
            sed -i "/\\[group.node.config\\]/a\DB_BLOCK_SIZE=\"$DB_BLOCK_SIZE\"" yashandb.toml
        fi
    fi

    # Process environment variables with YAS_ prefix (fix variable references, add logs)
    for enviroment in $(env | grep YAS_); do
        if [[ $enviroment == YAS_* ]]; then
            env_key=$(echo "$enviroment" | awk -F"=" '{print $1}')
            key=$(echo ${env_key#*YAS_})
            val=$(echo "$enviroment" | awk -F"=" '{print $2}')
            if grep "$key" yashandb.toml; then
                sed -i "s/$key.*/$key=\"$val\"/g" yashandb.toml
            else
                sed -i "/\\[group.config\\]/a\\$key=\"$val\"" yashandb.toml
            fi
        fi
    done
}

reload() {
    log "reload"
    cd /data/yashan/yasdb_home
    log "Starting yasom service"
    ./bin/yasboot process yasom start -c yashandb
    log "Starting yasagent service"
    ./bin/yasboot process yasagent start -c yashandb
    log "Starting yasdb cluster"
    ./bin/yasboot cluster start -c yashandb
    log "Database restart process completed"
}

YDC_SERVER_DIR="/usr/local/yashan-ydc"
YDC_SERVER_PATH="$YDC_SERVER_DIR/start_server.sh"
YCM_INSTALL_PATH="$HOME/ycm"
# 创建目录并设置权限,忽略所有错误
mkdir -p /tmp/log
sudo mkdir -p /usr/share/info
sudo chmod -R 777 /usr/share/info 2>/dev/null || true

set_aliyun_repo(){
  #将镜像更改为阿里云
  #------------------------------------------------------
  #检测repo路径变量是否非空,在docker run时传入
  if [ -n "$REPO_PATH" ]; then
    log " get REPO_PATH $REPO_PATH "
    #检测路径变量值指向的文件是否存在。
    if [ -f "$REPO_PATH" ]; then
      sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
      sudo cp -f "$REPO_PATH" /etc/yum.repos.d/CentOS-Base.repo
    fi
  fi
}

install_sshd(){
  #------------------------------------------------------
  log "install and set ssh"
  log "sudo yum install -q -y openssh-server openssh-clients 2>&1 | tee -a /tmp/log/yum_install.log"
  # 1. 先更新 yum 缓存并重试安装(解决网络超时问题)
  # 初始化标志变量
  has_errors=false
  for i in {1..3}; do
      echo "=== Installation attempt $i started at $(date) ===" >> /tmp/log/yum_install.log
      
      if sudo yum install -q -y vim openssh-server openssh-clients >> /tmp/log/yum_install.log 2>&1; then
          echo "✅ Installation successful on attempt $i" >> /tmp/log/yum_install.log
          
          # 检查之前是否有过错误
          if $has_errors; then
              echo "💡 yum install 最终成功,以上错误可忽略!" >> /tmp/log/yum_install.log
          fi
          break
      else
          echo "❌ Attempt $i failed at $(date)" >> /tmp/log/yum_install.log
          has_errors=true
          sleep 5
          
          # 如果是最后一次尝试且仍然失败
          if [ $i -eq 3 ]; then
              echo "💥 ERROR: All installation attempts failed. Exiting." >> /tmp/log/yum_install.log
              exit 1
          fi
      fi
  done
  #2.使用双引号和转义创建 .vimrc 文件
  log "Creating .vimrc for yashan user..."
  sudo -u yashan bash -c "echo '\" Vim' > /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo 'set encoding=utf-8' >> /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo '\" unicode encoding list . first left to right' >> /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo 'set fileencodings=utf-8,gbk,gb2312,cp936' >> /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo '\" terminal'\''s encoding' >> /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo 'set termencoding=utf-8' >> /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo '\" line end char' >> /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo 'set fileformats=unix,dos' >> /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo '\" menu'\''s encoding' >> /home/yashan/.vimrc"
  sudo -u yashan bash -c "echo 'set langmenu=zh_CN.UTF-8' >> /home/yashan/.vimrc"

  # 3. 修正权限和 source 命令
  log "Setting permissions and applying vimrc..."
  sudo chown yashan:yashan /home/yashan/.vimrc
  sudo -u yashan bash -c "source /home/yashan/.vimrc" 2>/dev/null || true

  # 生成所有必需的 SSH 主机密钥
  sudo ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" > /dev/null
  sudo ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" > /dev/null
  sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" > /dev/null

  # 设置正确的权限
  sudo chmod 600 /etc/ssh/ssh_host_*_key
  sudo chmod 644 /etc/ssh/ssh_host_*_key.pub

  # 现在启动 SSH 服务
  sudo mkdir /var/run/sshd
  sudo chmod 0755 /var/run/sshd
  
  sudo sh -c "echo 'PermitRootLogin no' >> /etc/ssh/sshd_config"
  sudo sh -c "echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config"
  sudo sh -c "echo 'AllowUsers yashan' >> /etc/ssh/sshd_config"
  # 5. 修改默认路径
  sudo sh -c "echo 'cd /home/yashan' >> /home/yashan/.bashrc" 
}
install_ycm(){
  #复制文件到/home/yashan目录
  #install ycm auto
  #------------------------------------------------------
  log "installing ycm ..."
  #检测ycm的安装包路径变量是否非空,在docker run时传入
  if [ ! -n "$YCM_PACKAGE_PATH" ]; then
    log "no YCM_PACKAGE_PATH argument.ycm not installed!"
    return 0
  fi
  log " get YCM_PACKAGE_PATH $YCM_INSTALL_PATH "
  #检测路径变量值指向的文件是否存在。
  if [ ! -f "$YCM_PACKAGE_PATH" ]; then
     log "path $YCM_PACKAGE_PATH not exists!"
     return 0
  fi
  log " $YCM_PACKAGE_PATH exists !"
  #-C指向/home/yashan解压后得到/home/yashan/ycm
  log "tar -xzxf $YCM_PACKAGE_PATH -C $HOME" 
  tar -xzxf "$YCM_PACKAGE_PATH" -C "$HOME" 

  log "cd $YCM_INSTALL_PATH"
  cd "$YCM_INSTALL_PATH"

  # 验证当前目录
  CURRENT_DIR=$(pwd)
  log "pwd path: $CURRENT_DIR"

  # 检查关键文件是否存在
  if [ ! -f "./ycm-init" ]; then
    log "error: $CURRENT_DIR/ycm-init not exists"
    exit 1
  fi

  # 检查执行权限
  if [ ! -x "./ycm-init" ]; then
    log "set permission to $CURRENT_DIR/ycm-init: chmod +x ./ycm-init"
    chmod +x ./ycm-init
  fi

  # 检查配置文件
  if [ ! -f "./etc/deploy.yml" ]; then
    log "error: $CURRENT_DIR/etc/deploy.yml not exists"
    log "Items in $CURRENT_DIR/etc:"
    ls -la etc/
    exit 1
  fi

  log "sudo mkdir -p /opt/ycm/ && sudo chmod -R 777 /opt/ycm/ && sudo mkdir -p /tmp/log && sudo chmod -R 777 /tmp/log"
  sudo mkdir -p /opt/ycm/ && sudo chmod -R 777 /opt/ycm/ && sudo mkdir -p /tmp/log && sudo chmod -R 777 /tmp/log
  log "sudo ./ycm-init deploy --conf ./etc/deploy.yml  > /tmp/log/ycm-install.log "
  sudo ./ycm-init deploy --conf ./etc/deploy.yml  > /tmp/log/ycm-install.log

  log "sudo chmod +x /etc/rc.local"
  sudo chmod +x /etc/rc.local 
  log "ycm install successfully!"   
  #------------------------------------------------------
}
install_ydc(){
  #install ydc auto
  #------------------------------------------------------
  log "install ydc ..."   
  #检测ydc的安装包路径变量是否非空,在docker run时传入
  if [ ! -n "$YDC_PACKAGE_PATH" ]; then
    log "no YDC_PACKAGE_PATH argument.ydc not installed!"
    return 0
  fi
  log " get YDC_PACKAGE_PATH $YDC_PACKAGE_PATH"
  #检测路径变量值指向的文件是否存在。
  if [ ! -f "$YDC_PACKAGE_PATH" ]; then
    log "path $YDC_PACKAGE_PATH not exists!"
    return 0
  fi
  log " $YDC_PACKAGE_PATH exists !" 
  log "sudo mkdir -p $YDC_SERVER_DIR"
  sudo mkdir -p "$YDC_SERVER_DIR"
  log "sudo chown -R yashan:yashan $YDC_SERVER_DIR"
  sudo chown -R yashan:yashan "$YDC_SERVER_DIR"
  log "tar -zxf $YDC_PACKAGE_PATH -C $YDC_SERVER_DIR"
  tar -zxf "$YDC_PACKAGE_PATH" -C "$YDC_SERVER_DIR" 
  sudo chmod +x "$YDC_SERVER_PATH"
  log "ydc install successfully!"
  #------------------------------------------------------
}
start_sshd() {
  #------------------------------------------------------
  #auto start sshd
  #------------------------------------------------------
  if [ ! -f "/usr/sbin/sshd" ]; then  
    log "/usr/sbin/sshd not found,sshd not started"
    return 0
  fi 
  #以后台进程方式拉起ydc
  sudo /usr/sbin/sshd
  log "SSHD START SUCCESS"
  #------------------------------------------------------
}

start_ycm() {
  #auto start ycm
  #------------------------------------------------------
  if [ ! -d "$YCM_INSTALL_PATH" ]; then 
    log "$YCM_INSTALL_PATH not found,ycm not started"
    return 0
  fi
  sudo /etc/rc.local
  log "YCM START SUCCESS"
  #------------------------------------------------------
}

start_ydc(){
  #auto start ydc
  #------------------------------------------------------
  if [ ! -f "$YDC_SERVER_PATH" ]; then 
    log "$YDC_SERVER_PATH not found,ydc not started"
    return 0
  fi
  log "cd $YDC_SERVER_DIR && /bin/bash $YDC_SERVER_PATH &"
  #以后台进程方式拉起ydc
  cd "$YDC_SERVER_DIR" && sudo /bin/bash "$YDC_SERVER_PATH" &
  log "YDC START SUCCESS"
}


log "HOME=$HOME"
if is_init; then
  init
  log "set mirror to aliyum ..."   

  set_aliyun_repo
  install_sshd
  install_ycm
  install_ydc
  
  start_sshd
  start_ycm
  start_ydc
else
  reload

  start_sshd
  start_ycm
  start_ydc
fi 

# -------------------------- Keep container running --------------------------
log "All processes completed, keeping container running in background (PID 1 blocking)"
while true; do
    sleep 3600  # Wake up every hour to avoid being marked as zombie process (more efficient than sleep 1)
done

注:以上脚本是在原始脚本基础上添加了install_xxx和start_xxx函数。
感兴趣的同学可用差异对比工具来查看我添加了什么内容。
粘贴并保存后,请再次执行vi命令,查看文件头内容是否正确。

#再次授权,确保在安装容器过程中不会出现权限问题
sudo chmod -R 777 /data/docker-data/yashan_23_4_1_102_YdcYcm/

执行docker run如下:

sudo docker run -d \
  -it \
  -p 8288:1688 \
  -p 8228:9328 \
  -p 8260:9060 \
  --dns 8.8.8.8 \
  --dns 114.114.114.114 \
  --name yashan_23_4_1_102_YdcYcm \
  -v /data/docker-data/yashan_23_4_1_102_YdcYcm/tmp/:/tmp/ \
  -v /data/docker-data/yashan_23_4_1_102_YdcYcm/data/:/data/yashan/ \
  -v /data/docker-data/yashan_23_4_1_102_YdcYcm/scripts/entrypoint.sh:/usr/local/bin/entrypoint.sh \
  -e YDC_PACKAGE_PATH=/tmp/ydc-web-v23.4.1.2-linux-x86_64.tar.gz \
  -e YCM_PACKAGE_PATH=/tmp/yashandb-cloud-manager-23.4.1.3-linux-x86_64.tar.gz \
  -e REPO_PATH=/tmp/CentOS-Aliyun.repo \
  -e SYS_PASSWD=AnoUser1234+ \
  yashandb:yashandb-image-23.4.1.102-linux-x86_64 

查看安装进度日志

sudo docker logs yashan_23_4_1_102_YdcYcm -f 

返回task completed, status: SUCCESS表示yashan数据库安装成功。
返回ycm install successfully!表示ycm安装成功。
返回
ydc install successfully!表示ydc安装成功。
安装完成后,自动会拉起
sshd,ydc,ycm
如日志所示:

=== entrypoint.sh run by user:yashan , uid:1000 ===

[2025-10-29 14:22:48] HOME=/home/yashan
[2025-10-29 14:22:48] init
[2025-10-29 14:22:48] Setting permissions for /data/yashan to yashan:yashan
[2025-10-29 14:22:49] Extracting database tar package
[2025-10-29 14:22:51] Generating database configuration file (listen-cidr: 0.0.0.0, data path: /data/yashan/yasdb_data)

+------------------------------------------------------------------------------------------------------+
| hostid   | group | node_type | node_name | listen_addr  | replication_addr | data_path               |
+------------------------------------------------------------------------------------------------------+
| host0001 | dbg1  | db        | 1-1       | 0.0.0.0:1688 | 127.0.0.1:1689   | /data/yashan/yasdb_data |
+----------+-------+-----------+-----------+--------------+------------------+-------------------------+

Generate config completed
[2025-10-29 14:22:53] Executing database configuration adjustments (set_config function)
[2025-10-29 14:22:53] Entering set_config function to adjust database configuration
[2025-10-29 14:22:54] Installing database (installation parameters: )
checking install profile.toml...
install version: yashandb 23.4.1.102
update host to yasom...
[2025-10-29 14:23:22] Deploying database cluster (configuring system password with SYS_PASSWD)
+------------------------------------------------------------------------------------------------------------+
| type | uuid             | name               | hostid | index    | status  | return_code | progress | cost |
+------------------------------------------------------------------------------------------------------------+
| task | e41a90d8385927bf | DeployYasdbCluster | -      | yashandb | SUCCESS | 0           | 100      | 258  |
+------+------------------+--------------------+--------+----------+---------+-------------+----------+------+
task completed, status: SUCCESS
[2025-10-29 14:27:41] Adding database environment variables to ~/.bashrc
[2025-10-29 14:27:41] Database initialization process completed
[2025-10-29 14:27:41] set mirror to aliyum ...
[2025-10-29 14:27:41]  get REPO_PATH /tmp/CentOS-Aliyun.repo 
[2025-10-29 14:27:41] install and set ssh
[2025-10-29 14:27:41] sudo yum install -q -y openssh-server openssh-clients 2>&1 | tee -a /tmp/log/yum_install.log
[2025-10-29 14:29:50] Creating .vimrc for yashan user...
[2025-10-29 14:29:50] Setting permissions and applying vimrc...
[2025-10-29 14:29:51] installing ycm ...
[2025-10-29 14:29:51]  get YCM_PACKAGE_PATH /home/yashan/ycm 
[2025-10-29 14:29:51]  /tmp/yashandb-cloud-manager-23.4.1.3-linux-x86_64.tar.gz exists !
[2025-10-29 14:29:51] tar -xzxf /tmp/yashandb-cloud-manager-23.4.1.3-linux-x86_64.tar.gz -C /home/yashan
[2025-10-29 14:29:54] cd /home/yashan/ycm
[2025-10-29 14:29:54] pwd path: /home/yashan/ycm
[2025-10-29 14:29:54] sudo mkdir -p /opt/ycm/ && sudo chmod -R 777 /opt/ycm/ && sudo mkdir -p /tmp/log && sudo chmod -R 777 /tmp/log
[2025-10-29 14:29:54] sudo ./ycm-init deploy --conf ./etc/deploy.yml  > /tmp/log/ycm-install.log 
[2025-10-29 14:30:49] sudo chmod +x /etc/rc.local
[2025-10-29 14:30:49] ycm install successfully!
[2025-10-29 14:30:49] install ydc ...
[2025-10-29 14:30:49]  get YDC_PACKAGE_PATH /tmp/ydc-web-v23.4.1.2-linux-x86_64.tar.gz
[2025-10-29 14:30:49]  /tmp/ydc-web-v23.4.1.2-linux-x86_64.tar.gz exists !
[2025-10-29 14:30:49] sudo mkdir -p /usr/local/yashan-ydc
[2025-10-29 14:30:49] sudo chown -R yashan:yashan /usr/local/yashan-ydc
[2025-10-29 14:30:49] tar -zxf /tmp/ydc-web-v23.4.1.2-linux-x86_64.tar.gz -C /usr/local/yashan-ydc
[2025-10-29 14:30:50] ydc install successfully!
[2025-10-29 14:30:50] SSHD START SUCCESS
Monit daemon with PID 631 awakened
Monit daemon with PID 631 awakened
[2025-10-29 14:30:51] YCM START SUCCESS
[2025-10-29 14:30:51] cd /usr/local/yashan-ydc && /bin/bash /usr/local/yashan-ydc/start_server.sh &
[2025-10-29 14:30:51] YDC START SUCCESS
[2025-10-29 14:30:51] All processes completed, keeping container running in background (PID 1 blocking)

2.2.3 验证YashanDB

#重启容器,使得它解决reload分支拉起ydc和ycm服务
sudo docker restart yashan_23_4_1_102_YdcYcm
#继续执行查看日志命令
sudo docker logs yashan_23_4_1_102_YdcYcm -f

日志末尾返回task completed, status: SUCCESS表示YashanDB启动成功。
返回SSHD START SUCCESS表示sshd启动成功。
返回YCM START SUCCESS 表示ycm启动成功。
返回YDC START SUCCESS 表示ydc启动成功。

=== entrypoint.sh run by user:yashan , uid:1000 ===

[2025-10-29 15:06:20] HOME=/home/yashan
[2025-10-29 15:06:20] reload
[2025-10-29 15:06:20] Starting yasom service
start yasom successfully
[2025-10-29 15:06:21] Starting yasagent service
start local agent successfully!
[2025-10-29 15:06:22] Starting yasdb cluster
+-----------------------------------------------------------------------------------------------------------+
| type | uuid             | name              | hostid | index    | status  | return_code | progress | cost |
+-----------------------------------------------------------------------------------------------------------+
| task | 177ec554d509be45 | StartYasdbCluster | -      | yashandb | SUCCESS | 0           | 100      | 17   |
+------+------------------+-------------------+--------+----------+---------+-------------+----------+------+
task completed, status: SUCCESS
[2025-10-29 15:06:41] Database restart process completed
[2025-10-29 15:06:41] SSHD START SUCCESS
Starting Monit 5.29.0 daemon with http interface at /opt/ycm/ycm/monit/data/run/monit.sock
Monit daemon with PID 191 awakened
[2025-10-29 15:06:41] YCM START SUCCESS
[2025-10-29 15:06:41] cd /usr/local/yashan-ydc && /bin/bash /usr/local/yashan-ydc/start_server.sh &
[2025-10-29 15:06:41] YDC START SUCCESS
[2025-10-29 15:06:41] All processes completed, keeping container running in background (PID 1 blocking)
2025-10-29 15:06:41 INFO   [console] ydc.go:98 loading: /usr/local/yashan-ydc/etc/ydc.toml
2025-10-29 15:06:41 INFO   [console] yasldr.go:89 loading: /usr/local/yashan-ydc/etc/yasldr.toml

修改容器内部yashan用户的密码为:AnoUser1234,.+

#进入容器的shell
sudo docker exec -it yashan_23_4_1_102_YdcYcm /bin/bash
先切换到root用户
sudo su -
#设置yashan用户的密码
passwd yashan

当提示**New password:Retype new password:时,请输入AnoOs,.+**并按回车。

#登录yashan用户sys
yasql sys/AnoUser1234+
--执行测试语句
select database_name from v$database;

返回以下信息表示成功

DATABASE_NAME                                                    
---------------------------------------------------------------- 
yashandb                                                       
1 row fetched.

继续执行验证命令

#创建业务用户
create user anolis identified by "AnolisDB,.+";
grant dba to anolis;
#退出yasql命令行
exit;
#退出yashandb容器
exit

2.2.4 验证ydc

浏览器输入网址 http://{实验电脑IP}:8228 进行访问。
在这里插入图片描述
粘贴并执行以下sql语句

-- 创建序列
CREATE SEQUENCE global_dict_seq
    INCREMENT BY 1
    START WITH 1
    MINVALUE 1
    MAXVALUE 999999999999999999999999999
    NOCACHE
    NOCYCLE;

-- 创建表
CREATE TABLE global_dict (
    dict_id NUMBER DEFAULT global_dict_seq.NEXTVAL NOT NULL,
    dict_code VARCHAR2(30) DEFAULT '' NOT NULL,
    dict_name VARCHAR2(50) DEFAULT '' NOT NULL,
    remark VARCHAR2(255) DEFAULT '' NOT NULL,
    sort_no NUMBER DEFAULT 0 NOT NULL,
    create_user_id NUMBER DEFAULT 0 NOT NULL,
    create_user_name VARCHAR2(30) DEFAULT '' NOT NULL,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    modify_user_id NUMBER DEFAULT 0 NOT NULL,
    modify_user_name VARCHAR2(30) DEFAULT '' NOT NULL,
    modify_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

-- 添加主键
ALTER TABLE global_dict ADD CONSTRAINT pk_global_dict PRIMARY KEY (dict_id);

-- 添加注释
COMMENT ON TABLE global_dict IS '字典项大项表';
COMMENT ON COLUMN global_dict.dict_id IS '字典项编号';
COMMENT ON COLUMN global_dict.dict_code IS '字典项编号';
COMMENT ON COLUMN global_dict.dict_name IS '字典项名称';
COMMENT ON COLUMN global_dict.remark IS '备注';
COMMENT ON COLUMN global_dict.sort_no IS '排序号';
COMMENT ON COLUMN global_dict.create_user_id IS '创建人ID';
COMMENT ON COLUMN global_dict.create_user_name IS '创建人姓名';
COMMENT ON COLUMN global_dict.create_time IS '创建时间';
COMMENT ON COLUMN global_dict.modify_user_id IS '修改人ID';
COMMENT ON COLUMN global_dict.modify_user_name IS '修改人姓名';
COMMENT ON COLUMN global_dict.modify_time IS '修改时间';

-- 创建序列
CREATE SEQUENCE global_dict_seq
    INCREMENT BY 1
    START WITH 1
    MINVALUE 1
    MAXVALUE 999999999999999999999999999
    NOCACHE
    NOCYCLE;

-- 创建表
CREATE TABLE global_dict (
    dict_id NUMBER DEFAULT global_dict_seq.NEXTVAL NOT NULL,
    dict_code VARCHAR2(30) DEFAULT '' NOT NULL,
    dict_name VARCHAR2(50) DEFAULT '' NOT NULL,
    remark VARCHAR2(255) DEFAULT '' NOT NULL,
    sort_no NUMBER DEFAULT 0 NOT NULL,
    create_user_id NUMBER DEFAULT 0 NOT NULL,
    create_user_name VARCHAR2(30) DEFAULT '' NOT NULL,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    modify_user_id NUMBER DEFAULT 0 NOT NULL,
    modify_user_name VARCHAR2(30) DEFAULT '' NOT NULL,
    modify_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

-- 添加主键
ALTER TABLE global_dict ADD CONSTRAINT pk_global_dict PRIMARY KEY (dict_id);

-- 添加注释
COMMENT ON TABLE global_dict IS '字典项大项表';
COMMENT ON COLUMN global_dict.dict_id IS '字典项编号';
COMMENT ON COLUMN global_dict.dict_code IS '字典项编号';
COMMENT ON COLUMN global_dict.dict_name IS '字典项名称';
COMMENT ON COLUMN global_dict.remark IS '备注';
COMMENT ON COLUMN global_dict.sort_no IS '排序号';
COMMENT ON COLUMN global_dict.create_user_id IS '创建人ID';
COMMENT ON COLUMN global_dict.create_user_name IS '创建人姓名';
COMMENT ON COLUMN global_dict.create_time IS '创建时间';
COMMENT ON COLUMN global_dict.modify_user_id IS '修改人ID';
COMMENT ON COLUMN global_dict.modify_user_name IS '修改人姓名';
COMMENT ON COLUMN global_dict.modify_time IS '修改时间';

2.2.5 验证ycm

打开浏览器输入http://{实验电脑IP}:8260打开界面如下。
默认帐号/密码:admin/admin
在这里插入图片描述
首次登录会提示修改密码,ycm平台的密码复杂度要求较高,这里我将其改为Ano12,.+

2.2.6 设置YCM定期备份

2.2.6.1 添加主机

先在宿主机查找docker容器的IP地址,命令如下:

sudo docker inspect yashan_23_4_1_102_YdcYcm | grep "IPAddress"

返回结果如下:

"SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

这里172.17.0.3就是容器的地址。
输入完成后,点”扫描“按钮,表格中出现数据行后,打勾选中然后点“下一步”如下图:
在这里插入图片描述
在这里插入图片描述

2.2.6.2 托管YashanDB

展开菜单并进入“YashanDB列表”,点表格右上方的“托管YashanDB”按钮,输入表单信息点右下角“检查”按钮,如下图:
在这里插入图片描述
注意这里提示:OM host ip:127.0.0.1 is not support join to YCM。
这个是ycm的规则限制,虽然主机列表用容器的ip添加成功了,但是在托管的时候却仍然报127.0.0.1。原因是yashandb安装时默认绑定的监听ip是127.0.0.1,我们只需要将它的ip进行修改即可。
根据官网文档**https://doc.yashandb.com/yashandb/23.4/zh/All-Manuals/Installation-and-Upgrade/Redeployment/Changing-Server-IP-Address.html**的介绍。
执行以下操作
在宿主的shell中执行以下命令:

#进入容器的Shell
sudo docker exec -it yashan_23_4_1_102_YdcYcm /bin/bash
  进入到hosts.toml文件所在目录
  cd /data/yashan/yasdb_home/
  更换yasom IP
  yasboot ipchange yasom -t hosts.toml -n 172.17.0.3
  更换yasagent IP
  yasboot ipchange yasagent -t hosts.toml -n 172.17.0.3 --host-id host0001
  更换yasdb IP
  yasboot ipchange host -t hosts.toml -l 172.17.0.3 -r 172.17.0.3 --host-id host0001
#退出容器的shell
回到宿主的shell窗口,重启容器
sudo docker restart yashan_23_4_1_102_YdcYcm

回到浏览器的ycm界面,刷新页面并重新提交表单,如果没有生效,请退出登录并清空浏览器缓存,然后重新登录再试,一般都会成功的。如下图:
在这里插入图片描述

托管成功后,如下:
在这里插入图片描述

2.2.6.3 备份策略

展开菜单并进入“备份策略”,点表格右上方的“新增备份策略”按钮,填写表单信息如下:

字段名字段值
策略名称:Yashan数据库每日备份
备份类型:全量备份
并行度:不填
备份任务数:不填
文件分块大小:128MB
策略类型:周期
周期类型:每天
备份开始时间:01:00
备份保存时间:30天
最大备份数量:不填
存储类型:本地存储
存储路径:/data/yashan/yasdb_backup
注:1、这个目录的权限应是777避免出错。
2、此路径配置的是容器内部的路径,对应宿主的目录是:
/data/docker-data/yashan_23_4_1_102_YdcYcm/data/yasdb_backup
备份压缩算法:ZSTD(更高的压缩率)
备份压缩等级:

填写表单后点右下角“完成”按钮。提交成功后,记录显示在表格中。如下图:
在这里插入图片描述
滚动条拖到右边,并点击“应用到数据库”按钮,如下图:
在这里插入图片描述
这里绑定到数据库时,需要输入数据库的帐号密码。
并且输入的帐号必须 拥有DBA权限或者backup权限。为方便起见这里直接使用sys用户。
在这里插入图片描述

2.2.6.4 备份一次

** 备份策略创建后,我们可以手工触发一次备份,以验证备份是否可以正常运行。**操作如下:
进入到“作业管理”菜单,点击表格中备份任务的“执行一次”,如下图:

在这里插入图片描述
提示执行成功后,查看备份的文件。
在宿主机的shell中进入到目录
/data/docker-data/yashan_23_4_1_102_YdcYcm/data/yasdb_backup

再进入到最新的备份目录执行ls -l如下图所示:
在这里插入图片描述

3 YashanDB卸载

由于我们是用docker容器安装的,因此卸载比较简单。
在宿主机的shell中执行以下命令:

#关闭docker容器
sudo docker stop yashan_23_4_1_102_YdcYcm
#卸载docker容器
sudo docker rm -f yashan_23_4_1_102_YdcYcm
#删除容器目录
sudo rm -rf /data/docker-data/yashan_23_4_1_102_YdcYcm
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值