注册
DM9新特性探索之DMDSC ONE NODE对标RAC ONE NODE部署实施方案【#达梦数据库 #达梦同行者征文】
专栏/技术分享/ 文章详情 /

DM9新特性探索之DMDSC ONE NODE对标RAC ONE NODE部署实施方案【#达梦数据库 #达梦同行者征文】

羽书飞影 2026/09/08 158 4 1
摘要

文档概述

本文档详细记录了达梦数据库(DM9)在单机环境下搭建数据共享集群(DSC,Data Sharing Cluster)并结合 ASM(Automatic Storage Management)自动存储管理的完整部署流程。涵盖前期磁盘准备、UDEV 规则绑定、DCR/VOTE/DATA 盘初始化、DMCSS/DMASM/DMSERVER 服务注册与启动、表空间与用户创建,以及常见问题处理。
涉及版本:9.1.0.26

一、前期 ASM 盘准备工作

1.1 磁盘分区

使用 parted 工具对 NVMe 磁盘进行 GPT 分区,按需求划分多个分区用于不同的 ASM 盘角色。
分区 1:DCR 盘(约 100MB)
分区 2:Vote 盘(约 200MB)
分区 3:LOG 盘(约 20GB)
分区 4:DATA 盘(剩余全部空间)
操作命令如下:

以 /dev/nvme1n1 为例

parted /dev/nvme1n1
mklabel gpt
mkpart primary 1 100
mkpart primary 100 200
mkpart primary 200 20680
mkpart primary 20680 3500G

1.2 磁盘识别

分区完成后,执行 partprobe 使内核重新读取分区表:

partprobe /dev/nvme1n1

1.3 NVMe 磁盘 UDEV 规则绑定

由于 NVMe 设备不走 SCSI 协议栈,无法使用 scsi_id,需改用 ENV{ID_SERIAL} 作为唯一标识。编写 UUID_NVME.sh 脚本为各分区生成 udev 规则,将其绑定为统一的 /dev/asm-disk/asm-diskN 名称。
脚本核心逻辑:

  • 遍历 nvme1n1p1 ~ p4 四个分区
  • 通过 udevadm info --query=property 获取 ID_SERIAL / ID_SERIAL_SHORT
  • 若均未取到,回退读取 sys WWID 作为唯一标识
  • 生成 udev 规则文件 88-dm-asmddevices.rules
#!/bin/bash
# ============================================================
# gen_nvme_udev_rules.sh
# 用途:为 NVMe 磁盘分区生成 udev 规则(用于达梦 ASM 磁盘绑定)
# 说明:NVMe 设备不走 SCSI 协议栈,无法使用 scsi_id,
#        改用 ENV{ID_SERIAL} 作为唯一标识
# ============================================================

SCRIPT_DIR=$(cd "$(dirname "$0")"; pwd)
OUTPUT_FILE="${SCRIPT_DIR}/88-dm-asmddevices.rules"

# 清理旧文件
rm -f "$OUTPUT_FILE"

DISK_PREFIX="/dev/nvme1n1"

echo "# Generated by gen_nvme_udev_rules.sh on $(date)" >> "$OUTPUT_FILE"
echo "# NVMe device: ${DISK_PREFIX}" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"

# 遍历 NVMe 分区
for i in 1 2 3 4; do
    DEV_PATH="${DISK_PREFIX}p${i}"

    if [ ! -b "$DEV_PATH" ]; then
        echo "WARNING: $DEV_PATH 不存在,跳过"
        continue
    fi

    # 获取 ID_SERIAL(方法1:从 udevadm 查询)
    ID_SERIAL=$(udevadm info --query=property "$DEV_PATH" 2>/dev/null | \
                grep "^ID_SERIAL=" | cut -d= -f2)

    # 如果没取到,尝试 ID_SERIAL_SHORT
    if [ -z "$ID_SERIAL" ]; then
        ID_SERIAL=$(udevadm info --query=property "$DEV_PATH" 2>/dev/null | \
                    grep "^ID_SERIAL_SHORT=" | cut -d= -f2)
    fi

    # 如果还不行,读取 WWID
    if [ -z "$ID_SERIAL" ]; then
        # 先取控制器路径
        SYS_PATH=$(udevadm info --query=path "$DEV_PATH" 2>/dev/null)
        WWID=$(cat /sys/${SYS_PATH}/wwid 2>/dev/null)
        if [ -n "$WWID" ]; then
            ID_SERIAL="$WWID"
        fi
    fi

    if [ -z "$ID_SERIAL" ]; then
        echo "ERROR: $DEV_PATH 无法获取序列号,跳过"
        continue
    fi

    echo "设备: $DEV_PATH → ID_SERIAL=${ID_SERIAL}"

    # 写入 udev 规则
    cat >> "$OUTPUT_FILE" << RULE
KERNEL=="nvme1n1p${i}", SUBSYSTEM=="block", ENV{ID_SERIAL}=="${ID_SERIAL}", \
SYMLINK+="asm-disk${i}", OWNER="dmdba", GROUP="dinstall", MODE="0660"

RULE
done

echo ""
echo "完成!已生成: $OUTPUT_FILE"
echo "内容如下:"
echo "----------------------------------------"
cat "$OUTPUT_FILE"
echo "----------------------------------------"
echo ""
echo "使用方法:"
echo "  sudo cp ${OUTPUT_FILE} /etc/udev/rules.d/"
echo "  sudo udevadm control --reload-rules && sudo udevadm trigger"
echo "  ls -l /dev/asm-disk/asm-disk*"

执行脚本:

./uuid_nvme.sh

1.4 部署 UDEV 规则

将生成的规则文件复制到系统 udev 目录并使其生效:

cp /root/88-dm-asmddevices.rules /etc/udev/rules.d/
udevadm control --reload-rules && sudo udevadm trigger

验证绑定结果:

ls -l /dev/asm-disk/asm-disk*
###注意asm-disk/asm-disk*的权限问题,如果脚本赋予权限规则未生效,需要手动赋予dmdba:dinstall权限

1.5 查询各分区大小

使用 blockdev 命令确认各 ASM 盘容量,确保与实际预期相符
image.png

二、安装数据库软件并配置环境

完成操作系统层面配置后,安装达梦数据库软件(此处省略具体安装步骤),配置环境变量及用户权限。确保 dmdba 用户对 /dev/asm-disk/* 具有读写权限(已在 udev 规则中设置 owner=dmdba, group=dinstall, mode=0660)。

三、配置 DCR 配置文件

3.1 配置 dmdcr_cfg.ini

该文件用于定义集群的 DCR(Distributed Control Repository)配置信息,包括数据库参数、节点信息、日志路径等。路径:/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr_cfg.ini
image.png
节点 [DSC0] 配置:
image.png
配置如下:

[dmdba@ecif-250-21 bin]$ cat /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr_cfg.ini 
  db_name                  = dsc
  system_path              = +DMDATA/dsc
  main                     = +DMDATA/dsc/main.dbf
  main_size                = 128
  roll                     = +DMDATA/dsc/roll.dbf
  roll_size                = 128
  system                   = +DMDATA/dsc/system.dbf
  system_size              = 128
  ctl_path                 = +DMDATA/dsc/dm.ctl
  ctl_size                 = 8
  log_size                 = 4096
  dcr_path                 = /dev/asm-disk/asm-disk1
  dcr_seqno                = 0
  auto_overwrite           = 0
  #初始化参数
  PAGE_SIZE                = 32
  EXTENT_SIZE     		   = 32
  BLANK_PAD_MODE           = 1
  SYSDBA_PWD		   = Dsc_1234!
  SYSAUDITOR_PWD	   = Dsc_1234!
  
[DSC0]
  config_path              = /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dsc0_config
  port_num                 = 6236
  mal_host                 = 9.17.250.21
  mal_port                 = 9340
  log_path                 = +DMDATA/dsc/dsc1_log01.log
  log_path                 = +DMDATA/dsc/dsc1_log02.log

3.2 配置 dmdcr.ini

CSS/ASM 启动依赖的基础配置,路径:/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
image.png

配置如下:
[dmdba@ecif-250-21 ~]$ cat /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
DMDCR_PATH                 = /dev/asm-disk/asm-disk1
DMDCR_MAL_PATH             = /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmasvrmal.ini
DMDCR_SEQNO                = 0
DMDCR_AUTO_OPEN_CHECK      = 90
#DMDCR_ASM_RESTART_INTERVAL = 30  #CSS认定ASM故障重启的时间
#DMDCR_ASM_STARTUP_CMD      = /dmdata/dmdbms_9_1_0_26/bin/DmASMSvrService1 start
#DMDCR_DB_RESTART_INTERVAL  = 60
#DMDCR_DB_STARTUP_CMD       = /dmdata/dmdbms_9_1_0_26/bin//DmService1 start

注意:ASM/DB 的自启参数(DMDCR_ASM_RESTART_INTERVAL / DMDCR_ASM_STARTUP_CMD / DMDCR_DB_RESTART_INTERVAL / DMDCR_DB_STARTUP_CMD)初期以注释形式预留,待验证完毕后取消注释实现自动拉起。

3.3 配置 dmasvrmal.ini

MAL 链路配置文件,定义 ASM 实例间的通信地址:

[MAL_INST1]
MAL_INST_NAME = ASM0
MAL_HOST = 9.17.250.21(心跳地址)
MAL_PORT = 5636(MAL 监听端口)

四、ASM 盘初始化

启动 dmasmtool 工具,对各磁盘进行角色分配与初始化:
Step 1:指定磁盘角色

create dcrdisk '/dev/asm-disk/asm-disk1' 'dcr'
create votedisk '/dev/asm-disk/asm-disk2' 'vote'
create asmdisk '/dev/asm-disk/asm-disk3' 'LOG0'
create asmdisk '/dev/asm-disk/asm-disk4' 'DATA0'

Step 2:初始化 DCR 盘

init dcrdisk '/dev/asm-disk/asm-disk1' from '/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr_cfg.ini' identified by '密码'

Step 3:初始化 Vote 盘

init votedisk '/dev/asm-disk/asm-disk2' from '/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr_cfg.ini'

image.png

五、启动 DMCSS / DMASM 服务,创建磁盘组

5.1 前台启动服务(调试阶段)

先在前台启动 CSS 和 ASM 服务,以便观察日志输出:

./dmcss dcr_ini=/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
./dmasmsvr dcr_ini=/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini

5.2 创建 ASM 磁盘组

通过 dmasmtool 连接 ASM 实例,创建逻辑磁盘组:

/dmdata/dmdbms_9_1_0_26/bin/dmasmtool dcr_ini=/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
ASM> create diskgroup 'DMLOG' asmdisk '/dev/asm-disk/asm-disk3'
ASM> create diskgroup 'DMDATA' asmdisk '/dev/asm-disk/asm-disk4'

image.png

六、初始化数据库实例

6.1 编写 dminit.ini

配置文件路径:/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dminit.ini

[dmdba@ecif-250-21 bin]$ cat /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dminit.ini
  db_name                  = dsc
  system_path              = +DMDATA/dsc
  main                     = +DMDATA/dsc/main.dbf
  main_size                = 128
  roll                     = +DMDATA/dsc/roll.dbf
  roll_size                = 128
  system                   = +DMDATA/dsc/system.dbf
  system_size              = 128
  ctl_path                 = +DMDATA/dsc/dm.ctl
  ctl_size                 = 8
  log_size                 = 4096
  dcr_path                 = /dev/asm-disk/asm-disk1
  dcr_seqno                = 0
  auto_overwrite           = 0
  #初始化参数
  PAGE_SIZE                = 32
  EXTENT_SIZE     		   = 32
  BLANK_PAD_MODE           = 1
  SYSDBA_PWD		   = Dsc_1234!
  SYSAUDITOR_PWD	   = Dsc_1234!
  
[DSC0]
  config_path              = /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dsc0_config
  port_num                 = 6236
  mal_host                 = 9.17.250.21
  mal_port                 = 9340
  log_path                 = +DMDATA/dsc/dsc1_log01.log
  log_path                 = +DMDATA/dsc/dsc1_log02.log 

6.2 执行初始化

使用 dminit 工具初始化数据库实例:
./dminit control=/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dminit.ini
image.png

七、注册系统服务

通过 dm_service_installer.sh 分别注册 CSS、ASM Server、Database Server 为系统服务,实现开机自启。

注册 CSS 服务:
./dm_service_installer.sh -t dmcss -dcr_ini .../dmdcr.ini -p 1
注册 ASM Server 服务:
./dm_service_installer.sh -t dmasmsvr -dcr_ini .../dmdcr.ini -y DmCSSService1 -p 1
注册 DB Server 服务:
./dm_service_installer.sh -t dmserver -dm_ini .../dsc0_config/dm.ini -dcr_ini .../dmdcr.ini -y DmASMSvrService1 -p 1

image.png
### 注册dmserver时 的-m mount在单机情况下不需要添加

八、配置 CSSM 监控

8.1 编写 dmcssm.ini

CSSM 是集群状态监控工具,配置文件示例如下:

[dmdba@ecif-250-21 bin]$ cat dmcssm.ini 
CSSM_OGUID = 45332
#配置所有 CSS 的连接信息,
#和 dmdcr_cfg.ini 中 CSS 配置项的 DCR_EP_HOST 和 DCR_EP_PORT 保持一致
CSSM_CSS_IP = 9.17.250.21:6336
CSSM_LOG_PATH =../log
CSSM_LOG_FILE_SIZE = 512
CSSM_LOG_SPACE_LIMIT = 0

8.2 启动监控并查看集群状态

./dmcssm dmcssm.ini
> show
#CSS、ASM、DMSERVER状态均为OPEN表现数据库各个组件运行正常

image.png

九、启用自动拉起

验证集群正常运行后,取消 dmdcr.ini 中以下参数的注释,使得 DMCSS 能够自动检测故障并重启 ASM 与 DBSERVER:

DMDCR_ASM_RESTART_INTERVAL
DMDCR_ASM_STARTUP_CMD
DMDCR_DB_RESTART_INTERVAL
DMDCR_DB_STARTUP_CMD

随后通过服务方式启动 CSS,由其自动拉起 ASM 和 DBSERVER:
./DmCSSService1 start
image.png
十、参数调整

  • 根据业务需要,对数据库运行参数进行优化调整,建议重点关注:
  • 内存相关参数:BUFFER、MAX_BUFFER、SORT_BUF_SIZE 等
  • 并发相关参数:MAX_SESSIONS、MAX_SESSION_STATEMENT
  • IO 相关参数:DISA_BUF_NUM、CKPT_INTERVAL 等
--系统兼容Oracle参数设置
SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',2);
SP_SET_PARA_VALUE(2,'ORDER_BY_NULLS_FLAG',1);
SP_SET_PARA_VALUE(2,'ENABLE_PL_SYNONYM',1);
SP_SET_PARA_VALUE(2,'DEL_HP_OPT_FLAG',4);
SP_SET_PARA_VALUE(2,'CALC_AS_DECIMAL',1);
--系统兼容Mysql参数设置(未配置已配置兼容ORACLE)
SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',4);
--系统内存相关参数,可以通过下方优化脚本生成
例子:服务器为160Cc+1024G环境参数修改内容
SP_SET_PARA_VALUE(2,'WORKER_THREADS',64);
SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',32);
SP_SET_PARA_VALUE(2,'GEN_SQL_MEM_RECLAIM',0);
SP_SET_PARA_VALUE(2,'MAX_OS_MEMORY',       100);
SP_SET_PARA_VALUE(2,'MEMORY_POOL',         2000);
SP_SET_PARA_VALUE(2,'MEMORY_N_POOLS',      59);
SP_SET_PARA_VALUE(2,'MEMORY_TARGET',       81000);
SP_SET_PARA_VALUE(2,'BUFFER',              324000);
SP_SET_PARA_VALUE(2,'BUFFER_POOLS',        101);
SP_SET_PARA_VALUE(2,'RECYCLE',            33000);
SP_SET_PARA_VALUE(2,'RECYCLE_POOLS',       97);
SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES',     99999);
SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES',     9999);
SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS',1);
SP_SET_PARA_VALUE(2,'MULTI_PAGE_GET_NUM',1);
SP_SET_PARA_VALUE(2,'PRELOAD_SCAN_NUM',0);
SP_SET_PARA_VALUE(2,'PRELOAD_EXTENT_NUM',0);
SP_SET_PARA_VALUE(2,'TASK_THREADS',16);
SP_SET_PARA_VALUE(2,'MEMORY_MAGIC_CHECK',       1);
SP_SET_PARA_VALUE(1,'HJ_BUF_GLOBAL_SIZE',  82000);
SP_SET_PARA_VALUE(1,'HJ_BUF_SIZE',        512);
SP_SET_PARA_VALUE(1,'HAGR_BUF_GLOBAL_SIZE',51000);
SP_SET_PARA_VALUE(1,'HAGR_BUF_SIZE',     512);
SP_SET_PARA_VALUE(2,'SORT_FLAG',1);
SP_SET_PARA_VALUE(2,'SORT_BLK_SIZE',2);
SP_SET_PARA_VALUE(2,'SORT_BUF_SIZE',       50);
SP_SET_PARA_VALUE(2,'SORT_BUF_GLOBAL_SIZE',       82000);
SP_SET_PARA_VALUE(2,'RLOG_POOL_SIZE',      2048);
SP_SET_PARA_VALUE(2,'CACHE_POOL_SIZE',     2048);
SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE',       1024);
SP_SET_PARA_VALUE(2,'VM_POOL_TARGET',      8192);
SP_SET_PARA_VALUE(2,'SESS_POOL_TARGET',    8192);
SP_SET_PARA_VALUE(2,'USE_PLN_POOL',        1);
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR',      1);
SP_SET_PARA_VALUE(2,'SVR_LOG',             1);
SP_SET_PARA_VALUE(2,'TEMP_SIZE',           1024);
SP_SET_PARA_VALUE(2,'TEMP_SPACE_LIMIT',    102400);
SP_SET_PARA_VALUE(2,'MAX_SESSIONS',        10100);
SP_SET_PARA_VALUE(2,'MAX_SESSION_STATEMENT', 20000);
SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',		0);
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0);
SP_SET_PARA_VALUE(2,'OLAP_FLAG',2);
SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1);
SP_SET_PARA_VALUE(2,'ADAPTIVE_NPLN_FLAG',0);
SP_SET_PARA_VALUE(2,'MONITOR_INDEX_FLAG',2);
SP_SET_PARA_VALUE(2,'ENABLE_CREATE_BM_INDEX_FLAG',0);
SP_SET_PARA_VALUE(2,'PARALLEL_PURGE_FLAG',1);
SP_SET_PARA_VALUE(2,'PARALLEL_POLICY',2);
SP_SET_PARA_DOUBLE_VALUE(2,'UNDO_RETENTION',900);
SP_SET_PARA_VALUE(2,'UNDO_EXTENT_NUM',16);
SP_SET_PARA_VALUE(2,'ENABLE_INJECT_HINT',1);
SP_SET_PARA_VALUE(2,'BTR_SPLIT_MODE',1);
SP_SET_PARA_VALUE(2,'FAST_LOGIN',1);
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR_BP',0);
SP_SET_PARA_VALUE(1,'SLCT_OPT_FLAG',0);
--调整过滤条件的选择率基于动态采样调整。
SP_SET_PARA_VALUE(2,'BEXP_CALC_ST_FLAG',0);
--控制 UPDATE 语句的优化。
SP_SET_PARA_VALUE(2,'UPDATE_OPT_FLAG',64);
--全库统计信息收集
sp_set_para_value(1,'AUTO_STAT_OBJ',1);   --开启全库
sp_set_para_value(1,'MONITOR_MODIFICATIONS',2);  --开启监控用户表对象
sp_set_para_value(1,'MON_CHECK_INTERVAL',10);  --秒数便将用户表对象的数据变化情况记录到系统表。

十一、创建表空间、用户及授权

11.1 创建表空间

image.png

CREATE TABLESPACE "AUSER" DATAFILE 'ECIFPLAT.DBF' SIZE 102400 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "BUSER" DATAFILE 'ECIFOCRM.DBF' SIZE 51200 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "CUSER" DATAFILE 'ECIFODS.DBF' SIZE 1024 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "DUSER" DATAFILE 'sjdjuser.DBF' SIZE 10240 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "EUSER" DATAFILE 'PETL.DBF' SIZE 1024 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "FUSER" DATAFILE 'ECIFMODIFY.DBF' SIZE 10240 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;

11.2 创建用户并指定默认表空间

CREATE USER "AUSER" IDENTIFIED BY   "密码"   PASSWORD_POLICY 31  DEFAULT TABLESPACE "ECIFPLAT" DEFAULT INDEX TABLESPACE "ECIFPLAT";
CREATE USER "BUSER" IDENTIFIED BY   "密码"   PASSWORD_POLICY 31  DEFAULT TABLESPACE "ECIFOCRM" DEFAULT INDEX TABLESPACE "ECIFOCRM";
CREATE USER "CUSER" IDENTIFIED BY   "密码"   PASSWORD_POLICY 31  DEFAULT TABLESPACE "ECIFODS" DEFAULT INDEX TABLESPACE "ECIFODS";
CREATE USER "DUSER" IDENTIFIED BY   "密码"   PASSWORD_POLICY 31  DEFAULT TABLESPACE "ECIFODS" DEFAULT INDEX TABLESPACE "ECIFODS";
CREATE USER "EAUSER" IDENTIFIED BY   "密码"   PASSWORD_POLICY 31  DEFAULT TABLESPACE "ECIFODS" DEFAULT INDEX TABLESPACE "ECIFODS";

11.3 用户授权

对所有业务用户授予公共角色与必要权限:

GRANT PUBLIC, RESOURCE, SOI, SVI, VTI TO 用户名;

十二、数据迁移

使用 dexp(达梦导出工具)从源数据库导出全量数据或者DTS全量迁移。(详细不表述)

十三、报错处理

13.1 初始化磁盘时报错 [-11055]

错误信息:[code: -11055], ASM加载路径中DCRV磁盘过多
==原因分析:==由于原始设备 /dev/nvme1n1 与新创建的 /dev/asm-disk/asm-disk* 符号链接路径重复,导致 ASM 在加载时读到了多条重复路径。
==解决方案:==将 asm-disk 符号链接放到独立的子目录中,例如 /dev/asm-disk/ 目录,避免与原始设备路径冲突。

#达梦数据库 #达梦同行者征文

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服