ithuang
ithuang
发布于 2025-09-20 / 4 阅读
0

DM 达梦数据库

DM 达梦数据库

一 、达梦数据库概述

1. 达梦系统概述

DM 是国产新一代大型通用关系型数据库,全面支持 SQL 标准和主流编程语言接口/开发框架。

行列融合存储技术,满足 HTAP 混合事务分析处理应用场景。

HTAP = Hybrid Transactional/Analytical Processing混合事务 / 分析处理,一套库同时干两件事:

  1. OLTP 事务型:下单、支付、增删改查,快、并发高
  2. OLAP 分析型:报表、统计、大屏、复杂查询,算得快、查得全

2. 核心应用场景

☆ 高性能交易处理

强调高并发、低延迟,秒级响应,数据量 TB 级,可靠率需达 99.99%。

☆ 高可用需求

数据库是核心基础,需在保障数据安全的同时实现快速恢复与连续服务。

☆ 大规模数据分析

面向 TB~PB 级数据的复杂统计查询,响应时间较长但必须确保数据可靠。

☆ 高强度混合负载

同时支撑事务处理与分析计算,解决资源争用确保整体性能。

☆ 平滑升级与替换

通过柔性替换方案实现数据迁移、应用兼容与系统稳定,降低数据库替换风险。

☆ 云化与智能运维

统一提供数据库的发放、监控和管理,实现按需申请与秒级交付。

3. DM8软件下载

官网地址:https://www.dameng.com/

或直接打开:https://eco.dameng.com/download/

DM 达梦数据库1.png

DM 达梦数据库2.png

进入后,根据CPU与操作系统,选择合适的DM8版本:

DM 达梦数据库3.png

注:安装达梦数据库,Linux 系统内存不得低于 8G 及以上,CPU 建议4核及以上!

二、配置DM8安装环境

官方文档:https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html

1. CentOS7 基础配置参考

[root@centos7 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@centos7 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        151M        7.3G         11M        199M        7.2G
Swap:          5.0G          0B        5.0G
[root@centos7 ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
座:                 1
NUMA 节点:         1
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              142
型号名称:        Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
步进:              11
CPU MHz:             1800.001
BogoMIPS:            3600.00
超管理器厂商:  VMware
虚拟化类型:     完全
L1d 缓存:          32K
L1i 缓存:          32K
L2 缓存:           256K
L3 缓存:           6144K
NUMA 节点0 CPU:    0,1
...
[root@centos7 network-scripts]# ls
ifcfg-ens33  ifdown-ppp       ifup-eth     ifup-sit
ifcfg-lo     ifdown-routes    ifup-ippp    ifup-Team
ifdown       ifdown-sit       ifup-ipv6    ifup-TeamPort
ifdown-bnep  ifdown-Team      ifup-isdn    ifup-tunnel
ifdown-eth   ifdown-TeamPort  ifup-plip    ifup-wireless
ifdown-ippp  ifdown-tunnel    ifup-plusb   init.ipv6-global
ifdown-ipv6  ifup             ifup-post    network-functions
ifdown-isdn  ifup-aliases     ifup-ppp     network-functions-ipv6
ifdown-post  ifup-bnep        ifup-routes
[root@centos7 network-scripts]# vim ifcfg-ens33
[root@centos7 network-scripts]# cat ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=5e6c95dd-481b-4f1a-92ec-2ced3b03210b
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.80.20
PREFIX=24
GATEWAY=192.168.80.2
DNS1=8.8.8.8
DNS2=114.114.114.114
[root@centos7 network-scripts]# systemctl restart network
[root@centos7 network-scripts]# systemctl status network
● network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
   Active: active (exited) since 三 2026-05-06 19:51:09 CST; 6s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 19020 ExecStop=/etc/rc.d/init.d/network stop (code=exited, status=0/SUCCESS)
  Process: 19198 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)

5月 06 19:51:08 centos7 systemd[1]: Stopped LSB: Bring up/down networking.
5月 06 19:51:08 centos7 systemd[1]: Starting LSB: Bring up/down networking...
5月 06 19:51:09 centos7 network[19198]: 正在打开环回接口: [  确定  ]
5月 06 19:51:09 centos7 network[19198]: 正在打开接口 ens33: 连接已成功激活…2)
5月 06 19:51:09 centos7 network[19198]: [  确定  ]
5月 06 19:51:09 centos7 systemd[1]: Started LSB: Bring up/down networking.
Hint: Some lines were ellipsized, use -l to show in full.
[root@centos7 network-scripts]# cd /etc/yum.repos.d/
[root@centos7 yum.repos.d]# rm -rf *
[root@centos7 yum.repos.d]# ls
[root@centos7 yum.repos.d]# vim aliyun.repo
[root@centos7 yum.repos.d]# cat aliyun.repo
[aliyun-os]
name=aliyun-os
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0

[aliyun-epel]
name=aliyun-epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0

[aliyun-extra]
name=aliyun-extra
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
enabled=1
gpgcheck=0
[root@centos7 yum.repos.d]# ls
aliyun.repo
[root@centos7 yum.repos.d]#

2. 创建用户组 dinstall

groupadd dinstall -g 2001

3. 创建用户 dmdba

useradd -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba
[root@centos7 ~]# groupadd dinstall -g 2001
[root@centos7 ~]# useradd -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba
[root@centos7 ~]# passwd dmdba
更改用户 dmdba 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@centos7 ~]#

4. 修改限制参数

修改 /etc/security/limits.conf 配置文件

cat >> /etc/security/limits.conf <<EOF
dmdba  soft      nice       0
dmdba  hard      nice       0
dmdba  soft      as         unlimited
dmdba  hard      as         unlimited
dmdba  soft      fsize      unlimited
dmdba  hard      fsize      unlimited
dmdba  soft      nproc      65536
dmdba  hard      nproc      65536
dmdba  soft      nofile     65536
dmdba  hard      nofile     65536
dmdba  soft      core       unlimited
dmdba  hard      core       unlimited
dmdba  soft      data       unlimited
dmdba  hard      data       unlimited
EOF

重启系统生效

reboot

切换到 dmdba 用户,查看配置是否生效

su - dmdba
ulimit -a

实现

[root@centos7 ~]# su - dmdba
[dmdba@centos7 ~]$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 31117
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 65536
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[dmdba@centos7 ~]$

5. 创建安装目录

切换至 root 用户,创建实例保存目录、归档保存目录、备份保存目录

su - root

#实例保存目录
mkdir -p /dmdata/data 

#归档保存目录
mkdir -p /dmdata/arch

#备份保存目录
mkdir -p /dmdata/dmbak
[root@centos7 ~]# mkdir -p /dmdata/data
[root@centos7 ~]# mkdir -p /dmdata/arch
[root@centos7 ~]# mkdir -p /dmdata/dmbak
[root@centos7 ~]# ls /dmdata/
arch  data  dmbak
[root@centos7 ~]#

修改安装目录权限

# owner 改为 dmdba,group 改为 dinstall
chown -R dmdba:dinstall /dmdata/data
chown -R dmdba:dinstall /dmdata/arch
chown -R dmdba:dinstall /dmdata/dmbak

# 授予755权限
chmod -R 755 /dmdata/data
chmod -R 755 /dmdata/arch
chmod -R 755 /dmdata/dmbak
[root@centos7 ~]# chown -R dmdba:dinstall /dmdata/data
[root@centos7 ~]# chown -R dmdba:dinstall /dmdata/arch
[root@centos7 ~]# chown -R dmdba:dinstall /dmdata/dmbak
[root@centos7 ~]# chmod -R 755 /dmdata/data
[root@centos7 ~]# chmod -R 755 /dmdata/arch
[root@centos7 ~]# chmod -R 755 /dmdata/dmbak
[root@centos7 ~]# ll /dmdata/
总用量 0
drwxr-xr-x 2 dmdba dinstall 6 5月   6 20:01 arch
drwxr-xr-x 2 dmdba dinstall 6 5月   6 20:01 data
drwxr-xr-x 2 dmdba dinstall 6 5月   6 20:01 dmbak
[root@centos7 ~]#

三、DM8安装实践

1. 挂载镜像

CentOS7 挂载 ISO 镜像

DM 达梦数据库4.png

挂载镜像到 /mnt/ 目录下,查看目录内容

切换到 root 用户,将 DM 数据库的 iso 安装包保存在任意位置,例如 /opt 目录下,执行如下命令挂载镜像:

[root@centos7 ~]# ls
anaconda-ks.cfg  dm8_20251208_x86_CentOS7_64.iso  init_centos7.sh
[root@centos7 ~]# ls -hl
总用量 908M
-rw-------. 1 root root 1.3K 5月   7 2026 anaconda-ks.cfg
-rw-r--r--  1 root root 908M 5月   6 20:05 dm8_20251208_x86_CentOS7_64.iso
-rwxr-xr-x. 1 root root 2.2K 5月   6 19:38 init_centos7.sh
[root@centos7 ~]# mv dm8_20251208_x86_CentOS7_64.iso /opt
[root@centos7 ~]# cd /opt
[root@centos7 opt]# ls
dm8_20251208_x86_CentOS7_64.iso
[root@centos7 opt]# mount -o loop dm8_20251208_x86_CentOS7_64.iso /mnt
# -o:选项说明,通过 loop 设备(环回设备)来挂载一个普通文件(比如 ISO 镜像),让它模拟成块设备,再挂载到目录上。
# 加 -o loop(mount -o loop xxx.iso /mnt) → 挂载 ISO 文件
# 不加 -o loop(直接 mount /dev/sr0 /mnt) → 挂载真实的光驱设备
mount: /dev/loop0 写保护,将以只读方式挂载
[root@centos7 opt]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   44G  3.0G   42G    7% /
devtmpfs                 3.8G     0  3.8G    0% /dev
tmpfs                    3.9G     0  3.9G    0% /dev/shm
tmpfs                    3.9G   12M  3.8G    1% /run
tmpfs                    3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/sda1               1014M  146M  869M   15% /boot
tmpfs                    781M     0  781M    0% /run/user/0
/dev/loop0               908M  908M     0  100% /mnt
[root@centos7 opt]# ls /mnt
DM8 Install.pdf  DMInstall.bin
[root@centos7 opt]#

2. 安装DM8

切换至 dmdba 用户,进入到 /mnt 目录下

su - dmdba
cd /mnt

执行 DMInstall.bin 安装程序

./DMInstall.bin -i
[root@centos7 ~]# su - dmdba
上一次登录:三 5月  6 20:00:29 CST 2026pts/0 上
[dmdba@centos7 ~]$ cd /mnt
[dmdba@centos7 mnt]$ ./DMInstall.bin -i
安装语言:
[1]: 简体中文
[2]: English
请选择安装语言 [1]:1
解压安装程序..........
硬件架构校验通过!
欢迎使用达梦数据库安装程序

是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:n

是否设置时区? (Y/y:是 N/n:否) [Y/y]:y
设置时区:
[ 1]: (GTM-12:00) 日界线西
[ 2]: (GTM-11:00) 萨摩亚群岛
[ 3]: (GTM-10:00) 夏威夷
[ 4]: (GTM-09:00) 阿拉斯加
[ 5]: (GTM-08:00) 太平洋时间(美国和加拿大)
[ 6]: (GTM-07:00) 亚利桑那
[ 7]: (GTM-06:00) 中部时间(美国和加拿大)
[ 8]: (GTM-05:00) 东部部时间(美国和加拿大)
[ 9]: (GTM-04:00) 大西洋时间(美国和加拿大)
[10]: (GTM-03:00) 巴西利亚
[11]: (GTM-02:00) 中大西洋
[12]: (GTM-01:00) 亚速尔群岛
[13]: (GTM) 格林威治标准时间
[14]: (GTM+01:00) 萨拉热窝
[15]: (GTM+02:00) 开罗
[16]: (GTM+03:00) 莫斯科
[17]: (GTM+04:00) 阿布扎比
[18]: (GTM+05:00) 伊斯兰堡
[19]: (GTM+06:00) 达卡
[20]: (GTM+07:00) 曼谷,河内
[21]: (GTM+08:00) 中国标准时间
[22]: (GTM+09:00) 首尔
[23]: (GTM+10:00) 关岛
[24]: (GTM+11:00) 所罗门群岛
[25]: (GTM+12:00) 斐济
[26]: (GTM+13:00) 努库阿勒法
[27]: (GTM+14:00) 基里巴斯
请选择时区 [21]:21

安装类型:
1 典型安装
2 服务器
3 客户端
4 自定义
请选择安装类型的数字序号 [1 典型安装]:1
所需空间: 1809M

请选择安装目录 [/home/dmdba/dmdbms]:
可用空间: 39G
是否确认安装路径(/home/dmdba/dmdbms)? (Y/y:是 N/n:否)  [Y/y]:y

安装前小结
安装位置: /home/dmdba/dmdbms
所需空间: 1809M
可用空间: 39G
版本信息:
有效日期:
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2026-05-06 20:12:38
[INFO] 安装达梦数据库...
2026-05-06 20:12:38
[INFO] 安装 基础 模块...
2026-05-06 20:12:45
[INFO] 安装 服务器 模块...
2026-05-06 20:12:46
[INFO] 安装 客户端 模块...
2026-05-06 20:12:49
[INFO] 安装 驱动 模块...
2026-05-06 20:12:52
[INFO] 安装 手册 模块...
2026-05-06 20:12:52
[INFO] 安装 服务 模块...
2026-05-06 20:12:53
[INFO] 移动日志文件。
2026-05-06 20:12:54
[INFO] 安装达梦数据库完成。

请以root系统用户执行命令:
/home/dmdba/dmdbms/script/root/root_installer.sh

安装结束

[dmdba@centos7 mnt]$

切换至 root 用户

su - root

问题:为什么切换回root账号?
答案:DmAPService 要以 root 注册/运行,是因为它需要写入系统级的 systemd 配置,并具备更高的权限来管理数据库备份和守护进程;而数据库实例进程依旧以普通用户 dmdba 来运行。

执行命令,创建 DmAPService,否则会影响数据库备份。

DmAPService:Database Advanced Process Service(达梦数据库高级进程服务),它是达梦在 Linux/Unix 下提供的一个 辅助后台守护进程,通常随 root_installer.sh 安装一起创建并注册到系统服务里。主要用于:① 数据库备份/恢复 ② 管理数据库(部分) ③ 支持任务调度

DM 达梦数据库5.png

数据库安装完成后,需要切换至 root 用户执行上图中的命令 /home/dmdba/dmdbms/script/root/root_installer.sh 创建 DmAPService,否则会影响数据库备份。

/home/dmdba/dmdbms/script/root/root_installer.sh
[dmdba@centos7 mnt]$ /home/dmdba/dmdbms/script/root/root_installer.sh
必须以 root身份执行此脚本!
[dmdba@centos7 mnt]$ 登出
[root@centos7 ~]# /home/dmdba/dmdbms/script/root/root_installer.sh
移动 /home/dmdba/dmdbms/bin/dm_svc.conf 到/etc目录
创建DmAPService服务
Created symlink from /etc/systemd/system/multi-user.target.wants/DmAPService.service to /usr/lib/systemd/system/DmAPService.service.
创建服务(DmAPService)完成
启动DmAPService服务
[root@centos7 ~]#

3. 配置环境变量

切换至 dmdba 用户

su - dmdba

修改环境变量配置文件 .bash_profile

export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
echo "export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool" >> ~/.bash_profile

刷新环境变量

source ~/.bash_profile
[root@centos7 ~]# su - dmdba
上一次登录:三 5月  6 20:08:40 CST 2026pts/0 上
[dmdba@centos7 ~]$ export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
[dmdba@centos7 ~]$ echo "export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool" >> ~/.bash_profile
[dmdba@centos7 ~]$ source ~/.bash_profile
[dmdba@centos7 ~]$

4. 初始化数据库

进入 /home/dmdba/dmdbms/bin 目录下,查看目录内容

cd /home/dmdba/dmdbms/bin
ls
[dmdba@centos7 ~]$ cd /home/dmdba/dmdbms/bin
[dmdba@centos7 bin]$ ls
cexe                      libdmapx.so            libdmmraft.so
client_ssl                libdmasmapim.so        libdmmsg_parse.so
dependencies              libdmasmapi.so         libdmmsgparse.so
dexp                      libdmasmm.so           libdmmsg.so
dexpdp                    libdmasmparsem.so      libdmnci.so
dimp                      libdmasmparse.so       libdmnetsvr.so
dimpdp                    libdmasm.so            libdmnlssort.so
disql                     libdmasvrm.so          libdmnpi.so
disql_conf                libdmasvr.so           libdmnsort.so
dmamon                    libdmaud.so            libdmoopi.so
dmamon_ctl                libdmbak2.so           libdmopt.so
dmap                      libdmbcast2.so         libdmos.so
dmap_br                   libdmbcast.so          libdmpara.so
dmap.ini                  libdmbifun.so          libdmp_disql_dll_java.so
DmAPService               libdmblb.so            libdmp_dll.so
dmasmcmd                  libdmbldr.so           libdmpif.so
dmasmcmdm                 libdmbrtsk.so          libdmrac.so
dmasmmgt                  libdmbtr.so            libdmraft.so
dmasmmgtm                 libdmcalc.so           libdmrarch.so
dmasmsvr                  libdmcfg.so            libdmreadline.so
dmasmsvrm                 libdmckpt.so           libdmredo.so
dmasmtool                 libdmclientlex.so      libdmregex.so
dmasmtoolm                libdmcomm.so           libdmrep.so
DmAuditMonitorService     libdmcpr.so            libdmrlog.so
dmaudtool                 libdmcpt.so            libdmrman.so
dmcss                     libdmcrypt.so          libdmrps.so
dmcssm                    libdmcssmon.so         libdmrs.so
dmctlcvt                  libdmcss.so            libdmrtree.so
dmcyt                     libdmcti.so            libdmsbtex.so
dmdata_cmp                libdmcvt.so            libdmsbtree.so
dmdbchk                   libdmcyt.so            libdmsbtrio.so
dmdbg                     libdmdbg.so            libdmsbts3.so
dmdul                     libdmdci.so            libdmsbt.so
dmfekey                   libdmdcp.so            libdmscp.so
dmfldr                    libdmdcrm.so           libdmsess.so
dmgrpmon                  libdmdcr.so            libdmshmm.so
dmimon                    libdmdct.so            libdmshm.so
dminit                    libdmde.so             libdmshpldr.so
DmInstanceMonitorService  libdmdfi.so            libdmspatial.so
dmjmon                    libdmdfs.so            libdmstg.so
DmJobMonitorService       libdmdpc_nts.so        libdmstrt.so
dmkey                     libdmdpc.so            libdmsys.so
dmlcvt                    libdmdpi.so            libdmtbl.so
dmldrc                    libdmdprtsk.so         libdmtimer.so
dmldrp                    libdmdta.so            libdmtlog.so
dmldrpc                   libdmelog.so           libdmtrc.so
dmmdf                     libdmenet.so           libdmtrv.so
dmmkstore                 libdmexe.so            libdmtrx.so
dmmonitor                 libdmfil.so            libdmtsql.so
dmnetsvr                  libdmfldr_comm.so      libdmuthr.so
dmrachk                   libdmfldr_dll_java.so  libdmutl.so
dmrdc                     libdmfldr.so           libdmvector.so
dmrman                    libdmgmssl.so          libdmvtdskm.so
dmserver                  libdmgrpmon.so         libdmvtdsk.so
dmshp2st                  libdmhfs.so            libdmwseg.so
dmst2shp                  libdmimon_dll_java.so  libdmxai.so
dmstub                    libdmimon.so           libdmxa.so
dmukey_gen                libdmjmon.so           libdmxmal.so
dmwatcher                 libdmjob.so            libdodbc.so
dpc_new                   libdmjschdl.so         libdwatcher.so
external_crypto_libs      libdmjson.so           libdwmon.so
GCC_VERSION               libdmknl.so            libmlpack.so
GLIBC_VERSION             libdmldr.so            libs3api.so
HARDWARE                  libdmlic.so            MACHINE_INFO
jexe                      libdmllog.so           pids
jobdts                    libdmlnk.so            server_ssl
libaws-cpp-sdk-core.so    libdmlogmnr_client.so  service_desc_list
libaws-cpp-sdk-s3.so      libdmlogmnr.so         service_template
libcyt_java.so            libdmmal.so            svc_ctl_linux
libdisql_dll.so           libdmmem.so            SYSWORD.UTF8.LIB
libdmamon.so              libdmmout.so
[dmdba@centos7 bin]$

使用 dminit 命令初始化实例,dminit 命令可设置多种参数,查看可配置参数

./dminit help
[dmdba@centos7 bin]$ ./dminit help
initdb V8
db version: 0x7000d
file dm.key not found, use default license!
License will expire on 2026-11-13
version: 03134284458-20251113-301923-20178
格式: ./dminit     KEYWORD=value

例程: ./dminit     PATH=/public/dmdb/dmData PAGE_SIZE=16 SYSDBA_PWD=... SYSAUDITOR_PWD=... [SYSSSO_PWD=...]

关键字                     说明(默认值)
--------------------------------------------------------------------------------
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                   日志文件大小(4096),单位为:M,范围为:256M ~ 8G
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[BAIST],4[ZBMM]
SYSDBA_PWD                 设置SYSDBA密码
SYSAUDITOR_PWD             设置SYSAUDITOR密码
DB_NAME                    数据库名(DAMENG)
INSTANCE_NAME              实例名(DMSERVER)
PORT_NUM                   监听端口号(5236)
BUFFER                     系统缓存大小(8000),单位M
TIME_ZONE                  设置时区(+08:00)
PAGE_CHECK                 页检查模式(3),可选值:0/1/2/3
PAGE_HASH_NAME             设置页检查HASH算法
EXTERNAL_CIPHER_NAME       设置默认加密算法
EXTERNAL_HASH_NAME         设置默认HASH算法
EXTERNAL_CRYPTO_NAME       设置根密钥加密引擎
RLOG_ENCRYPT_NAME          设置日志文件加密算法,若未设置,则不加密
RLOG_POSTFIX_NAME          设置日志文件后缀名,长度不超过10。默认为log,例如DAMENG01.log
USBKEY_PIN                 设置USBKEY PIN
PAGE_ENC_SLICE_SIZE        设置页加密分片大小,可选值:0、512、4096,单位: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                分布式环境下协同工作的监听端口
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代替
USE_DB_NAME                路径是否拼接DB_NAME(1) 1:是 0:否
MAIN_DBF_PATH              MAIN数据文件存放路径
SYSTEM_DBF_PATH            SYSTEM数据文件存放路径
ROLL_DBF_PATH              ROLL数据文件存放路径
TEMP_DBF_PATH              TEMP数据文件存放路径
ENC_TYPE                   数据库内部加解密使用的加密接口类型(1), 可选值: 1: 优先使用EVP类型 0: 不启用EVP类型
RANDOM_CRYPTO              随机数算法所在加密引擎名
DPC_TENANCY                指定DPC集群是否启用多租户模式(0) 0:不启用 1:启用,取值0/1时也可以用FALSE/TRUE代替
AUTO_ADJ_PARA              是否开启INI参数自动调优(1) 0:否 1:是
AUTO_ADJ_CPUS              指定数据库可用CPU核数进行INI参数自动调优,AUTO_ADJ_PARA打开才生效(0) 可选值:0~64,0:默认使用当前机器所有核
AUTO_ADJ_MEM               指定数据库可用内存大小进行INI参数自动调优,AUTO_ADJ_PARA打开才生效(0) 单位:MB,0:默认使用当前机器80%的内存
PAGE_CHKSUM_POLICY         是否对于数据页的每一个4K块生成校验码(1) 0:否 1:是
HELP                       打印帮助信息
[dmdba@centos7 bin]$

使用 dminit 命令初始化实例,设置数据库目录为 /dmdata/data,就是在【配置DM8安装环境】中创建的安装目录,页大小为 32 KB,簇大小为 32 KB,大小写敏感,字符集为 UTF-8,数据库名为 DAMENG(对应图形化安装界面上的默认的数据库名 DAMENG),实例名为 DMSERVER(对应图形化安装界面上的默认的实例名 DMSERVER),端口为 5236

页(Page)是 达梦数据库存储的最小单位,所有的数据(表、索引等)最终都要写入“页”中。

簇(Extent)是 一组连续的数据页,是达梦分配空间的基本单位。代表数据库一次分配的空间块。

页大小 & 簇大小的关系?答:页是最小单位,簇是成批单位;PAGE_SIZE = 32K,EXTENT_SIZE = 32K(默认)→ 单个簇 1MB,如果系统数据量极大,可以调大 EXTENT_SIZE;如果系统偏向高并发小事务,可以考虑小一点的 PAGE_SIZE。

./dminit path=/dmdata/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=1 DB_NAME=DAMENG INSTANCE_NAME=DMSERVER PORT_NUM=5236 SYSDBA_PWD=Sysdba123 SYSAUDITOR_PWD=Auditor123
[dmdba@centos7 bin]$ ./dminit path=/dmdata/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=1 DB_NAME=DAMENG INSTANCE_NAME=DMSERVER PORT_NUM=5236 SYSDBA_PWD=Sysdba123 SYSAUDITOR_PWD=Auditor123
initdb V8
db version: 0x7000d
file dm.key not found, use default license!
License will expire on 2026-11-13
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL

 log file path: /dmdata/data/DAMENG/DAMENG01.log


 log file path: /dmdata/data/DAMENG/DAMENG02.log

write to dir [/dmdata/data/DAMENG].
create dm database success. 2026-05-06 20:23:48
[dmdba@centos7 bin]$

5. 注册服务

切换至 root 用户

su - root

进入 /home/dmdba/dmdbms/script/root/ 目录下,查看目录内容

cd /home/dmdba/dmdbms/script/root/
ls

执行 sh 脚本,注册实例服务,数据库名为 DAMENG(对应图形化安装界面上的默认的数据库名 DAMENG),-p DMSERVER 是服务名的后缀(对应图形化安装界面上的默认的实例名 DMSERVER),最终生成的服务名为:DmServiceDMSERVER。查看 dm_service_installer.sh 脚本文件,了解更多参数信息。

./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data/DAMENG/dm.ini -p DMSERVER
[dmdba@centos7 bin]$ su -
密码:
上一次登录:三 5月  6 20:01:38 CST 2026pts/0 上
[root@centos7 ~]# cd /home/dmdba/dmdbms/script/root/
[root@centos7 root]# ls
dm_service_installer.sh  dm_service_uninstaller.sh  root_installer.sh
[root@centos7 root]# ./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data/DAMENG/dm.ini -p DMSERVER
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDMSERVER.service to /usr/lib/systemd/system/DmServiceDMSERVER.service.
创建服务(DmServiceDMSERVER)完成
[root@centos7 root]#

进入 cd /home/dmdba/dmdbms/bin 目录下,查看目录中生成的服务实例 DmServiceDMSERVER

cd /home/dmdba/dmdbms/bin
ls
[root@centos7 root]# cd /home/dmdba/dmdbms/bin
[root@centos7 bin]# ls
cexe                      libdmamon.so           libdmmout.so
client_ssl                libdmapx.so            libdmmraft.so
dependencies              libdmasmapim.so        libdmmsg_parse.so
dexp                      libdmasmapi.so         libdmmsgparse.so
dexpdp                    libdmasmm.so           libdmmsg.so
dimp                      libdmasmparsem.so      libdmnci.so
dimpdp                    libdmasmparse.so       libdmnetsvr.so
disql                     libdmasm.so            libdmnlssort.so
disql_conf                libdmasvrm.so          libdmnpi.so
dmamon                    libdmasvr.so           libdmnsort.so
dmamon_ctl                libdmaud.so            libdmoopi.so
dmap                      libdmbak2.so           libdmopt.so
dmap_br                   libdmbcast2.so         libdmos.so
dmap.ini                  libdmbcast.so          libdmpara.so
DmAPService               libdmbifun.so          libdmp_disql_dll_java.so
dmasmcmd                  libdmblb.so            libdmp_dll.so
dmasmcmdm                 libdmbldr.so           libdmpif.so
dmasmmgt                  libdmbrtsk.so          libdmrac.so
dmasmmgtm                 libdmbtr.so            libdmraft.so
dmasmsvr                  libdmcalc.so           libdmrarch.so
dmasmsvrm                 libdmcfg.so            libdmreadline.so
dmasmtool                 libdmckpt.so           libdmredo.so
dmasmtoolm                libdmclientlex.so      libdmregex.so
DmAuditMonitorService     libdmcomm.so           libdmrep.so
dmaudtool                 libdmcpr.so            libdmrlog.so
dmcss                     libdmcpt.so            libdmrman.so
dmcssm                    libdmcrypt.so          libdmrps.so
dmctlcvt                  libdmcssmon.so         libdmrs.so
dmcyt                     libdmcss.so            libdmrtree.so
dmdata_cmp                libdmcti.so            libdmsbtex.so
dmdbchk                   libdmcvt.so            libdmsbtree.so
dmdbg                     libdmcyt.so            libdmsbtrio.so
dmdul                     libdmdbg.so            libdmsbts3.so
dmfekey                   libdmdci.so            libdmsbt.so
dmfldr                    libdmdcp.so            libdmscp.so
dmgrpmon                  libdmdcrm.so           libdmsess.so
dmimon                    libdmdcr.so            libdmshmm.so
dminit                    libdmdct.so            libdmshm.so
DmInstanceMonitorService  libdmde.so             libdmshpldr.so
dmjmon                    libdmdfi.so            libdmspatial.so
DmJobMonitorService       libdmdfs.so            libdmstg.so
dmkey                     libdmdpc_nts.so        libdmstrt.so
dmlcvt                    libdmdpc.so            libdmsys.so
dmldrc                    libdmdpi.so            libdmtbl.so
dmldrp                    libdmdprtsk.so         libdmtimer.so
dmldrpc                   libdmdta.so            libdmtlog.so
dmmdf                     libdmelog.so           libdmtrc.so
dmmkstore                 libdmenet.so           libdmtrv.so
dmmonitor                 libdmexe.so            libdmtrx.so
dmnetsvr                  libdmfil.so            libdmtsql.so
dmrachk                   libdmfldr_comm.so      libdmuthr.so
dmrdc                     libdmfldr_dll_java.so  libdmutl.so
dmrman                    libdmfldr.so           libdmvector.so
dmserver                  libdmgmssl.so          libdmvtdskm.so
DmServiceDMSERVER         libdmgrpmon.so         libdmvtdsk.so
dmshp2st                  libdmhfs.so            libdmwseg.so
dmst2shp                  libdmimon_dll_java.so  libdmxai.so
dmstub                    libdmimon.so           libdmxa.so
dmukey_gen                libdmjmon.so           libdmxmal.so
dmwatcher                 libdmjob.so            libdodbc.so
dpc_new                   libdmjschdl.so         libdwatcher.so
external_crypto_libs      libdmjson.so           libdwmon.so
GCC_VERSION               libdmknl.so            libmlpack.so
GLIBC_VERSION             libdmldr.so            libs3api.so
HARDWARE                  libdmlic.so            MACHINE_INFO
jexe                      libdmllog.so           pids
jobdts                    libdmlnk.so            server_ssl
libaws-cpp-sdk-core.so    libdmlogmnr_client.so  service_desc_list
libaws-cpp-sdk-s3.so      libdmlogmnr.so         service_template
libcyt_java.so            libdmmal.so            svc_ctl_linux
libdisql_dll.so           libdmmem.so            SYSWORD.UTF8.LIB
[root@centos7 bin]#

6. 启动DM8

切换至 dmdba 用户

su - dmdba

进入 cd /home/dmdba/dmdbms/bin 目录下

cd /home/dmdba/dmdbms/bin

启动数据库

./DmServiceDMSERVER start
[root@centos7 ~]# su - dmdba
上一次登录:三 5月  6 20:32:02 CST 2026pts/0 上
[dmdba@centos7 ~]$ cd /home/dmdba/dmdbms/bin
[dmdba@centos7 bin]$ ./DmServiceDMSERVER start
Starting DmServiceDMSERVER:
                                                           [ OK ]
[dmdba@centos7 bin]$
[dmdba@centos7 bin]$ netstat -pantul | grep dm
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::4236                 :::*                    LISTEN      39072/dmap
tcp6       0      0 :::5236                 :::*                    LISTEN      39326/dmserver
[dmdba@centos7 bin]$

停止数据库

./DmServiceDMSERVER stop

重启数据库

./DmServiceDMSERVER restart

查看数据库状态

./DmServiceDMSERVER status
[dmdba@centos7 bin]$ ./DmServiceDMSERVER stop
Stopping DmServiceDMSERVER:
                                                           [ OK ]
[dmdba@centos7 bin]$
[dmdba@centos7 bin]$ ./DmServiceDMSERVER restart
DmServiceDMSERVER service is stopped.
Starting DmServiceDMSERVER:
                                                           [ OK ]
[dmdba@centos7 bin]$
[dmdba@centos7 bin]$ ./DmServiceDMSERVER status
DmServiceDMSERVER (pid 39527) is running.
[dmdba@centos7 bin]$ netstat -pantul | grep 5236
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::5236                 :::*                    LISTEN      39527/dmserver
[dmdba@centos7 bin]$

6.1. 拓展:systemd管理DM数据库

注意:默认就有,使用root操作!

# 启动达梦数据库服务
systemctl start DmServiceDMSERVER
# 停止服务
systemctl stop DmServiceDMSERVER
# 设置开机自启
systemctl enable DmServiceDMSERVER

7. rlwrap命令行工具

rlwrap 是一款轻量级的 Linux/Unix 命令行工具,全称是 Read Line Wrapper(读行包装器),核心作用是为不支持 GNU Readline 库的命令行程序,补上命令行编辑、历史记录、自动补全等实用功能。

yum install rlwrap -y
[root@centos7 ~]# su - dmdba
上一次登录:四 5月  7 20:38:46 CST 2026pts/0 上
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.394(ms)
disql V8
SQL>

8. 登录DM8

运行 disql 工具

disql
# 或
/home/dmdba/dmdbms/tool/disql

登录 DM8,输入账号 SYSDBA,密码 Sysdba123

查询版本

SELECT * FROM v$version;

退出 DM8

exit; # 或 Ctrl+D

完整效果

[dmdba@centos7 bin]$ disql
disql V8
用户名:SYSDBA
密码:

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.698(ms)
SQL> select * from v$version;

行号       BANNER
---------- ---------------------------------
1          DM Database Server 64 V8
2          DB Version: 0x7000d
3          03134284458-20251113-301923-20178
4          Msg Version: 1
5          Gsu level(5) cnt: 102

已用时间: 2.291(毫秒). 执行号:601.
SQL>
[dmdba@centos7 bin]$

快捷连接方法

./disql SYSDBA/Sysdba123@LOCALHOST:5236
[dmdba@centos7 bin]$ ./disql SYSDBA/Sysdba123@LOCALHOST:5236

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.411(ms)
disql V8
SQL> select * from v$version;

行号       BANNER
---------- ---------------------------------
1          DM Database Server 64 V8
2          DB Version: 0x7000d
3          03134284458-20251113-301923-20178
4          Msg Version: 1
5          Gsu level(5) cnt: 102

已用时间: 0.533(毫秒). 执行号:701.
SQL>
[dmdba@centos7 bin]$

在/home/dmdba/dmdbms/bin下可以直接执行

[dmdba@centos7 bin]$ pwd
/home/dmdba/dmdbms/bin
[dmdba@centos7 bin]$ ./disql SYSDBA/Sysdba123@LOCALHOST:5236

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.408(ms)
disql V8
SQL>
[dmdba@centos7 bin]$ disql SYSDBA/Sysdba123@LOCALHOST:5236

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.786(ms)
disql V8
SQL> select username from DBA_USERS;

行号       USERNAME
---------- ----------
1          SYS
2          SYSDBA
3          SYSSSO
4          SYSAUDITOR

已用时间: 24.386(毫秒). 执行号:1201.
SQL>
[dmdba@centos7 bin]$

9. 开放端口 5236

5236 是达梦结合品牌寓意(江湖流传 5236 我爱达梦)和易记性设计的默认端口

查看 DM8 服务(实例名:dmserver,由初始化数据库时指定的)监听哪些端口

ss -nap | grep dmserver
# 或
netstat -pantul | grep dmserver

切换至 root 用户

su - root

检查端口是否开放

firewall-cmd --zone=public --query-port=5236/tcp

开放端口

firewall-cmd --zone=public --add-port=5236/tcp --permanent

重新加载

firewall-cmd --reload

再检查端口是否开放

firewall-cmd --zone=public --query-port=5236/tcp

或直接禁用 firewalld

systemctl stop firewalld
systemctl disable firewalld

四、DM8 SQL语句

1. DDL:数据定义语言

1.1. 库与用户

  • MySQL:CREATE DATABASE testdb;
  • 达梦:用户即 Schema
对比维度MySQL达梦 DM
核心架构多数据库(Database)+ 多用户单实例 + 多用户(用户 = Schema)
“库” 的载体Database 是独立的命名空间Schema(绑定用户)是命名空间
用户与库的关系用户需要被授权访问某个 Database用户本身就对应一个 Schema(库)
新建 “库” 语法CREATE DATABASE testdb;CREATE USER test IDENTIFIED BY 密码;
-- 用 SYSDBA 用户登录达梦数据库
su - dmdba
disql SYSDBA/Sysdba123

-- 查看所有Schema(模式)名称(对应MySQL的数据库名)
SELECT USERNAME FROM DBA_USERS;

-- 创建 app 用户
CREATE USER app IDENTIFIED BY "Passw0rd!";

-- 基础:允许 app 用户登录
GRANT CREATE SESSION TO app;

-- 用 app 用户登录达梦数据库
su - dmdba
disql app/Passw0rd!

-- 用 SYSDBA 用户登录达梦数据库
su - dmdba
disql SYSDBA/Sysdba123

-- 模式管理:允许 app 用户创建自己的 schema
GRANT CREATE SCHEMA TO app;

-- 对象管理:允许 app 用户创建常见对象
GRANT CREATE TABLE TO app;
GRANT CREATE VIEW TO app;
GRANT CREATE SEQUENCE TO app;
GRANT CREATE TRIGGER TO app;

-- 存储逻辑:允许 app 用户编写存储过程、函数(如业务需要)
GRANT CREATE PROCEDURE TO app;

-- 索引管理:允许 app 用户创建索引
GRANT CREATE INDEX TO app;

-- 或

GRANT RESOURCE TO app;
GRANT CREATE SESSION TO app;
[root@centos7 ~]# su - dmdba
上一次登录:四 5月  7 20:38:46 CST 2026pts/0 上
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.394(ms)
disql V8
SQL> SELECT USERNAME FROM DBA_USERS;

行号       USERNAME
---------- ----------
1          SYS
2          SYSDBA
3          SYSSSO
4          SYSAUDITOR

已用时间: 25.587(毫秒). 执行号:601.
SQL> CREATE USER app IDENTIFIED BY "Passw0rd!";
操作已执行
已用时间: 6.597(毫秒). 执行号:602.
SQL> GRANT CREATE SESSION TO app;
操作已执行
已用时间: 3.687(毫秒). 执行号:603.
SQL>
[dmdba@centos7 ~]$ rlwrap disql app/Passw0rd!

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.207(ms)
disql V8
SQL>
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 2.663(ms)
disql V8
SQL> GRANT CREATE SCHEMA TO app;
操作已执行
已用时间: 4.040(毫秒). 执行号:901.
SQL> GRANT CREATE TABLE TO app;
操作已执行
已用时间: 3.812(毫秒). 执行号:902.
GRANT CREATE VIEW TO app;
GRANT CREATE SEQUENCE TO app;
操作已执行
已用时间: 3.772(毫秒). 执行号:903.
SQL> 操作已执行
已用时间: 1.952(毫秒). 执行号:904.
SQL> GRANT CREATE TRIGGER TO app;
操作已执行
已用时间: 2.887(毫秒). 执行号:905.
SQL> GRANT CREATE PROCEDURE TO app;
操作已执行
已用时间: 4.512(毫秒). 执行号:906.
SQL> GRANT CREATE INDEX TO app;
操作已执行
已用时间: 3.284(毫秒). 执行号:907.
SQL> GRANT RESOURCE TO app;
操作已执行
已用时间: 3.787(毫秒). 执行号:908.
SQL> GRANT CREATE SESSION TO app;
操作已执行
已用时间: 2.842(毫秒). 执行号:909.
SQL>

1.2. 字段类型对照

场景MySQL达梦 DM8说明
整数INT/BIGINT同名支持范围略有差异
定点数DECIMAL(p,s)DECIMAL/NUMBER财务推荐
浮点数FLOAT/DOUBLEFLOAT/DOUBLE非精确
字符VARCHAR、TEXTVARCHAR2、CLOBTEXT → CLOB
二进制BLOB/VARBINARYBLOB/RAW大对象用 BLOB
日期时间DATETIME/TIMESTAMPDATE/TIMESTAMPDATE 含时分秒
布尔BOOLEANTINYINT/CHAR(1)用 0/1 或 Y/N

1.3. 建表示例

-- 用 app 用户登录达梦数据库
su - dmdba
disql app/Passw0rd!

-- 创建 users 表
CREATE TABLE app.users (
  id        BIGINT PRIMARY KEY,
  username  VARCHAR2(50) NOT NULL,
  email     VARCHAR2(200) UNIQUE,
  status    CHAR(1) DEFAULT 'A' CHECK (status IN ('A','D')),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 查询表的信息
SELECT TABLE_NAME, OWNER FROM ALL_TABLES;
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';
SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = 'APP'; # 这个操作需要用 SYSDBA 用户
-- 用 SYSDBA 用户登录达梦数据库
su - dmdba
disql SYSDBA/Sysdba123
[root@centos7 ~]# su - dmdba
上一次登录:四 5月  7 20:43:20 CST 2026pts/0 上
[dmdba@centos7 ~]$ rlwrap disql app/Passw0rd!

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.346(ms)
disql V8
CREATE TABLE app.users (
  id        BIGINT PRIMARY KEY,
  username  VARCHAR2(50) NOT NULL,
  email     VARCHAR2(200) UNIQUE,
  status    CHAR(1) DEFAULT 'A' CHECK (status IN ('A','D')),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  2   3   4   5   6   7   );
操作已执行
已用时间: 29.586(毫秒). 执行号:1201.
SQL> SELECT TABLE_NAME, OWNER FROM ALL_TABLES;

行号       TABLE_NAME                  OWNER
---------- --------------------------- ------
1          ##HISTOGRAMS_TABLE          SYSDBA
2          ##TMP_TBL_FOR_DBMS_LOB_BLOB SYS
3          ##TMP_TBL_FOR_DBMS_LOB_CLOB SYS
4          AQ$_QUEUE_TABLES            SYS
5          AQ$_QUEUES                  SYS
6          REG$                        SYS
7          ##PLAN_TABLE                SYS
8          USERS                       APP

8 rows got

已用时间: 60.262(毫秒). 执行号:1202.
SQL> SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';

行号       TABLE_NAME
---------- ----------
1          USERS

已用时间: 36.406(毫秒). 执行号:1203.
SQL>

2. DML + DQL:增删改查

-- 用 SYSDBA 用户登录达梦数据库
su - dmdba
disql SYSDBA/Sysdba123

2.1. 插入(Insert)

SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';
INSERT INTO app.users(id, username, email)
VALUES (1, 'alice', 'a@x.com');
INSERT INTO app.users(id, username, email)
VALUES (2, 'bob', 'b@x.com');
INSERT INTO app.users(id, username, email, status)VALUES (3, 'tom', 'c@x.com', 'D');
INSERT INTO app.users(id, username, email, status)VALUES (4, 'jack', 'c@x.com', 'X'); # 这里故意写X
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.416(ms)
disql V8
SQL> SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';

行号       TABLE_NAME
---------- ----------
1          USERS

已用时间: 45.837(毫秒). 执行号:1401.
INSERT INTO app.users(id, username, email)
VALUES (1, 'alice', 'a@x.com');
INSERT INTO app.users(id, username, email)
VALUES (2, 'bob', 'b@x.com');
INSERT INTO app.users(id, username, email, status)VALUES (3, 'tom', 'c@x.com', 'D');
2   影响行数 1

已用时间: 2.441(毫秒). 执行号:1402.
SQL> 2   影响行数 1

已用时间: 0.489(毫秒). 执行号:1403.
SQL> 影响行数 1

已用时间: 0.418(毫秒). 执行号:1404.
SQL> INSERT INTO app.users(id, username, email, status)VALUES (4, 'jack', 'c@x.com', 'X');
INSERT INTO app.users(id, username, email, status)VALUES (4, 'jack', 'c@x.com', 'X');
[-6604]:违反CHECK约束[CONS134218798].
已用时间: 0.891(毫秒). 执行号:0.
SQL>

2.2. 查询(Select)

select * from app.users;
SELECT id, username, email FROM app.users WHERE status='A';
SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com A
           2026-05-07 20:54:48.293626

2          2                    bob      b@x.com A
           2026-05-07 20:54:48.294267

3          3                    tom      c@x.com D
           2026-05-07 20:54:48.294802


已用时间: 2.107(毫秒). 执行号:1406.
SQL> SELECT id, username, email FROM app.users WHERE status='A';

行号       ID                   USERNAME EMAIL
---------- -------------------- -------- -------
1          1                    alice    a@x.com
2          2                    bob      b@x.com

已用时间: 2.264(毫秒). 执行号:1407.
SQL> SELECT id, username, email FROM app.users WHERE status='D';

行号       ID                   USERNAME EMAIL
---------- -------------------- -------- -------
1          3                    tom      c@x.com

已用时间: 2.439(毫秒). 执行号:1501.
SQL>

2.3. 更新(Update)

UPDATE app.users SET status='D' WHERE id=1;
SQL> UPDATE app.users SET status='D' WHERE id=1;
影响行数 1

已用时间: 2.310(毫秒). 执行号:1502.
SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com D
           2026-05-07 20:54:48.293626

2          2                    bob      b@x.com A
           2026-05-07 20:54:48.294267

3          3                    tom      c@x.com D
           2026-05-07 20:54:48.294802


已用时间: 0.282(毫秒). 执行号:1503.
SQL>

2.4. 删除(Delete)

DELETE FROM app.users WHERE id=1;
delete from app.users;
SQL> DELETE FROM app.users WHERE id=1;
影响行数 1

已用时间: 2.273(毫秒). 执行号:1504.
SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          2                    bob      b@x.com A
           2026-05-07 20:54:48.294267

2          3                    tom      c@x.com D
           2026-05-07 20:54:48.294802


已用时间: 0.413(毫秒). 执行号:1505.
SQL> delete from app.users;
影响行数 2

已用时间: 2.426(毫秒). 执行号:1506.
SQL> select * from app.users;
未选定行

已用时间: 0.756(毫秒). 执行号:1507.
SQL>

2.5. 插入并返回主键

-- 1. 清理旧表:如果app模式下的users表存在,则彻底删除(PURGE跳过回收站)
DROP TABLE IF EXISTS app.users PURGE;

-- 2. 清理旧序列:如果app模式下的seq_users序列存在,则删除
DROP SEQUENCE IF EXISTS app.seq_users;

-- 3. 创建序列(用于生成users表的主键id)
CREATE SEQUENCE app.seq_users
  START WITH 1        -- 序列初始值为1
  INCREMENT BY 1      -- 序列每次增长1
  NOCACHE             -- 不缓存序列值,保证id连续
  NOCYCLE;            -- 序列不循环,避免主键重复

-- 4. 重建users表
CREATE TABLE app.users (
  id         BIGINT PRIMARY KEY,        -- 主键,由序列自动生成
  username   VARCHAR2(50)  NOT NULL,    -- 用户名,非空
  email      VARCHAR2(200) UNIQUE,     -- 邮箱,唯一约束
  status     CHAR(1)        DEFAULT 'A' CHECK (status IN ('A','D')),  -- 状态:默认A(活跃),仅允许A/D(禁用)
  created_at TIMESTAMP      DEFAULT CURRENT_TIMESTAMP  -- 创建时间:默认当前时间
);

-- 5. APP里有哪些表
SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='APP';

-- 6. 查看表结构
DESC app.users;

-- 7. 插入数据:使用序列的下一个值作为主键id
INSERT INTO app.users(id, username, email)
VALUES (app.seq_users.NEXTVAL, 'alice', 'a@x.com');  -- 第一条数据:id=1
INSERT INTO app.users(id, username, email)
VALUES (app.seq_users.NEXTVAL, 'bob', 'b@x.com');     -- 第二条数据:id=2

-- 8. 查询序列当前值(查看最后一次生成的id)
SELECT app.seq_users.CURRVAL AS last_id FROM dual;

-- 9. 查看users表所有数据
select * from app.users;
SQL> DROP SEQUENCE IF EXISTS app.seq_users;
操作已执行
已用时间: 2.091(毫秒). 执行号:1509.
CREATE SEQUENCE app.seq_users
  START WITH 1        -- 序列初始值为1
  INCREMENT BY 1      -- 序列每次增长1
  NOCACHE             -- 不缓存序列值,保证id连续
2   3   4   5     NOCYCLE;            -- 序列不循环,避免主键重复
操作已执行
已用时间: 3.745(毫秒). 执行号:1510.
CREATE TABLE app.users (
  id         BIGINT PRIMARY KEY,        -- 主键,由序列自动生成
  username   VARCHAR2(50)  NOT NULL,    -- 用户名,非空
  email      VARCHAR2(200) UNIQUE,     -- 邮箱,唯一约束
  status     CHAR(1)        DEFAULT 'A' CHECK (status IN ('A','D')),  -- 状态:默认A(活跃),仅允许A/D(禁用)
  created_at TIMESTAMP      DEFAULT CURRENT_TIMESTAMP  -- 创建时间:默认当前时间
  2   3   4   5   6   7   );
操作已执行
已用时间: 23.384(毫秒). 执行号:1511.
SQL> SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='APP';

行号       TABLE_NAME
---------- ----------
1          USERS

已用时间: 22.296(毫秒). 执行号:1512.
SQL> DESC app.users;

行号       NAME       TYPE$        NULLABLE
---------- ---------- ------------ --------
1          ID         BIGINT       N
2          USERNAME   VARCHAR(50)  N
3          EMAIL      VARCHAR(200) Y
4          STATUS     CHAR(1)      Y
5          CREATED_AT DATETIME(6)  Y

已用时间: 10.162(毫秒). 执行号:1513.
INSERT INTO app.users(id, username, email)
VALUES (app.seq_users.NEXTVAL, 'alice', 'a@x.com');  -- 第一条数据:id=1
INSERT INTO app.users(id, username, email)
2   影响行数 1

已用时间: 2.263(毫秒). 执行号:1514.
SQL> 2   VALUES (app.seq_users.NEXTVAL, 'bob', 'b@x.com');     -- 第二条数据:id=2
影响行数 1

已用时间: 0.949(毫秒). 执行号:1515.
SQL> SELECT app.seq_users.CURRVAL AS last_id FROM dual;

行号       LAST_ID
---------- --------------------
1          2

已用时间: 1.909(毫秒). 执行号:1516.
SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com A
           2026-05-07 21:03:58.025218

2          2                    bob      b@x.com A
           2026-05-07 21:03:58.586549


已用时间: 2.159(毫秒). 执行号:1517.
SQL>

3. 达梦数据库提交(COMMIT;)与自动提交(SET AUTOCOMMIT ON;)

登录达梦数据库

su - dmdba
disql SYSDBA/Sysdba123

su - dmdba
disql app/Passw0rd!

提交与自动提交

COMMIT;
SET AUTOCOMMIT ON;
CREATE TABLE app.users2 (
  id        BIGINT PRIMARY KEY,
  username  VARCHAR2(50) NOT NULL,
  email     VARCHAR2(200) UNIQUE,
  status    CHAR(1) DEFAULT 'A' CHECK (status IN ('A','D')),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO app.users2(id, username, email)
VALUES (1, 'alice', 'a@x.com');
INSERT INTO app.users2(id, username, email)
VALUES (2, 'bob', 'b@x.com');
INSERT INTO app.users2(id, username, email, status)VALUES (3, 'tom', 'c@x.com', 'D');

SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';

select * from app.users2;

关闭自动提交与删除表

SET AUTOCOMMIT OFF;
drop table app.users2;

4. 子句查询

MySQL五子句:WHERE → GROUP BY → HAVING → ORDER BY → LIMIT

DM8 SQL 查询执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

登录达梦数据库

su - dmdba
disql SYSDBA/Sysdba123

或者

su - dmdba
disql app/Passw0rd!

查询表

SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';

新增一些数据

INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'coco', 'c@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'davi', 'd@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'eric', 'e@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'frank', 'f@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'gbon', 'g@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'haha', 'h@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'ivy', 'i@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'jack', 'j@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'kobe', 'k@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'lebulang', 'l@x.com');

select * from app.users;
INSERT INTO app.users(id, username, email, status)VALUES (13, 'tom', 'tom@x.com', 'D');
INSERT INTO app.users(id, username, email, status)VALUES (14, 'harry', 'harry@x.com', 'D');
INSERT INTO app.users(id, username, email, status)VALUES (15, 'lili', 'lili@x.com', 'D');
INSERT INTO app.users(id, username, email, status)VALUES (16, 'jerry', 'jerry@x.com', 'D');
INSERT INTO app.users(id, username, email, status)VALUES (17, 'jackma', 'jackma@x.com', 'D');

select * from app.users;
-- 1. 查询所有用户,按ID升序
SELECT 
        id, username, email       -- 查询ID、用户名、邮箱
FROM app.users                     -- 从用户表查询
ORDER BY id ASC;                   -- 按ID从小到大排序

-- 2. 查询状态为'A'的用户
SELECT 
        id, username, status      -- 查询ID、用户名、状态
FROM app.users                     -- 从用户表查询
WHERE status = 'A';                -- 过滤状态为A的数据

-- 3. 查询用户名包含 'a' 的用户
SELECT 
        id, username              -- 查询ID、用户名
FROM app.users                     -- 从用户表查询
WHERE username LIKE '%a%';         -- 用户名任意位置包含a

-- 4. 按状态分组,统计每个状态的用户数量
SELECT 
        status, COUNT(*) AS cnt   -- 状态、统计数量
FROM app.users                     -- 从用户表查询
GROUP BY status;                   -- 按状态分组

-- 5. 只显示用户数 >= 2 的状态分组(关键看状态数量和用户数量)
SELECT 
        status, COUNT(*) AS cnt   -- 状态、统计数量
FROM app.users                     -- 从用户表查询
GROUP BY status                    -- 按状态分组
HAVING COUNT(*) >= 2;              -- 只显示数量>=2的分组

-- 6. 按创建时间正序(最早创建在前)
SELECT 
        id, username, created_at  -- 查询ID、用户名、创建时间
FROM app.users                     -- 从用户表查询
ORDER BY created_at ASC;           -- 按创建时间升序

-- 7. 按用户名长度倒序排序
SELECT 
        id, username, LENGTH(username) AS name_len  -- ID、用户名、名称长度
FROM app.users                     -- 从用户表查询
ORDER BY name_len DESC;            -- 按名称长度从长到短排序

-- 8. 查询2025年之后注册的用户(你的数据是2026年,会全部显示)
SELECT 
        id, username, created_at  -- 查询ID、用户名、创建时间
FROM app.users                     -- 从用户表查询
WHERE created_at >= '2025-01-01';  -- 2025年及以后

-- 9. 按年份分组统计注册人数
SELECT 
        EXTRACT(YEAR FROM created_at) AS reg_year,  -- 提取年份
        COUNT(*) AS cnt                              -- 统计人数
FROM app.users                     -- 从用户表查询
GROUP BY EXTRACT(YEAR FROM created_at);  -- 按年份分组

-- 10. 只显示注册人数 > 3 的年份
SELECT 
        EXTRACT(YEAR FROM created_at) AS reg_year,  -- 提取年份
        COUNT(*) AS cnt                              -- 统计人数
FROM app.users                     -- 从用户表查询
GROUP BY EXTRACT(YEAR FROM created_at)  -- 按年份分组
HAVING COUNT(*) > 3;               -- 只保留人数>3的年份

-- 11. 状态='A',按用户名排序
SELECT 
        id, username, status      -- 查询ID、用户名、状态
FROM app.users                     -- 从用户表查询
WHERE status = 'A'                 -- 状态为A
ORDER BY username ASC;             -- 按用户名升序

-- 12. 分页:取前3条最新用户
SELECT 
        id, username, created_at  -- 查询ID、用户名、创建时间
FROM app.users                     -- 从用户表查询
ORDER BY created_at DESC           -- 最新创建在前
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;  -- 取前3条

-- 13. 分页:跳过3条,取4条
SELECT 
        id, username, created_at  -- 查询ID、用户名、创建时间
FROM app.users                     -- 从用户表查询
ORDER BY id ASC                    -- 按ID升序
OFFSET 3 ROWS FETCH NEXT 4 ROWS ONLY;  -- 跳过3条,取4条

-- 14. 先过滤状态='A',再分组,再过滤数量>1,最后排序
SELECT 
        status, COUNT(*) AS cnt   -- 状态、统计数量
FROM app.users                     -- 从用户表查询
WHERE status = 'A'                 -- 状态为A
GROUP BY status                    -- 按状态分组
HAVING COUNT(*) > 1                -- 数量>1
ORDER BY cnt DESC;                 -- 按数量降序

-- 15. 完整子句:过滤+分组+分组过滤+排序+分页
SELECT 
        status, COUNT(*) AS cnt   -- 状态、统计数量
FROM app.users                     -- 从用户表查询
WHERE created_at >= '2026-01-01'   -- 2026年以后
GROUP BY status                    -- 按状态分组
HAVING COUNT(*) >= 2               -- 数量>=2
ORDER BY cnt DESC                  -- 按数量降序
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;  -- 取前5条
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.898(ms)
disql V8
SQL> SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';

行号       TABLE_NAME
---------- ----------
1          USERS

已用时间: 10.845(毫秒). 执行号:1801.
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'coco', 'c@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'davi', 'd@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'eric', 'e@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'frank', 'f@x.com');
影响行数 1

INSER已用时间: 2.815(毫秒). 执行号:1802.T IN
TO app.usersSQL> (id, username, email) VALUES (app.seq_users.NEXTVAL, 'gbon', 'g@x.com');
影响行数 1

已用时间: 0.520(毫秒). 执行号:1803.
SQL> 影响行数 1

已用时间: 0.507(毫秒). 执行号:1804.
SQL> 影响行数 1

已用时间: 0.371(毫秒). 执行号:1805.
SQL> 影响行数 1

已用时间: 0.564(毫秒). 执行号:1806.
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'haha', 'h@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'ivy', 'i@x.com');
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'jack', 'j@x.com');
影响行数 1

已用时间: 0.668(毫秒). 执行号:1807.
SQL> 影响行数 1

已用时间: 0.520(毫秒). 执行号:1808.
SQL> 影响行数 1

已用时间: 0.440(毫秒). 执行号:1809.
INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'kobe', 'k@x.com');
影响行数 1

已用时间: 0.798(毫秒). 执行号:1810.
SQL> INSERT INTO app.users(id, username, email) VALUES (app.seq_users.NEXTVAL, 'lebulang', 'l@x.com');
影响行数 1

已用时间: 0.620(毫秒). 执行号:1811.

SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com A
           2026-05-07 21:03:58.025218

2          2                    bob      b@x.com A
           2026-05-07 21:03:58.586549

3          3                    coco     c@x.com A
           2026-05-07 21:10:12.996504


行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
4          4                    davi     d@x.com A
           2026-05-07 21:10:12.997223

5          5                    eric     e@x.com A
           2026-05-07 21:10:12.997795

6          6                    frank    f@x.com A
           2026-05-07 21:10:12.998240


行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
7          7                    gbon     g@x.com A
           2026-05-07 21:10:12.998863

8          8                    haha     h@x.com A
           2026-05-07 21:10:13.008447

9          9                    ivy      i@x.com A
           2026-05-07 21:10:13.008996


行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
10         10                   jack     j@x.com A
           2026-05-07 21:10:13.009593

11         11                   kobe     k@x.com A
           2026-05-07 21:10:13.014205


行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
12         12                   lebulang l@x.com A
           2026-05-07 21:10:13.917839


12 rows got

已用时间: 0.357(毫秒). 执行号:1812.
INSERT INTO app.users(id, username, email, status)VALUES (13, 'tom', 'tom@x.com', 'D');
INSERT INTO app.users(id, username, email, status)VALUES (14, 'harry', 'harry@x.com', 'D');
INSERT INTO app.users(id, username, email, status)VALUES (15, 'lili', 'lili@x.com', 'D');
INSERT INTO app.users(id, username, email, status)VALUES (16, 'jerry', 'jerry@x.com', 'D');
影响行数 1

已用时间: 1.933(毫秒). 执行号:1813.
SQL> 影响行数 1

已用时间: 0.482(毫秒). 执行号:1814.
SQL> 影响行数 1

已用时间: 0.407(毫秒). 执行号:1815.
SQL> 影响行数 1

已用时间: 0.404(毫秒). 执行号:1816.
SQL> INSERT INTO app.users(id, username, email, status)VALUES (17, 'jackma', 'jackma@x.com', 'D');
影响行数 1

已用时间: 0.625(毫秒). 执行号:1817.
SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com A
           2026-05-07 21:03:58.025218

2          2                    bob      b@x.com A
           2026-05-07 21:03:58.586549

3          3                    coco     c@x.com A
           2026-05-07 21:10:12.996504


行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
4          4                    davi     d@x.com A
           2026-05-07 21:10:12.997223

5          5                    eric     e@x.com A
           2026-05-07 21:10:12.997795

6          6                    frank    f@x.com A
           2026-05-07 21:10:12.998240


行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
7          7                    gbon     g@x.com A
           2026-05-07 21:10:12.998863

8          8                    haha     h@x.com A
           2026-05-07 21:10:13.008447

9          9                    ivy      i@x.com A
           2026-05-07 21:10:13.008996


行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
10         10                   jack     j@x.com A
           2026-05-07 21:10:13.009593

11         11                   kobe     k@x.com A
           2026-05-07 21:10:13.014205


行号       ID                   USERNAME EMAIL        STATUS
---------- -------------------- -------- ------------ ------
           CREATED_AT
           --------------------------
12         12                   lebulang l@x.com      A
           2026-05-07 21:10:13.917839

13         13                   tom      tom@x.com    D
           2026-05-07 21:10:25.965698

14         14                   harry    harry@x.com  D
           2026-05-07 21:10:25.966235


行号       ID                   USERNAME EMAIL        STATUS
---------- -------------------- -------- ------------ ------
           CREATED_AT
           --------------------------
15         15                   lili     lili@x.com   D
           2026-05-07 21:10:25.966743

16         16                   jerry    jerry@x.com  D
           2026-05-07 21:10:25.967257

17         17                   jackma   jackma@x.com D
           2026-05-07 21:10:26.493662


17 rows got

已用时间: 0.626(毫秒). 执行号:1818.
SELECT
        id, username, email       -- 查询ID、用户名、邮箱
FROM app.users                     -- 从用户表查询
2   3   4   ORDER BY id ASC;

行号       ID                   USERNAME EMAIL
---------- -------------------- -------- -------
1          1                    alice    a@x.com
2          2                    bob      b@x.com
3          3                    coco     c@x.com
4          4                    davi     d@x.com
5          5                    eric     e@x.com
6          6                    frank    f@x.com
7          7                    gbon     g@x.com
8          8                    haha     h@x.com
9          9                    ivy      i@x.com
10         10                   jack     j@x.com
11         11                   kobe     k@x.com

行号       ID                   USERNAME EMAIL
---------- -------------------- -------- ------------
12         12                   lebulang l@x.com
13         13                   tom      tom@x.com
14         14                   harry    harry@x.com
15         15                   lili     lili@x.com
16         16                   jerry    jerry@x.com
17         17                   jackma   jackma@x.com

17 rows got

已用时间: 2.163(毫秒). 执行号:1819.
SELECT
        id, username, status      -- 查询ID、用户名、状态
FROM app.users                     -- 从用户表查询
2   3   4   WHERE status = 'A';                -- 过滤状态为A的数据

行号       ID                   USERNAME STATUS
---------- -------------------- -------- ------
1          1                    alice    A
2          2                    bob      A
3          3                    coco     A
4          4                    davi     A
5          5                    eric     A
6          6                    frank    A
7          7                    gbon     A
8          8                    haha     A
9          9                    ivy      A
10         10                   jack     A
11         11                   kobe     A

行号       ID                   USERNAME STATUS
---------- -------------------- -------- ------
12         12                   lebulang A

12 rows got

已用时间: 2.374(毫秒). 执行号:1820.
SELECT
        id, username              -- 查询ID、用户名
FROM app.users                     -- 从用户表查询
2   3   4   WHERE username LIKE '%a%';         -- 用户名任意位置包含a

行号       ID                   USERNAME
---------- -------------------- --------
1          1                    alice
2          4                    davi
3          6                    frank
4          8                    haha
5          10                   jack
6          12                   lebulang
7          14                   harry
8          17                   jackma

8 rows got

已用时间: 2.161(毫秒). 执行号:1821.
SELECT
        status, COUNT(*) AS cnt   -- 状态、统计数量
FROM app.users                     -- 从用户表查询
2   3   4   GROUP BY status;                   -- 按状态分组

行号       STATUS CNT
---------- ------ --------------------
1          A      12
2          D      5

已用时间: 2.965(毫秒). 执行号:1822.
SELECT
        status, COUNT(*) AS cnt   -- 状态、统计数量
FROM app.users                     -- 从用户表查询
GROUP BY status                    -- 按状态分组
2   3   4   5   HAVING COUNT(*) >= 2;              -- 只显示数量>=2的分组

行号       STATUS CNT
---------- ------ --------------------
1          A      12
2          D      5

已用时间: 2.392(毫秒). 执行号:1823.
SELECT
        id, username, created_at  -- 查询ID、用户名、创建时间
FROM app.users                     -- 从用户表查询
2   3   4   ORDER BY created_at ASC;           -- 按创建时间升序

行号       ID                   USERNAME CREATED_AT
---------- -------------------- -------- --------------------------
1          1                    alice    2026-05-07 21:03:58.025218
2          2                    bob      2026-05-07 21:03:58.586549
3          3                    coco     2026-05-07 21:10:12.996504
4          4                    davi     2026-05-07 21:10:12.997223
5          5                    eric     2026-05-07 21:10:12.997795
6          6                    frank    2026-05-07 21:10:12.998240
7          7                    gbon     2026-05-07 21:10:12.998863
8          8                    haha     2026-05-07 21:10:13.008447
9          9                    ivy      2026-05-07 21:10:13.008996
10         10                   jack     2026-05-07 21:10:13.009593
11         11                   kobe     2026-05-07 21:10:13.014205

行号       ID                   USERNAME CREATED_AT
---------- -------------------- -------- --------------------------
12         12                   lebulang 2026-05-07 21:10:13.917839
13         13                   tom      2026-05-07 21:10:25.965698
14         14                   harry    2026-05-07 21:10:25.966235
15         15                   lili     2026-05-07 21:10:25.966743
16         16                   jerry    2026-05-07 21:10:25.967257
17         17                   jackma   2026-05-07 21:10:26.493662

17 rows got

已用时间: 2.272(毫秒). 执行号:1824.
SELECT
        id, username, LENGTH(username) AS name_len  -- ID、用户名、名称长度
FROM app.users                     -- 从用户表查询
2   3   4   ORDER BY name_len DESC;            -- 按名称长度从长到短排序

行号       ID                   USERNAME NAME_LEN
---------- -------------------- -------- -----------
1          12                   lebulang 8
2          17                   jackma   6
3          16                   jerry    5
4          6                    frank    5
5          1                    alice    5
6          14                   harry    5
7          7                    gbon     4
8          3                    coco     4
9          11                   kobe     4
10         10                   jack     4
11         5                    eric     4

行号       ID                   USERNAME NAME_LEN
---------- -------------------- -------- -----------
12         4                    davi     4
13         8                    haha     4
14         15                   lili     4
15         13                   tom      3
16         9                    ivy      3
17         2                    bob      3

17 rows got

已用时间: 3.068(毫秒). 执行号:1825.
SELECT
        id, username, created_at  -- 查询ID、用户名、创建时间
FROM app.users                     -- 从用户表查询
2   3   4   WHERE created_at >= '2025-01-01';  -- 2025年及以后

行号       ID                   USERNAME CREATED_AT
---------- -------------------- -------- --------------------------
1          1                    alice    2026-05-07 21:03:58.025218
2          2                    bob      2026-05-07 21:03:58.586549
3          3                    coco     2026-05-07 21:10:12.996504
4          4                    davi     2026-05-07 21:10:12.997223
5          5                    eric     2026-05-07 21:10:12.997795
6          6                    frank    2026-05-07 21:10:12.998240
7          7                    gbon     2026-05-07 21:10:12.998863
8          8                    haha     2026-05-07 21:10:13.008447
9          9                    ivy      2026-05-07 21:10:13.008996
10         10                   jack     2026-05-07 21:10:13.009593
11         11                   kobe     2026-05-07 21:10:13.014205

行号       ID                   USERNAME CREATED_AT
---------- -------------------- -------- --------------------------
12         12                   lebulang 2026-05-07 21:10:13.917839
13         13                   tom      2026-05-07 21:10:25.965698
14         14                   harry    2026-05-07 21:10:25.966235
15         15                   lili     2026-05-07 21:10:25.966743
16         16                   jerry    2026-05-07 21:10:25.967257
17         17                   jackma   2026-05-07 21:10:26.493662

17 rows got

已用时间: 1.983(毫秒). 执行号:1826.
SELECT
        EXTRACT(YEAR FROM created_at) AS reg_year,  -- 提取年份
        COUNT(*) AS cnt                              -- 统计人数
FROM app.users                     -- 从用户表查询
2   3   4   5   GROUP BY EXTRACT(YEAR FROM created_at);  -- 按年份分组

行号       REG_YEAR    CNT
---------- ----------- --------------------
1          2026        17

已用时间: 2.876(毫秒). 执行号:1827.
SELECT
        EXTRACT(YEAR FROM created_at) AS reg_year,  -- 提取年份
        COUNT(*) AS cnt                              -- 统计人数
FROM app.users                     -- 从用户表查询
GROUP BY EXTRACT(YEAR FROM created_at)  -- 按年份分组
HAVING COUNT(*) > 3;               -- 只保留人数>3的年份
2   3   4   5   6
行号       REG_YEAR    CNT
---------- ----------- --------------------
1          2026        17

已用时间: 2.651(毫秒). 执行号:1828.
SQL>
SELECT
        id, username, status      -- 查询ID、用户名、状态
FROM app.users                     -- 从用户表查询
WHERE status = 'A'                 -- 状态为A
2   3   4   5   ORDER BY username ASC;             -- 按用户名升序

行号       ID                   USERNAME STATUS
---------- -------------------- -------- ------
1          1                    alice    A
2          2                    bob      A
3          3                    coco     A
4          4                    davi     A
5          5                    eric     A
6          6                    frank    A
7          7                    gbon     A
8          8                    haha     A
9          9                    ivy      A
10         10                   jack     A
11         11                   kobe     A

行号       ID                   USERNAME STATUS
---------- -------------------- -------- ------
12         12                   lebulang A

12 rows got

已用时间: 2.062(毫秒). 执行号:1829.
SELECT
        id, username, created_at  -- 查询ID、用户名、创建时间
FROM app.users                     -- 从用户表查询
ORDER BY created_at DESC           -- 最新创建在前
2   3   4   5   OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;  -- 取前3条

行号       ID                   USERNAME CREATED_AT
---------- -------------------- -------- --------------------------
1          17                   jackma   2026-05-07 21:10:26.493662
2          16                   jerry    2026-05-07 21:10:25.967257
3          15                   lili     2026-05-07 21:10:25.966743

已用时间: 2.031(毫秒). 执行号:1830.
SELECT
        id, username, created_at  -- 查询ID、用户名、创建时间
FROM app.users                     -- 从用户表查询
ORDER BY id ASC                    -- 按ID升序
OFFSET 3 ROWS FETCH NEXT 4 ROWS ONLY;  -- 跳过3条,取4条
2   3   4   5
行号       ID                   USERNAME CREATED_AT
---------- -------------------- -------- --------------------------
1          4                    davi     2026-05-07 21:10:12.997223
2          5                    eric     2026-05-07 21:10:12.997795
3          6                    frank    2026-05-07 21:10:12.998240
4          7                    gbon     2026-05-07 21:10:12.998863

已用时间: 3.043(毫秒). 执行号:1831.
SELECT
        status, COUNT(*) AS cnt   -- 状态、统计数量
FROM app.users                     -- 从用户表查询
WHERE status = 'A'                 -- 状态为A
GROUP BY status                    -- 按状态分组
HAVING COUNT(*) > 1                -- 数量>1
2   3   4   5   6   7   ORDER BY cnt DESC;                 -- 按数量降序

行号       STATUS CNT
---------- ------ --------------------
1          A      12

已用时间: 2.891(毫秒). 执行号:1832.
SELECT
        status, COUNT(*) AS cnt   -- 状态、统计数量
FROM app.users                     -- 从用户表查询
WHERE created_at >= '2026-01-01'   -- 2026年以后
GROUP BY status                    -- 按状态分组
HAVING COUNT(*) >= 2               -- 数量>=2
ORDER BY cnt DESC                  -- 按数量降序
2   3   4   5   6   7   8   OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;  -- 取前5条

行号       STATUS CNT
---------- ------ --------------------
1          A      12
2          D      5

已用时间: 2.643(毫秒). 执行号:1833.
SQL>

5. 多表查询

为了演示不同连接类型(INNER JOIN、LEFT JOIN、RIGHT JOIN)的实际区别,需要让数据中出现“无订单的用户”和“无用户的订单”。下面提供完整的建表、插入数据及查询示例,所有语句均可在支持标准SQL的数据库(如达梦DM、Oracle、PostgreSQL、MySQL等)中运行。


-- 用 SYSDBA 用户登录达梦数据库
su - dmdba
disql SYSDBA/Sysdba123

或者

rlwrap disql SYSDBA/Sysdba123

5.1. 重建表(去除外键约束,允许插入孤立订单)

-- 用户表
DROP TABLE app.users;
CREATE TABLE app.users (
  id          BIGINT PRIMARY KEY,
  username    VARCHAR(50) NOT NULL,
  email       VARCHAR(100),
  status      CHAR(1) DEFAULT 'A' CHECK (status IN ('A', 'I')),
  created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 订单表(无外键约束,可插入不存在的 user_id)
CREATE TABLE app.orders (
  id          BIGINT PRIMARY KEY,
  user_id     BIGINT NOT NULL,               -- 允许插入任何数字,不强制关联 users
  amount      DECIMAL(12,2) NOT NULL,
  status      CHAR(1) DEFAULT 'N' CHECK (status IN ('N','P','C')),
  created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 查看APP中的表
SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='APP';
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.030(ms)
disql V8
SQL> DROP TABLE app.users;
操作已执行
已用时间: 26.197(毫秒). 执行号:2001.
CREATE TABLE app.users (
    id          BIGINT PRIMARY KEY,
    username    VARCHAR(50) NOT NULL,
    email       VARCHAR(100),
    status      CHAR(1) DEFAULT 'A' CHECK (status IN ('A', 'I')),
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
2   3   4   5   6   7   );
操作已执行
已用时间: 22.852(毫秒). 执行号:2002.
CREATE TABLE app.orders (
    id          BIGINT PRIMARY KEY,
    user_id     BIGINT NOT NULL,               -- 允许插入任何数字,不强制关联 users
    amount      DECIMAL(12,2) NOT NULL,
    status      CHAR(1) DEFAULT 'N' CHECK (status IN ('N','P','C')),
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
2   3   4   5   6   7   );
操作已执行
已用时间: 28.297(毫秒). 执行号:2003.
SQL> SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='APP';

行号       TABLE_NAME
---------- ----------
1          USERS
2          ORDERS

已用时间: 6.846(毫秒). 执行号:2004.
SQL>

5.2. 插入有区分度的数据

-- 插入用户:alice, bob, jack(jack 无订单)
INSERT INTO app.users (id, username, email, status) VALUES
(1, 'alice', 'a@x.com', 'A'),
(2, 'bob',   'b@x.com', 'A'),
(3, 'jack', 'c@x.com', 'A');   -- 无订单的用户

select * from app.users;

-- 插入订单:alice 两个订单(含金额>100),bob 一个订单,外加一个孤儿订单(user_id=999)
INSERT INTO app.orders (id, user_id, amount, status) VALUES
(1001, 1, 99.90, 'P'),
(1002, 1, 199.50, 'N'),
(1003, 2, 49.99, 'C'),
(1004, 999, 123.45, 'P');   -- 无用户的订单,孤儿订单,对应用户不存在

select * from app.orders;
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.030(ms)
disql V8
SQL> DROP TABLE app.users;
操作已执行
已用时间: 26.197(毫秒). 执行号:2001.
CREATE TABLE app.users (
    id          BIGINT PRIMARY KEY,
    username    VARCHAR(50) NOT NULL,
    email       VARCHAR(100),
    status      CHAR(1) DEFAULT 'A' CHECK (status IN ('A', 'I')),
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
2   3   4   5   6   7   );
操作已执行
已用时间: 22.852(毫秒). 执行号:2002.
CREATE TABLE app.orders (
    id          BIGINT PRIMARY KEY,
    user_id     BIGINT NOT NULL,               -- 允许插入任何数字,不强制关联 users
    amount      DECIMAL(12,2) NOT NULL,
    status      CHAR(1) DEFAULT 'N' CHECK (status IN ('N','P','C')),
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
2   3   4   5   6   7   );
操作已执行
已用时间: 28.297(毫秒). 执行号:2003.
SQL> SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='APP';

行号       TABLE_NAME
---------- ----------
1          USERS
2          ORDERS

已用时间: 6.846(毫秒). 执行号:2004.
INSERT INTO app.users (id, username, email, status) VALUES
(1, 'alice', 'a@x.com', 'A'),
(2, 'bob',   'b@x.com', 'A'),
2   3   4   (3, 'jack', 'c@x.com', 'A');
影响行数 3

已用时间: 3.015(毫秒). 执行号:2005.
INSERT INTO app.orders (id, user_id, amount, status) VALUES
(1001, 1, 99.90, 'P'),
(1002, 1, 199.50, 'N'),
(1003, 2, 49.99, 'C'),
2   3   4   5   (1004, 999, 123.45, 'P');
影响行数 4

已用时间: 2.476(毫秒). 执行号:2006.
SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com A
           2026-05-07 21:24:11.822926

2          2                    bob      b@x.com A
           2026-05-07 21:24:11.822933

3          3                    jack     c@x.com A
           2026-05-07 21:24:11.822933


已用时间: 2.369(毫秒). 执行号:2007.
SQL> select * from app.orders;

行号       ID                   USER_ID              AMOUNT STATUS
---------- -------------------- -------------------- ------ ------
           CREATED_AT
           --------------------------
1          1001                 1                    99.9   P
           2026-05-07 21:25:42.342694

2          1002                 1                    199.5  N
           2026-05-07 21:25:42.342705

3          1003                 2                    49.99  C
           2026-05-07 21:25:42.342705


行号       ID                   USER_ID              AMOUNT STATUS
---------- -------------------- -------------------- ------ ------
           CREATED_AT
           --------------------------
4          1004                 999                  123.45 P
           2026-05-07 21:25:42.342706


已用时间: 1.785(毫秒). 执行号:2008.
SQL>

5.3. 执行四种查询并观察结果

1 内连接(INNER JOIN)

只返回两表匹配的行,即 有订单的用户 + 有用户的订单。

SELECT u.username, o.amount
FROM app.users u
INNER JOIN app.orders o ON u.id = o.user_id;
USERNAMEAMOUNT
alice99.90
alice199.50
bob49.99

解释:jack 无订单,孤儿订单无对应用户,均不出现。

2 左连接(LEFT JOIN)

保留左表(users)全部记录,右表不匹配处补 NULL。

SELECT u.username, o.amount
FROM app.users u
LEFT JOIN app.orders o ON u.id = o.user_id;
USERNAMEAMOUNT
alice99.90
alice199.50
bob49.99
jack(NULL)

解释:jack 出现在结果中,amount 为 NULL。

3 右连接(RIGHT JOIN)

保留右表(orders)全部记录,左表不匹配处补 NULL。

SELECT u.username, o.amount
FROM app.users u
RIGHT JOIN app.orders o ON u.id = o.user_id;
USERNAMEAMOUNT
alice99.90
alice199.50
bob49.99
(NULL)123.45

解释:孤儿订单(user_id=999)出现在结果中,username 为 NULL。

4 子查询

找出下单金额大于 100 的用户名(注意孤儿订单金额 123.45 也会被选出,但其 user_id 999 不在 users 表中,不影响最终结果)。

SELECT username
FROM app.users
WHERE id IN (SELECT user_id FROM app.orders WHERE amount > 100);
USERNAME
alice

解释:只有 *alice* 的订单(199.50)满足金额 > 100;bob 和 *jack* 不满足;孤儿订单虽满足,但对应 user_id 999 不在 users 表中,所以不产生用户名。

5.4. 总结

查询类型结果行数特点说明
INNER JOIN3只返回有订单的用户和有效订单
LEFT JOIN4包含无订单的用户(jack)
RIGHT JOIN4包含无用户的订单(user_id=999)
子查询1仅返回金额>100的订单对应的有效用户名

通过以上数据设计,四种查询的结果各不相同,清晰展示了每种连接/子查询的语义。可以根据实际业务需求选择合适的查询方式。

五、DCL:用户与权限

-- 用 SYSDBA 用户登录达梦数据库
su - dmdba
disql SYSDBA/Sysdba123

或者

rlwrap disql SYSDBA/Sysdba123

1. 创建用户与授权

CREATE USER report IDENTIFIED BY "Report123!";
GRANT CREATE SESSION TO report;
GRANT SELECT ON app.users TO report;
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.030(ms)
disql V8
SQL> CREATE USER report IDENTIFIED BY "Report123!";
操作已执行
已用时间: 5.832(毫秒). 执行号:2010.
SQL> GRANT CREATE SESSION TO report;
操作已执行
已用时间: 3.317(毫秒). 执行号:2011.
SQL> GRANT SELECT ON app.users TO report;
操作已执行
已用时间: 4.119(毫秒). 执行号:2012.
SQL>

2. 查看权限

SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'REPORT';
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'REPORT';
SQL> SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'REPORT';

行号       GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
---------- ------- ----- ---------- ------- --------- --------- ---------
1          REPORT  APP   USERS      SYSDBA  SELECT    NO        NO

已用时间: 9.711(毫秒). 执行号:2013.
SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'REPORT';

行号       GRANTEE PRIVILEGE      ADMIN_OPTION
---------- ------- -------------- ------------
1          REPORT  CREATE SESSION NO

已用时间: 2.847(毫秒). 执行号:2014.
SQL>

3. 回收权限

REVOKE SELECT ON app.users FROM report;
REVOKE CREATE SESSION FROM report;
SQL> REVOKE SELECT ON app.users FROM report;
操作已执行
已用时间: 3.607(毫秒). 执行号:2015.
SQL> REVOKE CREATE SESSION FROM report;
操作已执行
已用时间: 3.042(毫秒). 执行号:2016.
SQL> SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'REPORT';
未选定行

已用时间: 0.912(毫秒). 执行号:2017.
SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'REPORT';
未选定行

已用时间: 0.367(毫秒). 执行号:2018.
SQL>

六、备份与恢复

准备测试数据

disql app/'Passw0rd!'

或者

rlwrap disql app/'Passw0rd!'
-- 用户表
DROP TABLE app.users;
CREATE TABLE app.users (
  id          BIGINT PRIMARY KEY,
  username    VARCHAR(50) NOT NULL,
  email       VARCHAR(100),
  status      CHAR(1) DEFAULT 'A' CHECK (status IN ('A', 'I')),
  created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 订单表(无外键约束,可插入不存在的 user_id)
DROP TABLE app.orders;
CREATE TABLE app.orders (
  id          BIGINT PRIMARY KEY,
  user_id     BIGINT NOT NULL,               -- 允许插入任何数字,不强制关联 users
  amount      DECIMAL(12,2) NOT NULL,
  status      CHAR(1) DEFAULT 'N' CHECK (status IN ('N','P','C')),
  created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 查看APP中的表
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='APP';

-- 插入用户:alice, bob, jack(jack 无订单)
INSERT INTO app.users (id, username, email, status) VALUES
(1, 'alice', 'a@x.com', 'A'),
(2, 'bob',   'b@x.com', 'A'),
(3, 'jack', 'c@x.com', 'A');

-- 插入订单:alice 两个订单(含金额>100),bob 一个订单,外加一个孤儿订单(user_id=999)
INSERT INTO app.orders (id, user_id, amount, status) VALUES
(1001, 1, 99.90, 'P'),
(1002, 1, 199.50, 'N'),
(1003, 2, 49.99, 'C'),
(1004, 999, 123.45, 'P');   -- 孤儿订单,对应用户不存在

-- 查看测试数据
select * from app.users;
select * from app.orders;

-- 确认提交
commit;
[dmdba@centos7 ~]$ rlwrap disql app/'Passw0rd!'

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.869(ms)
disql V8
SQL> DROP TABLE app.users;
操作已执行
已用时间: 22.468(毫秒). 执行号:2201.
CREATE TABLE app.users (
    id          BIGINT PRIMARY KEY,
    username    VARCHAR(50) NOT NULL,
    email       VARCHAR(100),
    status      CHAR(1) DEFAULT 'A' CHECK (status IN ('A', 'I')),
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
2   3   4   5   6   7   );
操作已执行
已用时间: 20.204(毫秒). 执行号:2202.
SQL> DROP TABLE app.orders;
操作已执行
已用时间: 21.074(毫秒). 执行号:2203.
CREATE TABLE app.orders (
    id          BIGINT PRIMARY KEY,
    user_id     BIGINT NOT NULL,               -- 允许插入任何数字,不强制关联 users
    amount      DECIMAL(12,2) NOT NULL,
    status      CHAR(1) DEFAULT 'N' CHECK (status IN ('N','P','C')),
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2   3   4   5   6   7   操作已执行
已用时间: 15.566(毫秒). 执行号:2204.
SQL>
SQL> SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='APP';

行号       TABLE_NAME
---------- ----------
1          USERS
2          ORDERS

已用时间: 42.658(毫秒). 执行号:2205.
INSERT INTO app.users (id, username, email, status) VALUES
(1, 'alice', 'a@x.com', 'A'),
(2, 'bob',   'b@x.com', 'A'),
2   3   4   (3, 'jack', 'c@x.com', 'A');
影响行数 3

已用时间: 1.963(毫秒). 执行号:2206.
INSERT INTO app.orders (id, user_id, amount, status) VALUES
(1001, 1, 99.90, 'P'),
(1002, 1, 199.50, 'N'),
(1003, 2, 49.99, 'C'),
2   3   4   5   (1004, 999, 123.45, 'P');
影响行数 4

已用时间: 2.420(毫秒). 执行号:2207.
select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com A
           2026-05-07 21:36:40.363687

2          2                    bob      b@x.com A
           2026-05-07 21:36:40.363691

3          3                    jack     c@x.com A
           2026-05-07 21:36:40.363692


已用时间: 2.490(毫秒). 执行号:2208.
SQL> select * from app.orders;

行号       ID                   USER_ID              AMOUNT STATUS
---------- -------------------- -------------------- ------ ------
           CREATED_AT
           --------------------------
1          1001                 1                    99.9   P
           2026-05-07 21:36:46.781951

2          1002                 1                    199.5  N
           2026-05-07 21:36:46.781957

3          1003                 2                    49.99  C
           2026-05-07 21:36:46.781958


行号       ID                   USER_ID              AMOUNT STATUS
---------- -------------------- -------------------- ------ ------
           CREATED_AT
           --------------------------
4          1004                 999                  123.45 P
           2026-05-07 21:36:46.781958


已用时间: 0.625(毫秒). 执行号:2209.
SQL> commit;
操作已执行
已用时间: 3.740(毫秒). 执行号:2210.
SQL>

1. dexp 导出工具(逻辑备份)

SELECT TABLE_NAME, OWNER FROM ALL_TABLES;
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';
SQL> SELECT TABLE_NAME, OWNER FROM ALL_TABLES;

行号       TABLE_NAME                  OWNER
---------- --------------------------- ------
1          ##HISTOGRAMS_TABLE          SYSDBA
2          ##TMP_TBL_FOR_DBMS_LOB_BLOB SYS
3          ##TMP_TBL_FOR_DBMS_LOB_CLOB SYS
4          AQ$_QUEUE_TABLES            SYS
5          AQ$_QUEUES                  SYS
6          REG$                        SYS
7          ##PLAN_TABLE                SYS
8          USERS                       APP
9          ORDERS                      APP

9 rows got

已用时间: 8.790(毫秒). 执行号:2211.
SQL> SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';

行号       TABLE_NAME
---------- ----------
1          USERS
2          ORDERS

已用时间: 7.659(毫秒). 执行号:2212.
SQL>
su - root

mkdir -p /home/dmdba/backup
chown dmdba:dmdba /home/dmdba/backup
chmod 700 /home/dmdba/backup

su - dmdba

/home/dmdba/dmdbms/bin/dexp app/'Passw0rd!'@127.0.0.1:5236 \
  FILE=/home/dmdba/backup/app_$(date +%F).dmp \
  LOG=/home/dmdba/backup/app_$(date +%F).log
[dmdba@centos7 ~]$ 登出
[root@centos7 ~]# mkdir -p /home/dmdba/backup
[root@centos7 ~]# chown dmdba:dmdba /home/dmdba/backup
[root@centos7 ~]# chmod 700 /home/dmdba/backup
[root@centos7 ~]# su - dmdba
上一次登录:四 5月  7 20:51:33 CST 2026pts/0 上
[dmdba@centos7 ~]$ /home/dmdba/dmdbms/bin/dexp app/'Passw0rd!'@127.0.0.1:5236 \
>   FILE=/home/dmdba/backup/app_$(date +%F).dmp \
>   LOG=/home/dmdba/backup/app_$(date +%F).log
dexp V8

version: 03134284458-20251113-301923-20178

start dexp:
app/******@127.0.0.1:5236 FILE=/home/dmdba/backup/app_2026-05-07.dmp LOG=/home/dmdba/backup/app_2026-05-07.log


正在导出 第1 个SCHEMA :APP

开始导出模式[APP].....

导出对象类型:SEQUENCE

共导出 1 个SEQUENCE


----- [2026-05-07 21:38:56]导出表:APP.USERS -----


----- [2026-05-07 21:38:56]导出表:APP.ORDERS -----

[表: ORDERS]导出约束:CONS134218809

[表: USERS]导出约束:CONS134218807

表APP.USERS导出结束,共导出 3 行数据, 大小 0.114 KB

表APP.ORDERS导出结束,共导出 4 行数据, 大小 0.146 KB

共导出 2 个TABLE

模式[APP]导出结束.....

成功导出 第1 个SCHEMA :APP

开始导出统计信息.....

共导出 1 个SCHEMA


整个导出过程共花费    0.377 s


成功终止导出, 没有出现警告
[dmdba@centos7 ~]$

2. dimp 导入(逻辑恢复)

su - dmdba
disql app/'Passw0rd!'

或者

rlwrap disql app/'Passw0rd!'

[dmdba@centos7 ~]$ rlwrap disql app/'Passw0rd!'

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.279(ms)
disql V8
SQL> SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';

行号       TABLE_NAME
---------- ----------
1          USERS
2          ORDERS

已用时间: 7.838(毫秒). 执行号:3601.
SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com A
           2026-05-07 21:36:40.363687

2          2                    bob      b@x.com A
           2026-05-07 21:36:40.363691

3          3                    jack     c@x.com A
           2026-05-07 21:36:40.363692


已用时间: 0.263(毫秒). 执行号:3602.
SQL> select * from app.orders;

行号       ID                   USER_ID              AMOUNT STATUS
---------- -------------------- -------------------- ------ ------
           CREATED_AT
           --------------------------
1          1001                 1                    99.9   P
           2026-05-07 21:36:46.781951

2          1002                 1                    199.5  N
           2026-05-07 21:36:46.781957

3          1003                 2                    49.99  C
           2026-05-07 21:36:46.781958


行号       ID                   USER_ID              AMOUNT STATUS
---------- -------------------- -------------------- ------ ------
           CREATED_AT
           --------------------------
4          1004                 999                  123.45 P
           2026-05-07 21:36:46.781958


已用时间: 0.328(毫秒). 执行号:3603.
SQL> drop table USERS;
操作已执行
已用时间: 20.085(毫秒). 执行号:3604.
SQL> drop table ORDERS;
操作已执行
已用时间: 19.790(毫秒). 执行号:3605.
SQL> select * from app.users;
select * from app.users;
第1 行附近出现错误[-2106]:无效的表或视图名[USERS].
已用时间: 1.579(毫秒). 执行号:0.
SQL> select * from app.orders;
select * from app.orders;
第1 行附近出现错误[-2106]:无效的表或视图名[ORDERS].
已用时间: 1.405(毫秒). 执行号:0.
SQL>
/home/dmdba/dmdbms/bin/dimp app/'Passw0rd!'@127.0.0.1:5236   FILE=/home/dmdba/backup/app_2026-05-07.dmp   LOG=/home/dmdba/backup/app_2026-05-07.log FULL=Y

或者

/home/dmdba/dmdbms/bin/dimp SYSDBA/Sysdba123@127.0.0.1:5236   FILE=/home/dmdba/backup/app_2026-05-07.dmp   LOG=/home/dmdba/backup/app_2026-05-07.log FULL=Y
[dmdba@centos7 ~]$ /home/dmdba/dmdbms/bin/dimp app/'Passw0rd!'@127.0.0.1:5236   FILE=/home/dmdba/backup/app_2026-05-07.dmp   LOG=/home/dmdba/backup/app_2026-05-07.log FULL=Y
dimp V8

[警告]文件"/home/dmdba/backup/app_2026-05-07.log"已经存在
是否覆盖(y/n, 1/0):y

version: 03134284458-20251113-301923-20178

start dimp:
app/******@127.0.0.1:5236 FILE=/home/dmdba/backup/app_2026-05-07.dmp LOG=/home/dmdba/backup/app_2026-05-07.log FULL=Y


本地编码:PG_UTF8, 导入文件编码:PG_UTF8

[0/8]开始导入模式[APP]......

[1/8]导入模式中的 NECESSARY GLOBAL 对象……

[1/8]导入 SEQUENCE 对象 : APP.SEQ_USERS

 CREATE SCHEMA "APP" AUTHORIZATION  "APP" CREATE SEQUENCE "SEQ_USERS"
                          INCREMENT BY 1
                          START WITH 13
                          MAXVALUE 9223372036854775807
                          MINVALUE 1
                          NOCYCLE
                          NOCACHE
                          NOORDER
                          ;


[警告]Error Code:-2223,序列[SEQ_USERS]已存在

[1/8]模式中的 NECESSARY GLOBAL 对象导入完成……


----- [2026-05-07 21:42:08]导入表:APP.ORDERS -----


----- [2026-05-07 21:42:08]导入表:APP.USERS -----

[1/8][表: ORDERS]创建表 APP.ORDERS ...

[1/8][表: USERS]创建表 APP.USERS ...

[2/8][表: USERS]创建表已完成,导入表 USERS 的数据中...

[3/8][表: ORDERS]创建表已完成,导入表 ORDERS 的数据中...

表 APP.USERS 的数据导入完成,共导入数据:3 行, 大小 0.114 KB

表 APP.ORDERS 的数据导入完成,共导入数据:4 行, 大小 0.146 KB

[3/8]导入模式中的 GLOBAL 对象……

[3/8]模式中的 GLOBAL 对象导入完成……

[3/8]模式[APP]导入完成......

[4/8][表: USERS]导入成功……

[4/8][表: USERS]导入表的约束:

[4/8][表: USERS]CONS134218807

[5/8][表: USERS]导入成功……

[6/8][表: ORDERS]导入成功……

[6/8][表: ORDERS]导入表的约束:

[6/8][表: ORDERS]CONS134218809

[7/8][表: ORDERS]导入成功……

开始导入统计信息.....

[7/8]整个导入过程共花费    0.133 s


成功终止导入, 出现1个警告
[dmdba@centos7 ~]$

验证恢复的数据

[dmdba@centos7 ~]$ rlwrap disql app/'Passw0rd!'                                 
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.876(ms)
disql V8
SQL> SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'APP';

行号       TABLE_NAME
---------- ----------
1          USERS
2          ORDERS

已用时间: 8.665(毫秒). 执行号:4501.
SQL> select * from app.users;

行号       ID                   USERNAME EMAIL   STATUS
---------- -------------------- -------- ------- ------
           CREATED_AT
           --------------------------
1          1                    alice    a@x.com A
           2026-05-07 21:36:40.363687

2          2                    bob      b@x.com A
           2026-05-07 21:36:40.363691

3          3                    jack     c@x.com A
           2026-05-07 21:36:40.363692


已用时间: 2.415(毫秒). 执行号:4502.
SQL> select * from app.orders;

行号       ID                   USER_ID              AMOUNT STATUS
---------- -------------------- -------------------- ------ ------
           CREATED_AT
           --------------------------
1          1001                 1                    99.9   P
           2026-05-07 21:36:46.781951

2          1002                 1                    199.5  N
           2026-05-07 21:36:46.781957

3          1003                 2                    49.99  C
           2026-05-07 21:36:46.781958


行号       ID                   USER_ID              AMOUNT STATUS
---------- -------------------- -------------------- ------ ------
           CREATED_AT
           --------------------------
4          1004                 999                  123.45 P
           2026-05-07 21:36:46.781958


已用时间: 2.012(毫秒). 执行号:4503.
SQL>

3. 物理备份与恢复(dmrman)

以下是一套完整的达梦数据库备份恢复演示流程,包含准备测试数据、脱机全量备份、删除数据、脱机恢复、验证结果等步骤。请根据实际环境调整路径(如数据目录、备份目录、达梦安装路径)。


3.1. 准备工作

  • 达梦安装目录:/home/dmdba/dmdbms
  • 实例数据目录:/dmdata/data/DAMENG
  • 备份目录:/dmdata/full(需提前创建并授权)
  • 使用 dmdba 用户执行数据库相关操作,root 用户创建目录。

3.2. 完整操作步骤

1 以 root 创建备份目录并授权

su - root
mkdir -p /dmdata/full
chown dmdba:dmdba /dmdata/full
chmod 700 /dmdata/full
exit

2 以 dmdba 用户登录,准备测试数据

su - dmdba
disql SYSDBA/Sysdba123

或者

rlwrap disql SYSDBA/Sysdba123

在 disql 中执行:

-- 创建测试表并插入数据
CREATE TABLE test_backup (id INT, name VARCHAR(20));
INSERT INTO test_backup VALUES (1, 'Alice');
INSERT INTO test_backup VALUES (2, 'Bob');
COMMIT;

-- 验证数据
SELECT TABLE_NAME, OWNER FROM ALL_TABLES;
SELECT * FROM test_backup;

-- 退出 disql
EXIT;

3 关闭数据库(dmrman物理备份必须)

su - dmdba
disql SYSDBA/Sysdba123 <<EOF
shutdown immediate;
EOF

4 执行dmrman物理全量备份(使用 dmrman)

su - dmdba
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="backup database '/dmdata/data/DAMENG/dm.ini' full backupset '/dmdata/full'"

成功后,备份集将保存在 /dmdata/full 目录下。

5 重新启动数据库

su - dmdba
nohup /home/dmdba/dmdbms/bin/dmserver /dmdata/data/DAMENG/dm.ini &

等待几秒启动完成(可观察日志或直接进行下一步)。

6 删除测试数据(模拟误删)

-- 验证数据
su - dmdba
disql SYSDBA/Sysdba123
SELECT TABLE_NAME, OWNER FROM ALL_TABLES;
SELECT * FROM test_backup;
-- 删除数据
disql SYSDBA/Sysdba123 <<EOF
DROP TABLE test_backup;

-- 此时表已不存在,查询会报错
SELECT * FROM test_backup;
EOF

7 再次关闭数据库(恢复时需要停服)

disql SYSDBA/Sysdba123 <<EOF
shutdown immediate;
EOF

8 执行恢复

达梦脱机恢复通常分两步:restore 还原数据文件,recover 应用日志并更新数据库魔数。

在达梦数据库中,“数据库魔数”(db_magic)是一个存储在数据文件和控制文件头部的唯一标识符,类似于数据库的“身份证号”或“指纹”。

它的主要作用包括:

  • 标识数据库身份:每个数据库在创建时都会生成一个随机的魔数,用于区分不同的数据库实例。
  • 保证数据一致性:当数据库启动时,会检查所有数据文件的魔数是否与控制文件中的一致,如果不一致则拒绝启动,防止文件错乱。
  • 避免备份混淆:备份集中也记录了原数据库的魔数,恢复时如果直接使用备份文件,还原出的数据库会拥有与原库相同的魔数,可能导致冲突。
# 切换到 dmdba 用户
su - dmdba

# 还原数据文件
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="restore database '/dmdata/data/DAMENG/dm.ini' from backupset '/dmdata/full'"

# 恢复数据库(应用日志并更新DB_MAGIC)
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="recover database '/dmdata/data/DAMENG/dm.ini' update db_magic"

9 启动数据库并验证恢复效果

su - dmdba
nohup /home/dmdba/dmdbms/bin/dmserver /dmdata/data/DAMENG/dm.ini &

稍等片刻,然后登录检查数据:

su - dmdba
disql SYSDBA/Sysdba123 <<EOF
SELECT * FROM test_backup;   -- 应该能看到 Alice 和 Bob 两条记录
EOF
[dmdba@centos7 ~]$ 登出
[root@centos7 ~]# mkdir -p /dmdata/full
[root@centos7 ~]# chown dmdba:dmdba /dmdata/full
[root@centos7 ~]# chmod 700 /dmdata/full
[root@centos7 ~]# su - dmdba
上一次登录:四 5月  7 21:38:48 CST 2026pts/0 上
[dmdba@centos7 ~]$ rlwrap disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 2.810(ms)
disql V8
SQL> CREATE TABLE test_backup (id INT, name VARCHAR(20));
操作已执行
已用时间: 16.795(毫秒). 执行号:4601.
INSERT INTO test_backup VALUES (1, 'Alice');
影响行数 1

已用时间: 2.185(毫秒). 执行号:4602.
SQL> INSERT INTO test_backup VALUES (2, 'Bob');
影响行数 1

已用时间: 0.693(毫秒). 执行号:4603.
SQL> COMMIT;
操作已执行
已用时间: 2.314(毫秒). 执行号:4604.
SQL> SELECT TABLE_NAME, OWNER FROM ALL_TABLES;

行号       TABLE_NAME   OWNER
---------- ------------ -----
1          SYSOBJECTS   SYS
2          SYSINDEXES   SYS
3          SYSCOLUMNS   SYS
4          SYSUSER$     SYS
5          SYSCONS      SYS
6          SYSTEXTS     SYS
7          SYSGRANTS    SYS
8          SYSDUAL      SYS
9          SYSCLASSES   SYS
10         SYSSTATS     SYS
11         SYSTYPEINFOS SYS

行号       TABLE_NAME               OWNER
---------- ------------------------ ------
12         SYSACCHISTORIES          SYS
13         SYSPWDCHGS               SYS
14         SYSHPARTTABLEINFO        SYS
15         SYSOBJINFOS              SYS
16         SYSCONTEXTLIBS           SYS
17         SYSCONTEXTINDEXES        CTISYS
18         SYSCOLCYT                SYS
19         SYSRESOURCES             SYS
20         SYSTABLECOMMENTS         SYS
21         SYSCOLUMNCOMMENTS        SYS
22         SYS_REWRITE_EQUIVALENCES SYS

行号       TABLE_NAME      OWNER
---------- --------------- -----
23         SYSDISTABLEINFO SYS
24         SYSCOLINFOS     SYS
25         SYSDEPENDENCIES SYS
26         SYSFREQROOTS    SYS
27         SYSUSERINI$     SYS
28         SYSINJECTHINT   SYS
29         SYSDUAL2        SYS
30         SYSMSTATS       SYS
31         SYSOPENHISTORY  SYS
32         SYSSTATPREFS    SYS
33         SYSSTATTABLEIDU SYS

行号       TABLE_NAME         OWNER
---------- ------------------ -----
34         SYSFCOLDEFAULT     SYS
35         PROXY_INFO$        SYS
36         SYSPROFILES        SYS
37         SYSUSERPROFILES    SYS
38         SYSTUNINGTASK      SYS
39         SYSTUNINGEXECUTION SYS
40         SYSTUNINGREPORT    SYS
41         SYSMODIFICATIONS   SYS
42         SYSPKGPROCINFOS    SYS
43         SYSPKGPROCPARAMS   SYS
44         DPC_TABLESPACE     SYS

行号       TABLE_NAME     OWNER
---------- -------------- -----
45         SYSTSGROUPS    SYS
46         SYSREDEFSTATUS SYS
47         SYSREDEFOBJECT SYS
48         SYSREDEFDERROR SYS
49         SYSPLNINFO     SYS
50         SYSPLNOBJID    SYS
51         SYSCOLBYUSER   SYS
52         SYSOPARGS      SYS
53         RECYCLEBIN$    SYS
54         SYSERRORPAGES  SYS
55         SYSCRASHTRXS   SYS

行号       TABLE_NAME                  OWNER
---------- --------------------------- -----
56         SYSPLANHIST                 SYS
57         SYSTEMPLATEHUGEAUX          SYS
58         SYSTEMPLATEHUGEDAUX         SYS
59         SYSTEMPLATEHUGEUAUX         SYS
60         SYSFECKS                    SYS
61         SYSFECOLS                   SYS
62         SYSSQLPROFILE               SYS
63         SYSOIDS                     SYS
64         SYSTYPEATTRINFO             SYS
65         COL_USAGE$                  SYS
66         DBMS_PARALLEL_EXECUTE_TASK$ SYS

行号       TABLE_NAME                    OWNER
---------- ----------------------------- ------
67         DBMS_PARALLEL_EXECUTE_CHUNKS$ SYS
68         ##HISTOGRAMS_TABLE            SYSDBA
69         ##TMP_TBL_FOR_DBMS_LOB_BLOB   SYS
70         ##TMP_TBL_FOR_DBMS_LOB_CLOB   SYS
71         DBMS_LOCK_ALLOCATED           SYS
72         DBMS_ALERT_INFO               SYS
73         AQ$_QUEUE_TABLES              SYS
74         AQ$_QUEUES                    SYS
75         REG$                          SYS
76         ##PLAN_TABLE                  SYS
77         USERS                         APP

行号       TABLE_NAME  OWNER
---------- ----------- ------
78         ORDERS      APP
79         TEST_BACKUP SYSDBA

79 rows got

已用时间: 42.987(毫秒). 执行号:4605.
SQL> SELECT * FROM test_backup;

行号       ID          NAME
---------- ----------- -----
1          1           Alice
2          2           Bob

已用时间: 1.973(毫秒). 执行号:4606.
SQL>
[dmdba@centos7 ~]$ disql SYSDBA/Sysdba123 <<EOF
> shutdown immediate;
> EOF

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.396(ms)
disql V8
SQL> 操作已执行
已用时间: 1.875(毫秒). 执行号:0.
SQL>
[dmdba@centos7 ~]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="backup database '/dmdata/data/DAMENG/dm.ini' full backupset '/dmdata/full'"
dmrman V8
backup database '/dmdata/data/DAMENG/dm.ini' full backupset '/dmdata/full'
file dm.key not found, use default license!
Processing backupset /dmdata/full
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                [Percent:100.00%][Speed:0.00M/s][Cost:00:00:04][Remaining:00:00:00]
backup successfully!
time used: 00:00:04.773
[dmdba@centos7 ~]$ ls /dmdata/full/
full.bak  full.meta
[dmdba@centos7 ~]$ nohup /home/dmdba/dmdbms/bin/dmserver /dmdata/data/DAMENG/dm.ini &
[1] 59660
[dmdba@centos7 ~]$ nohup: 忽略输入并把输出追加到"nohup.out"

[dmdba@centos7 ~]$ disql SYSDBA/Sysdba123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.903(ms)
disql V8
SQL> SELECT TABLE_NAME, OWNER FROM ALL_TABLES;

行号       TABLE_NAME   OWNER
---------- ------------ -----
1          SYSOBJECTS   SYS
2          SYSINDEXES   SYS
3          SYSCOLUMNS   SYS
4          SYSUSER$     SYS
5          SYSCONS      SYS
6          SYSTEXTS     SYS
7          SYSGRANTS    SYS
8          SYSDUAL      SYS
9          SYSCLASSES   SYS
10         SYSSTATS     SYS
11         SYSTYPEINFOS SYS

行号       TABLE_NAME               OWNER
---------- ------------------------ ------
12         SYSACCHISTORIES          SYS
13         SYSPWDCHGS               SYS
14         SYSHPARTTABLEINFO        SYS
15         SYSOBJINFOS              SYS
16         SYSCONTEXTLIBS           SYS
17         SYSCONTEXTINDEXES        CTISYS
18         SYSCOLCYT                SYS
19         SYSRESOURCES             SYS
20         SYSTABLECOMMENTS         SYS
21         SYSCOLUMNCOMMENTS        SYS
22         SYS_REWRITE_EQUIVALENCES SYS

行号       TABLE_NAME      OWNER
---------- --------------- -----
23         SYSDISTABLEINFO SYS
24         SYSCOLINFOS     SYS
25         SYSDEPENDENCIES SYS
26         SYSFREQROOTS    SYS
27         SYSUSERINI$     SYS
28         SYSINJECTHINT   SYS
29         SYSDUAL2        SYS
30         SYSMSTATS       SYS
31         SYSOPENHISTORY  SYS
32         SYSSTATPREFS    SYS
33         SYSSTATTABLEIDU SYS

行号       TABLE_NAME         OWNER
---------- ------------------ -----
34         SYSFCOLDEFAULT     SYS
35         PROXY_INFO$        SYS
36         SYSPROFILES        SYS
37         SYSUSERPROFILES    SYS
38         SYSTUNINGTASK      SYS
39         SYSTUNINGEXECUTION SYS
40         SYSTUNINGREPORT    SYS
41         SYSMODIFICATIONS   SYS
42         SYSPKGPROCINFOS    SYS
43         SYSPKGPROCPARAMS   SYS
44         DPC_TABLESPACE     SYS

行号       TABLE_NAME     OWNER
---------- -------------- -----
45         SYSTSGROUPS    SYS
46         SYSREDEFSTATUS SYS
47         SYSREDEFOBJECT SYS
48         SYSREDEFDERROR SYS
49         SYSPLNINFO     SYS
50         SYSPLNOBJID    SYS
51         SYSCOLBYUSER   SYS
52         SYSOPARGS      SYS
53         RECYCLEBIN$    SYS
54         SYSERRORPAGES  SYS
55         SYSCRASHTRXS   SYS

行号       TABLE_NAME                  OWNER
---------- --------------------------- -----
56         SYSPLANHIST                 SYS
57         SYSTEMPLATEHUGEAUX          SYS
58         SYSTEMPLATEHUGEDAUX         SYS
59         SYSTEMPLATEHUGEUAUX         SYS
60         SYSFECKS                    SYS
61         SYSFECOLS                   SYS
62         SYSSQLPROFILE               SYS
63         SYSOIDS                     SYS
64         SYSTYPEATTRINFO             SYS
65         COL_USAGE$                  SYS
66         DBMS_PARALLEL_EXECUTE_TASK$ SYS

行号       TABLE_NAME                    OWNER
---------- ----------------------------- ------
67         DBMS_PARALLEL_EXECUTE_CHUNKS$ SYS
68         ##HISTOGRAMS_TABLE            SYSDBA
69         ##TMP_TBL_FOR_DBMS_LOB_BLOB   SYS
70         ##TMP_TBL_FOR_DBMS_LOB_CLOB   SYS
71         DBMS_LOCK_ALLOCATED           SYS
72         DBMS_ALERT_INFO               SYS
73         AQ$_QUEUE_TABLES              SYS
74         AQ$_QUEUES                    SYS
75         REG$                          SYS
76         ##PLAN_TABLE                  SYS
77         USERS                         APP

行号       TABLE_NAME  OWNER
---------- ----------- ------
78         ORDERS      APP
79         TEST_BACKUP SYSDBA

79 rows got

已用时间: 65.117(毫秒). 执行号:601.
SQL> SELECT * FROM test_backup;

行号       ID          NAME
---------- ----------- -----
1          1           Alice
2          2           Bob

已用时间: 2.531(毫秒). 执行号:602.
SQL> DROP TABLE test_backup;
操作已执行
已用时间: 31.603(毫秒). 执行号:603.
SQL> SELECT * FROM test_backup;
SELECT * FROM test_backup;
第1 行附近出现错误[-2106]:无效的表或视图名[TEST_BACKUP].
已用时间: 1.899(毫秒). 执行号:0.
SQL>
[dmdba@centos7 ~]$ disql SYSDBA/Sysdba123 <<EOF
> shutdown immediate;
> EOF

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.640(ms)
disql V8
SQL> 操作已执行
已用时间: 1.554(毫秒). 执行号:0.
SQL>
[dmdba@centos7 ~]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="restore database '/dmdata/data/DAMENG/dm.ini' from backupset '/dmdata/full'"
dmrman V8
restore database '/dmdata/data/DAMENG/dm.ini' from backupset '/dmdata/full'
file dm.key not found, use default license!
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                [Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:02.585
[1]+  完成                  nohup /home/dmdba/dmdbms/bin/dmserver /dmdata/data/DAMENG/dm.ini
[dmdba@centos7 ~]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="recover database '/dmdata/data/DAMENG/dm.ini' update db_magic"
dmrman V8
recover database '/dmdata/data/DAMENG/dm.ini' update db_magic
file dm.key not found, use default license!
recover successfully!
time used: 00:00:01.231
[dmdba@centos7 ~]$ nohup /home/dmdba/dmdbms/bin/dmserver /dmdata/data/DAMENG/dm.ini &
[1] 60348
[dmdba@centos7 ~]$ nohup: 忽略输入并把输出追加到"nohup.out"

[dmdba@centos7 ~]$ disql SYSDBA/Sysdba123 <<EOF
> SELECT * FROM test_backup;   -- 应该能看到 Alice 和 Bob 两条记录
> EOF

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.071(ms)
disql V8
SQL>
行号       ID          NAME
---------- ----------- -----
1          1           Alice
2          2           Bob

已用时间: 1.076(毫秒). 执行号:601.
SQL>
[dmdba@centos7 ~]$

3.3. 验证成功

如果查询返回了之前插入的两条数据,说明备份恢复成功。

整个过程演示了:

  • 准备测试数据
  • 脱机全量备份
  • 删除数据
  • 利用备份完整恢复

3.4. 注意事项

  • 执行 shutdown immediate 会断开所有连接,请确保无业务运行。
  • 恢复操作会覆盖当前数据文件,务必确认备份集正确且为所需恢复的时间点。
  • 若备份后数据库有新增日志,恢复时可能需要指定归档日志路径,此处演示为最简单的全量恢复(无归档)。
  • 所有命令建议逐条执行,确认每一步成功后再继续。

如果在执行过程中遇到路径或权限问题,请根据实际环境调整。


总结

  1. 成功部署了达梦DM8数据库,掌握在Linux系统上的完整部署流程(环境配置、命令行安装、实例初始化、服务注册与启动)。
  2. 熟练运用DM8的SQL语句,理解DDL中用户即schema的设计、数据类型与Oracle高度兼容;掌握DML/DQL标准操作、多表关联、分页查询及与MySQL的语法差异;通过DCL实现精细化权限控制,具备日常开发与管理能力。
  3. 掌握了DM8的逻辑备份热备(dexp/dimp)与物理冷备(dmrman)方法,理解逻辑备份适用于跨平台迁移和特定对象导出,物理冷备适用于全量/增量备份及恢复场景,能独立完成备份恢复操作。
  4. 了解了DM8的HTAP特性与行列融合技术,明确其在高性能交易处理、大规模数据分析、混合负载等场景的核心优势,对比传统数据库的差异,为国产数据库选型与替换提供技术依据。