第1章 认识达梦与环境搭建
🎯 本章学习目标
学完本章,你应当能够:
- 说送达梦数据库的定位、产品家族,以及它和 MySQL 在架构概念上的对应关系(实例/数据库/模式/表空间)。
- 解释建库时三个「定终身」参数:页大小、字符集、大小写敏感,为什么迁移前就必须想清楚。
- 独立在 Windows / Linux 上安装 DM8,用
dminit初始化数据库,启动/停止服务。 - 熟练使用三个官方工具:DM 管理工具(Manager)、DM 脚本助手、disql 命令行。
- 执行第一条达梦 SQL,并确认 Java 侧后续要用的端口、账号、驱动信息。
1.1 达梦是什么:给 MySQL 同学的三分钟背景
武汉达梦数据库股份有限公司(科创板上市,股票代码 688696)是国内最早一批做自主内核数据库的厂商,与「基于 MySQL/PostgreSQL 套壳」的国产库不同,达梦的代码是从头写起来的:
- 主流版本:DM8(政企项目绝对主流),DM9 已开始商用;学习本课程用 DM8 即可。
- SQL 风格:内核原生接近 Oracle(大小写、双引号、序列、包、PL/SQL 式的存储过程),同时提供 MySQL 兼容模式(后面第 6 章细讲)。
- 产品形态:单实例 → 主备数据守护集群 → 读写分离集群 → DSC 共享集群(类 Oracle RAC)→ MPP 大规模并行,覆盖从单机到分布式。
- 典型场景:政务、金融、电力、 telecom 的核心系统替换 Oracle/MySQL。
一句话认知
把达梦当成「会说 Oracle 话、又学了点 MySQL 语法的国产单机数据库」,学习时左手对照 MySQL 的习惯,右手留意那些「Oracle 味」的差异点,就够用了。
1.2 架构对照:MySQL 概念如何在达梦里「对号入座」
这是 MySQL 程序员转达梦最重要的一张图。MySQL 的层次是「服务 → 库 → 表」,而达梦是「实例 → 数据库 → 模式 → 对象」,中间多了一层「模式(Schema)」,还多了一个「表空间」。
1.2.1 层次结构对比
MySQL 达梦 DM8
───────── ──────────
mysqld 服务进程 实例(dmserver 进程,靠 dm.ini 启动)
└─ Database(库) └─ 数据库(一个实例只挂一个数据库,1:1)
└─ Table(表) └─ 表空间(TABLESPACE,绑定物理数据文件)
└─ User + 权限 └─ 模式(SCHEMA,对象的容器,如 SYSDBA)
└─ information_schema └─ 表/视图/索引/序列...(对象归属模式)
└─ 用户(USER,与模式分离,一个用户可拥有多个模式)1.2.2 概念逐项对照表
| MySQL | 达梦 | 差异要点(踩坑预警) |
|---|---|---|
| 实例 / mysqld | 实例 / dmserver | 达梦实例和数据库是 1:1;MySQL 一个服务下可以建 N 个库 |
CREATE DATABASE xx | 没有 freely 建库语句 | 达梦的「库」在安装初始化(dminit)时就建好了,日常开发基本不建库,而是建模式 |
| Database ≈ Schema(二者同义) | Schema(模式)独立一层 | 表的完整名是 模式.表,如 SYSDBA.T_USER;跨模式访问要权限 |
CREATE USER + GRANT ON db.* | CREATE USER + 系统/对象权限 | 达梦创建一个用户时,会自动创建一个与该用户同名的模式,这是最常见的默认约定 |
| 存储引擎(InnoDB 可选项) | 无引擎选择 | 达梦就一种自研存储引擎,不用纠结选引擎 |
| 表空间概念弱(ibdata/独立文件) | 表空间是一等公民 | 建表默认落在 MAIN 表空间;生产上按业务拆表空间是常规操作 |
| 默认端口 3306 | 默认端口 5236 | 防火墙、JDBC URL 都要改 |
| root 超级用户 | SYSDBA(管理员)/ SYSAUDITOR(审计) | 三权分立:SYSDBA 管数据,SYSAUDITOR 管审计,权限分离设计 |
information_schema | ALL_TABLES/DBA_TABLES/USER_TABLES 等数据字典视图 + V$ 动态视图 | 查元数据写法完全不同,第 3 章有速查表 |
| binlog | REDO 日志 + 归档日志 | 做 CDC/同步时订阅的对象不同 |
mysqldump | 逻辑导出工具 dexp/dimp | 第 6 章实战 |
| AUTO_INCREMENT | IDENTITY 自增列 或 序列 SEQUENCE | 达梦更推荐序列,第 2、3 章细讲 |
反引号 ` 引用标识符 | 双引号 " " 引用标识符 | 达梦不支持反引号(MySQL 兼容模式下除外) |
-- 注释 / # 注释 / /* */ | -- 注释 / /* */ | 达梦默认不认 # 注释 |
面试爱问:达梦为什么没有「USE 数据库」?
因为一个达梦实例只对应一个数据库。日常说的「切库」在达梦里对应的是切模式:SET SCHEMA "模式名";,或者在 JDBC URL 上指定 schema=xxx。回答时把「实例-库 1:1」这个架构特点讲出来就是加分项。
1.2.3 物理文件长什么样
达梦数据库目录(本例初始化在 /dm8/data/DAMENG)里的核心文件,对照 MySQL 的 datadir 理解:
| 文件 | 作用 | MySQL 对应物 |
|---|---|---|
SYSTEM.DBF / MAIN.DBF 等 .DBF | 表空间数据文件 | ibdata1 / 各.ibd |
DMAP.log、*.log | 重做/归档日志 | redo log / binlog |
dm.ini | 实例核心参数文件(最重要) | my.cnf |
dminit 相关控制文件 | 数据库控制信息 | — |
1.3 建库前必须想清楚的三个「定终身」参数
达梦初始化数据库(dminit)时有三个参数建库后不可修改(或修改代价极大),迁移项目必须在建库阶段就定对:
| 参数 | 取值 | 建议 | 为什么「定终身」 |
|---|---|---|---|
PAGE_SIZE 页大小 | 4 / 8 / 16 / 32 KB | 16K 或 32K(索引多、行宽时选大) | 决定行最大长度上限(约页大小减开销),建库后不能改;从 MySQL 迁移宽表(大 VARCHAR 拼起来几百字节)时页太小会建表失败 |
CHARSET 字符集 | 0=GB18030,1=UTF-8 | 1(UTF-8) | 建库后不能改,乱码只能重迁 |
CASE_SENSITIVE 大小写敏感 | Y / N | Y(默认),为快速兼容 MySQL 项目可选 N | 建库后不能改;Y 时未加引号的标识符按大写存储,t_user 与 T_USER 是同一张表但 "t_user" 是另一张表,是 Java 同学第一大坑(1.4 与第 2 章细讲) |
其他常用初始化参数:PORT_NUM(默认 5236)、SYSDBA_PWD(管理员密码,长度 8~48 位且含大小写字母+数字)、DB_NAME(数据库名)。
MySQL 老项目迁移的推荐组合
做「MySQL 项目平移到达梦」的验证环境时,很多团队采用:CHARSET=UTF-8 + CASE_SENSITIVE=N + 建库后设置 COMPATIBLE_MODE=4(MySQL 兼容模式),能少改一大半 SQL。第 6 章会给出完整的参数与取舍。
1.4 大小写敏感:第一课就要建立的直觉
CASE_SENSITIVE=Y(默认)时达梦的行为和 Oracle 一致,和 MySQL 明显不同:
-- 达梦(大小写敏感模式)
CREATE TABLE t_user (id INT); -- 实际存储为 "T_USER"
CREATE TABLE "t_user" (id INT); -- 这是另一张表,名字就叫小写 t_user
CREATE TABLE "T_User" (id INT); -- 还是另一张表
SELECT * FROM t_user; -- ✅ 命中 T_USER(未加引号 → 转大写再查找)
SELECT * FROM "t_user"; -- ✅ 命中小写那张 t_user
SELECT * FROM T_User; -- ✅ 命中 T_USER(照旧转大写)
SELECT * FROM "T_User"; -- ❌ 精确匹配带引号的 "T_User",若没建过就报「表不存在」而 MySQL(Linux 上表名大小写敏感但列名永远不敏感,且没有双引号标识符概念)完全没有这套规则。由此产生本课程第一条铁律:
铁律:在达梦里,SQL 中的标识符要么全不加引号(享受自动大写),要么加双引号并精确匹配大小写,两种风格混用必翻车。
Java 项目里 MyBatis 写的 select * from t_user 不加引号,实际查的是 T_USER,只要建表时也不加引号,就自洽、没问题。真正翻车的是迁移工具建出了小写表名、而代码里写大写(或反之)的场景。
1.5 下载与安装 DM8
官方下载地址:eco.dameng.com → 达梦数据库下载(需注册,开发版免费,CPU 架构选 x86_64)。下载得到 dm8_xxx.zip,解压后有 Windows 64 位安装包(iso 或 exe)。
1.5.1 Windows 安装(学习推荐)
- 右键镜像「装载」或解压后运行
setup.exe,安装向导一路下一步。 - 选择「仅安装数据库服务器」即可(客户端工具里含管理工具)。
- 安装目录建议无中文、无空格,如
D:\dm8\dmdbms。 - 安装完成后会自动弹出达梦配置管理器,依次做两件事:
- 「创建实例 → 创建数据库」:即 dminit 的图形化,把 1.3 的三个参数按建议设置;
- 「创建服务」:生成 Windows 服务
DmServiceDMSERVER(开机自启)。
- 授权(license):开发学习用官方免费授权,过期后重新申请替换
dm.key文件即可,不影响数据结构。
1.5.2 Linux 安装(生产形态)
以 root 创建用户和目录,再用图形/静默两种方式安装:
# 1) 创建操作系统用户 dmdba(达梦不允许用 root 运行数据库)
groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
mkdir -p /dm8/data && chown -R dmdba:dinstall /dm8
# 2) 挂载镜像并进入
mount -o loop dm8_20240xxx_x86_rh6_64.iso /mnt
su - dmdba
export DISPLAY=192.168.1.8:0.0 # 有图形终端时可走向导;否则下一步静默安装
/mnt/DMInstall.bin -q /home/dmdba/install.xml # 静默安装应答文件(可用图形安装一次后用生成的应答文件复用)
# 3) 初始化数据库(dminit,关键参数见 1.3)
cd /dm8/dmdbms/bin
./dminit path=/dm8/data PAGE_SIZE=16 CHARSET=1 CASE_SENSITIVE=Y \
port_num=5236 db_name=DAMENG SYSDBA_PWD='Your_Pass123' SYSAUDITOR_PWD='Your_Pass123'
# 4) 注册系统服务(需 root 执行一次)
cd /dm8/dmdbms/scripts/root
./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DAMENG/dm.ini -p DMSERVER
# 5) 启停服务
systemctl start DmServiceDMSERVER
systemctl status DmServiceDMSERVERLinux 常见安装报错 Top3
- 内存不足/共享内存报错:检查
/dev/shm大小与ulimit,dminit 前先free -h确认余量。 - 以 root 安装后服务起不来:数据目录属主必须是
dmdba,chown -R dmdba:dinstall /dm8。 - 图形安装闪退:
DISPLAY没配好,直接走静默安装-q应答文件,生产上反而推荐。
1.5.3 Docker 快速体验(可选)
官方在官网提供达梦 Docker 镜像与构建脚本,适合「只想 5 分钟起一个库练 SQL」的同学:
docker run -d --name dm8 \
-e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin \
-e SYSDBA_PWD=Your_Pass123 \
-p 5236:5236 \
<官方镜像名>:<版本>镜像获取方式与参数以官方文档《DM8 安装手册》和官网容器专区为准;企业生产不建议容器化跑核心库。
1.6 三个官方工具,各司其职
装完达梦,/dm8/tool(Windows 为安装目录\tool)下有成套工具。Java 同学只需要记住三个:
| 工具 | 类比 MySQL 圈 | 干什么用 |
|---|---|---|
| DM 管理工具(manager) | Navicat / DBeaver | 连库、看对象树、建表、写 SQL、看执行计划,日常 80% 时间用它 |
| DM 脚本助手(SqlAssistant) | 无对应 | 管理工具里写 SQL 时的智能补全增强版 |
| disql | mysql 命令行客户端 | 终端里执行 SQL、跑脚本,服务器上没图形界面时唯一选择 |
1.6.1 管理工具连接
新建连接 → 主机 127.0.0.1、端口 5236、用户名 SYSDBA、密码为初始化时设置的密码。左侧对象树里:模式 → 表/视图/索引/序列,先带你在图形上点一遍建表和查询。
1.6.2 disql 三板斧
# 1) 登录(注意密码含特殊字符时整个口令部分用引号包好)
cd /dm8/dmdbms/bin
./disql SYSDBA/'"Your_Pass123"'@127.0.0.1:5236
# 2) 进去后执行 SQL,以分号结尾(回车不会执行,MySQL 习惯要改)
SQL> SELECT 1 FROM DUAL;
SQL> CREATE TABLE T_TEST (ID INT PRIMARY KEY, NAME VARCHAR(50));
SQL> INSERT INTO T_TEST VALUES (1, '达梦');
SQL> COMMIT; -- disql 默认手动提交!第 4 章细讲
SQL> SELECT * FROM T_TEST;
# 3) 常用命令
SQL> SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN ('CASE_SENSITIVE','PAGE_SIZE','CHARSET'); -- 确认建库三参数
SQL> SELECT INSTANCE_NAME, HOST_NAME, STATUS$ FROM V$INSTANCE; -- 实例状态(STATUS$=OPEN 即正常)
SQL> sp_set_para_value(1,'EXCEPTION_COLLECT',1); -- 示例:动态改参(1=内存级)
SQL> EXIT;从 MySQL 命令行切过来要改的三个手感
- MySQL 里
select 1;一行流;disql 里分号+回车才算结束,多行语句会累积。 - MySQL 客户端默认自动提交;disql 默认手动提交,INSERT/UPDATE 后不
COMMIT,退出就没了。 - disql 里跑 SQL 脚本用
START /path/script.sql或\i script.sql,对应 MySQL 的source。
1.7 第一条 SQL 与 Java 侧要收集的信息
在 disql 里跑一遍下面的冒烟脚本,确认环境 OK:
-- 达梦支持 DUAL 伪表(Oracle 味),也支持不写 FROM(MySQL 味)
SELECT 1 + 1 FROM DUAL;
SELECT SYSDATE; -- 当前时间,对照 MySQL 的 NOW()
SELECT USER; -- 当前登录用户
SELECT * FROM V$INSTANCE; -- 实例状态:STATUS$=OPEN 即正常同时把第 5 章要用的信息登记好:
- 主机/端口:
127.0.0.1:5236 - 账号/模式:
SYSDBA(学习用);正式项目会建业务用户,登录即得同名模式 - 驱动类名:
dm.jdbc.driver.DmDriver - JDBC URL 模板:
jdbc:dm://host:5236
1.8 本章小结
- 达梦层次结构:实例 → 数据库(1:1)→ 表空间 → 模式 → 对象;一个用户自带一个同名模式。
- 建库三终身参数:页大小、字符集、大小写敏感,迁移项目在建库期就要按建议定好。
- 标识符规则:不加引号自动大写,加引号精确匹配,这是达梦第一大坑。
- 装完环境要会:dminit 建库、服务启停、管理工具连库、disql 三板斧、冒烟 SQL。
✍️ 课后练习
- 用自己的话画出「MySQL 服务/库/表」到「达梦 实例/库/表空间/模式/表」的映射图,并讲给同事听。
- 用 disql 完成:建表
T_STUDENT(含主键、姓名、入学日期),插 3 行,查询后分别演示 COMMIT 前后退出重连的结果差异,体会 disql 的手动提交。 - 执行
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN ('CASE_SENSITIVE','PAGE_SIZE','CHARSET');,记录你环境建库三参数的实际值。 - (思考题)
CREATE TABLE "Student"(...)之后,SELECT * FROM Student;能否查到数据?为什么?
📖 参考答案
第 1 题:画出「MySQL → 达梦」层次映射图
第 1 步,先按 MySQL 心智画出左边一列:服务(一个 mysqld 进程)→ 数据库(CREATE DATABASE shop)→ 表。
第 2 步,画右边时记住达梦的「1:1」和「多出两层」:一个达梦实例(dmserver 进程)只挂载一个数据库(打开目录时 1:1 绑死);库下面是表空间(物理文件的归属容器,MySQL 没有对应概念,最接近的是 tablespace);表空间里才是模式——且一个用户自带一个同名模式。
第 3 步,成品图(背下这条对应线就够):
MySQL 达梦 DM8
mysqld 进程 → 实例(dmserver)→ 数据库(1:1)
DATABASE shop → 模式 SHOP(用户 SHOP 登录即拥有同名模式)
(无感知) → 表空间(模式对象存哪个物理文件的分组,第 2 章建表用 TABLESPACE 指定)
data/shop/*.ibd → 数据文件(/dm8/data/DAMENG/*.DBF)讲给同事的一句话版本:「库」在达梦被拆成了「实例-库-表空间-模式」四级;MySQL 的 database ≈ 达梦的 schema,MySQL 实例里可以有 N 个库,达梦实例只有 1 个库。
第 2 题:disql 建表插 3 行,演示 COMMIT 前后退出的差异
第 1 步,登录并建表(注意每句以分号结尾才执行):
SQL> CREATE TABLE T_STUDENT (
ID INT PRIMARY KEY,
NAME VARCHAR(50),
ENROLL_DATE DATE);
SQL> INSERT INTO T_STUDENT VALUES (1, '张三', DATE'2026-09-01');
SQL> INSERT INTO T_STUDENT VALUES (2, '李四', DATE'2026-09-02');
SQL> INSERT INTO T_STUDENT VALUES (3, '王五', DATE'2026-09-03');
SQL> SELECT COUNT(*) FROM T_STUDENT; -- 本会话内能看到 3(自己未提交的自己可见)第 2 步,不 COMMIT 直接 EXIT,再重连查一次:
SQL> EXIT;
./disql SYSDBA/'"Your_Pass123"'@127.0.0.1:5236
SQL> SELECT COUNT(*) FROM T_STUDENT;
----------
0 ← 退出时未提交事务被自动回滚,3 行没了注意:表本身还在——建表是 DDL,执行时隐式提交(与 MySQL 相同)。
第 3 步,重新插 3 行并显式 COMMIT,再重连验证:
SQL> INSERT INTO T_STUDENT VALUES (1, '张三', DATE'2026-09-01');
SQL> INSERT INTO T_STUDENT VALUES (2, '李四', DATE'2026-09-02');
SQL> INSERT INTO T_STUDENT VALUES (3, '王五', DATE'2026-09-03');
SQL> COMMIT;
SQL> EXIT;
-- 重连后:
SQL> SELECT ID, NAME FROM T_STUDENT ORDER BY ID;
----------- ----------
1 张三
2 李四
3 王五 ← 这次还在第 4 步(可选对照),SET AUTOCOMMIT 1; 后插一条不 COMMIT 直接退出,重连能查到——这就是 MySQL 客户端的默认手感,disql 出厂是 0。
第 3 题:记录建库三参数的实际值
第 1 步,执行查询:
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI
WHERE PARA_NAME IN ('CASE_SENSITIVE','PAGE_SIZE','CHARSET');第 2 步,输出对照解读(以 1.5.2 的 dminit 参数为例):
PARA_NAME PARA_VALUE
----------- ----------
CASE_SENSITIVE Y ← 大小写敏感(建库定,终身不可改)
PAGE_SIZE 16 ← 数据页 16 KB(单位 KB,不可改)
CHARSET 1 ← 1 = UTF-8;0 = GB18030(不可改)第 3 步,把三行抄进你的环境登记文档(第 5 章连库前要用);若发现 PAGE_SIZE=8 且项目要迁 MySQL 宽表,趁早按计划重建库——这三个参数没有任何一个能事后修改。
第 4 题(思考题):"Student" 建表后 SELECT * FROM Student 能否查到?
查不到(报表不存在)。推理链条就是本章 1.4 的铁律两段式:
- 建表
CREATE TABLE "Student"带引号 → 名字按原样小写存储,对象就叫Student; - 查询
FROM Student不带引号 → 达梦自动转大写后去找STUDENT→ 找不到,报「表 [STUDENT] 不存在」; - 只有
SELECT * FROM "Student"才能命中(引号全程跟着走)。
例外:若建库时 CASE_SENSITIVE=N,则不区分大小写、直接能查到。所以结论是:同一套 SQL 在不同大小写策略的库里行为不同——全链路统一「不加引号」(自动大写风格)是唯一不用动脑的活法。
下一章我们进入正题:用 MySQL 的旧知识,逐条对照学达梦的 SQL 基础。
