达梦数据库V8 Docker部署使用

达梦数据库V8 Docker 部署及使用

官方之前提供docker镜像,但是目前官方没有提供了。这里为了不耽误太多时间,所以用了一个其他同学的一个镜像(其基于官方镜像V8.1镜像做了部分修改)。

https://hub.docker.com/r/xuxuclassmate/dameng

我一开始测试的时候也使用了这个镜像,进行达梦数据库的一些测试(Kuscia支持达梦数据源工作)。但是发现其默认的这个达梦实例(5236端口的),是标识符大小写敏感的。

1
2
# 返回为1则为敏感,返回0则为不敏感
SELECT CASE_SENSITIVE();

https://eco.dameng.com/community/training/6e3229b02cf35a142766aebf8cdef19e

1.创建表:若表名或列名未添加双引号“”,则表名和列名会自动转换为大写形式
<1>若对表名或列名添加双引号“”,则会固定书写时的大、小写
<2>同名的数据库对象,如果大小写不同,那么则为两个不同的对象。
2.字段:若表名或列名未添加双引号“”,则表名和列名会自动转换为大写形式
3.DML 或 DDL 操作时:
<1>如果不对表名或列名添加双引号“”,那么表名和列名都自动转换为大写形式;
<2>对表进行 DML 操作时,如果没有小写形式的字段,不能采取小写加””的形式指定过滤字段,会被认定为无效的字段;
<3>如果对表名或列名添加‘“”,会固定书写时的大、小写形式,“”中是大写形式,则过滤字段就是大写字段,“”中是小写字段,则过滤字段就是小写字段;
<4>对其进行 DML 操作时,需要利用“”指定表名和字段名,否则默认会认定以大写形式去查询对象;
<5>查询时,‘’和“”界定符中字符串区分大小写,界定符中的字符串若是大写形式,那仅查询这个大写形式的对象,若是或小写形式,那仅查询这个小写形式的对象,DML 操作依旧。

但是我想 建一个标识符大小写不敏感的数据库进行操作。但是了解发现,一旦达梦数据库实例安装好之后,就不能调整 标识符大小写敏感。所以我需要重新初始化一个达梦实例。因为我是mac电脑,所以也无法使用官方的图形化工具,这里记录一下建立达梦实例的过程,最后我会将镜像打包,生成一个新的镜像,供后续自己使用或者同学们学习使用。

下拉 xuxuclassmate/dameng 运行,如果后续官方提供镜像,也可以用官方的。

1
docker run -d -p 5236:5236 -p 5237:5237  --restart=always --name dameng --privileged=true -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e INSTANCE_NAME=dm8db xuxuclassmate/dameng

跑起来,之后其实就可以正常连接了。默认账号是:SYSDBA,密码:SYSDBA001,端口是5236。

进入容器内,使用 dminit 来创建数据库。 dminit 是 DM 数据库初始化工具。可以利用 dminit 工具提供的各种参数,设置数据库存放路径、段页大小、 是否对大小写敏感、以及是否使用 UNICODE 等,创建出满足用户需要的数据库。

该工具位于安装目录的/bin 目录下——/opt/dmdbms/bin/。进入到此目录

执行:

1
./dminit path=/dm/db CASE_SENSITIVE=0 CHARSET=1 db_name=kuscia instance_name=kusciaServer port_num=5237 LOG_SIZE=512 SYSDBA_PWD=SYSDBA001 EXTENT_SIZE=16 PAGE_SIZE=16

显示类似如下执行结果,就可以了。然后提醒一下,这个官方的许可好像是只能14天试用,如果是长期使用的,请注意!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire in 14 day(s) on 2025-11-24
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL

log file path: /dm/db/kuscia/kuscia01.log


log file path: /dm/db/kuscia/kuscia02.log

write to dir [/dm/db/kuscia].

create dm database success. 2025-11-10 23:22:43

命令中支持很多参数设置,详细可以看:https://eco.dameng.com/community/post/20230714144924LI8MZP0RKTRSVRBL2I

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
INI_FILE                   初始化文件dm.ini存放的路径
PATH 初始数据库存放的路径
CTL_PATH 控制文件路径
LOG_PATH 日志文件路径
EXTENT_SIZE 数据文件使用的簇大小(16),可选值:16, 32, 64,单位:页
PAGE_SIZE 数据页大小(8),可选值:4, 8, 16, 32,单位:K
LOG_SIZE 日志文件大小(256),单位为:M,范围为:256M ~ 2G
CASE_SENSITIVE 大小敏感(Y),可选值:Y/N,1/0
CHARSET/UNICODE_FLAG 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR]
SEC_PRIV_MODE 权限管理模式(0),可选值:0[TRADITION],1[BMJ],2[EVAL],3[ZB]
LENGTH_IN_CHAR VARCHAR类型长度是否以字符为单位(N),可选值:Y/N,1/0
SYSDBA_PWD 设置SYSDBA密码(SYSDBA)
SYSAUDITOR_PWD 设置SYSAUDITOR密码(SYSAUDITOR)
DB_NAME 数据库名(DAMENG)
INSTANCE_NAME 实例名(DMSERVER)
PORT_NUM 监听端口号(5236)
BUFFER 系统缓存大小(100),单位M
TIME_ZONE 设置时区(+08:00)
PAGE_CHECK 页检查模式(1),可选值:0/1/2
PAGE_HASH_NAME 设置页检查HASH算法
EXTERNAL_CIPHER_NAME 设置默认加密算法
EXTERNAL_HASH_NAME 设置默认HASH算法
EXTERNAL_CRYPTO_NAME 设置根密钥加密引擎
RLOG_ENCRYPT_NAME 设置日志文件加密算法,若未设置,则不加密
USBKEY_PIN 设置USBKEY PIN
PAGE_ENC_SLICE_SIZE 设置页加密分片大小,可选值:05124096,单位:Byte
ENCRYPT_NAME 设置全库加密算法
BLANK_PAD_MODE 设置空格填充模式(0),可选值:0/1
SYSTEM_MIRROR_PATH SYSTEM数据文件镜像路径
MAIN_MIRROR_PATH MAIN数据文件镜像
ROLL_MIRROR_PATH 回滚文件镜像路径
MAL_FLAG 初始化时设置dm.ini中的MAL_INI(0)
ARCH_FLAG 初始化时设置dm.ini中的ARCH_INI(0)
MPP_FLAG Mpp系统内的库初始化时设置dm.ini中的mpp_ini(0)
CONTROL 初始化配置文件(配置文件格式见系统管理员手册)
AUTO_OVERWRITE 是否覆盖所有同名文件(0) 0:不覆盖 1:部分覆盖 2:完全覆盖
USE_NEW_HASH 是否使用改进的字符类型HASH算法(1)
ELOG_PATH 指定初始化过程中生成的日志文件所在路径
AP_PORT_NUM 分布式环境下协同工作的监听端口
DFS_FLAG 初始化时设置dm.ini中的DFS_INI(0)
DFS_PATH 启用dfs时指定数据文件的缺省路径
DFS_HOST 指定连接分布式系统DFS的服务地址(localhost)
DFS_PORT 指定连接分布式系统DFS的服务端口号(3332)
DFS_COPY_NUM 指定分布式系统的副本数(3)
DFS_DB_NAME 指定分布式系统的中数据库名(默认与DB_NAME一致)
SHARE_FLAG 指定分布式系统中该数据库的共享属性(0)
REGION_MODE 指定分布式系统中该数据库的系统表空间数据文件的区块策略(0) 0:微区策略 1:宏区策略
HUGE_WITH_DELTA 是否仅支持创建事务型HUGE表(1) 1:是 0:否
RLOG_GEN_FOR_HUGE 是否生成HUGE表REDO日志(1) 1:是 0:否
PSEG_MGR_FLAG 是否仅使用管理段记录事务信息(0) 1:是 0:否
CHAR_FIX_STORAGE CHAR是否按定长存储(N),可选值:Y/N,1/0
SQL_LOG_FORBID 是否禁止打开SQL日志(N),可选值:Y/N,1/0
DPC_MODE 指定DPC集群中的实例角色(0) 0:无 1:MP 2:BP 3:SP,取值1/2/3时也可以用MP/BP/SP代替
HELP 打印帮助信息

方式一:使用Dockerfile制作镜像(推荐)

基于 xuxuclassmate/dameng 镜像的启动脚本 /opt/startup.sh,我们可以创建一个改进的启动脚本,自动初始化并启动两个实例。

1. 创建改进的启动脚本

创建 startup.sh 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/bin/bash

ADMIN_PWD=${SYSDBA_PWD:-SYSDBA001}

CONN_PWD="${ADMIN_PWD}"

export LANG=en_US.UTF-8

function wait_dm_running() {
for i in `seq 1 10`
do
if [ ! -f "/opt/dmdbms/conf/dm.ini" ]; then
pid=`ps -eo pid,args | grep -F "./dmserver /opt/dmdbms/data/DAMENG/dm.ini" | grep -v "grep" | tail -1 | awk '{print $1}'`
else
pid=`ps -eo pid,args | grep -F "./dmserver /opt/dmdbms/conf/dm.ini" | grep -v "grep" | tail -1 | awk '{print $1}'`
fi
if [ "$pid" != "" ]; then
echo "Dmserver is running."
break
else
echo "Dmserver is not running yet..."
sleep 10
fi
done
}

function wait_dm_ready() {
for i in `seq 1 10`
do
echo `./disql /nolog <<EOF
CONN SYSDBA/${CONN_PWD}@localhost
exit
EOF` | grep "connection failure" > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "DM Database is not OK, please wait..."
sleep 10
else
echo "DM Database is OK"
break
fi
done
}

# 初始化默认实例(5236端口)
if [ ! -d "/opt/dmdbms/data/DAMENG" ]; then
cd /opt/dmdbms/bin
./dminit PATH=/opt/dmdbms/data PAGE_SIZE=${PAGE_SIZE:-16} CASE_SENSITIVE=${CASE_SENSITIVE:-1} UNICODE_FLAG=${UNICODE_FLAG:-0} LENGTH_IN_CHAR=${LENGTH_IN_CHAR:-0} SYSDBA_PWD=${ADMIN_PWD}
echo "Init DM success!"
fi

# 初始化kuscia实例(5237端口,大小写不敏感)
if [ ! -d "/dm/db/kuscia" ]; then
cd /opt/dmdbms/bin
./dminit path=/dm/db CASE_SENSITIVE=0 CHARSET=1 db_name=kuscia instance_name=kusciaServer port_num=5237 LOG_SIZE=512 SYSDBA_PWD=${ADMIN_PWD} EXTENT_SIZE=16 PAGE_SIZE=16
echo "Init Kuscia instance success!"
fi

cd /opt/dmdbms/bin

echo "Start DmAPService..."
./DmAPService start

# 启动默认实例(5236端口)
if [ ! -f "/opt/dmdbms/conf/dm.ini" ]; then
echo "/opt/dmdbms/conf/dm.ini does not exist, use default dm.ini"
./dmserver /opt/dmdbms/data/DAMENG/dm.ini -noconsole > /opt/dmdbms/log/DmServiceDMSERVER.log 2>&1 &
else
./dmserver /opt/dmdbms/conf/dm.ini -noconsole > /opt/dmdbms/log/DmServiceDMSERVER.log 2>&1 &
fi

echo "Start DMSERVER success!"

# 启动kuscia实例(5237端口)
if [ -f "/dm/db/kuscia/dm.ini" ]; then
./dmserver /dm/db/kuscia/dm.ini -noconsole > /opt/dmdbms/log/DmServiceKUSCIASERVER.log 2>&1 &
echo "Start Kuscia DMSERVER success!"
fi

wait_dm_running
wait_dm_ready

if [ ! -f "/opt/dmdbms/log/dm_DMSERVER.log" ]; then
current_year_month=`date +%Y%m`
DM_LOG=dm_DMSERVER_${current_year_month}.log
ln -s /opt/dmdbms/log/${DM_LOG} /opt/dmdbms/log/dm_DMSERVER.log
echo "Finished soft link DM current ${DM_LOG} to dm_DMSERVER.log"
fi

echo "5 0 1 * * root /opt/switchDmLog.sh" >> /etc/crontab

/etc/init.d/cron start

tail -F /opt/dmdbms/log/dm_DMSERVER.log

tail -f /dev/null

2. 创建Dockerfile

创建 Dockerfile 文件:

1
2
3
4
5
6
7
8
9
10
FROM xuxuclassmate/dameng:latest

# 复制改进的启动脚本,覆盖原启动文件
COPY startup.sh /opt/startup.sh

# 设置执行权限
RUN chmod +x /opt/startup.sh

# 使用新的启动脚本作为入口点
CMD ["/opt/startup.sh"]

3. 构建镜像

1
docker build -t dameng:8.1 .

4. 运行容器

1
docker run -d -p 5236:5236 -p 5237:5237 --restart=always --name dameng --privileged=true -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e INSTANCE_NAME=dm8db dameng:8.1

参数说明:

  • -d: 后台运行容器(detached mode)
  • -p 5236:5236 -p 5237:5237: 端口映射,将容器的5236和5237端口映射到主机
  • --restart=always: 容器自动重启策略,当容器退出或Docker重启时自动启动
  • --name dameng: 指定容器名称为 dameng
  • --privileged=true: 特权模式,授予容器几乎所有的主机设备访问权限。达梦数据库可能需要访问某些系统资源或执行特权操作,因此需要此参数
  • -e PAGE_SIZE=16: 设置环境变量,指定数据库页大小为16K(单位:K)。在启动脚本中用于初始化数据库时的页大小配置
  • -e LD_LIBRARY_PATH=/opt/dmdbms/bin: 设置环境变量,指定动态链接库的搜索路径。达梦数据库的可执行文件需要从此目录加载共享库
  • -e INSTANCE_NAME=dm8db: 设置环境变量,指定数据库实例名称(注意:在改进的启动脚本中,kuscia实例的实例名是硬编码为kusciaServer,此环境变量主要用于默认实例)

这种方式会自动初始化两个实例,无需手动进入容器执行初始化命令。

验证达梦数据库进程:

1
2
3
4
root@69663ad9670d:/opt/dmdbms/bin# ps -ef|grep dms
root 58 1 2 23:21 ? 00:00:02 ./dmserver /opt/dmdbms/data/DAMENG/dm.ini -noconsole
root 168 39 25 23:24 pts/0 00:00:01 ./dmserver /dm/db/kuscia/dm.ini
root 239 39 0 23:24 pts/0 00:00:00 grep --color=auto dms

可以观察到已经起起来了。使用账号:SYSDBA,密码:SYSDBA001,端口:5237。就可以访问到这个实例啦。

新建用户视图SQL(其实有些类似mysql中的数据库的概念,但是还是有区别的),并授权:

1
2
create user KUSCIA identified by 1234567890;
GRANT DBA TO KUSCIA;

然后就可以切换这个账号:KUSCIA,密码:1234567890 来登录5237端口实例了。

1
2
3
4
5
6
root@69663ad9670d:/opt/dmdbms/bin# ./disql KUSCIA/1234567890:5237

Server[LOCALHOST:5237]:mode is normal, state is open
login used time : 10.566(ms)
disql V8
SQL>

不建立这个KUSCIA账号,直接使用SYSDBA,也是可以正常使用的。

可以使用这个建表语句测试下,标识符大小写是否敏感。

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE test_dataproxy_table (
id INT,
name VARCHAR(100),
age INT,
salary DECIMAL(10,2),
created_date DATE,
created_time TIMESTAMP,
is_active INT,
description CLOB,
data_blob BLOB
);

镜像没问题,就打包推送:

1
docker images | grep dameng:8.1
1
2
3
4
5
6
7
8
9
docker tag dameng:8.1 kongxr7/dameng:8.1
docker tag dameng:8.1 kongxr7/dameng:latest


#docker save -o dameng-8.1.tar kongxr7/dameng:8.1
#docker load -i /tmp/dameng-8.1.tar

docker push kongxr7/dameng:8.1
docker push kongxr7/dameng:latest

后续自制镜像启动命令:

1
docker run -d -p 5236:5236 -p 5237:5237 --restart=always --name dameng --privileged=true -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e INSTANCE_NAME=dm8db --name tmp-dameng kongxr7/dameng:8.1

这样就可以不需要任何配置,即可启动一个达梦数据库容器,内置两个实例。

5236端口,账号:SYSDBA,密码:SYSDBA001

5237端口,账号:SYSDBA,密码:SYSDBA001。此实例其中还有包含一个KUSCIA用户(账号:KUSCIA,密码:1234567890)