预见猿份
主题
首页面试题模拟面试SQL练习在线工具关于我们老苗一对一私教学员评价
实战项目
零基础学习路线项目前置基础创新WMS项目Java微服务框架与实战云岚到家项目闪聚支付项目学成在线项目青橙电商项目JVM原理与实战调优分布式事务专题Java高频面试题MySQL从入门到精通达梦数据库从入门到实战MongoDB从入门到实战PostgreSQL从入门到实战TiDB从入门到实战Java数据结构与算法Java 并发编程(JUC)实战课程老苗一对一私教学员评价
blog我的会员
  • 达梦数据库从入门到实战|Java 程序员的国产化数据库迁移指南

    • 课程介绍
    • 第1章 认识达梦与环境搭建
    • 第2章 SQL基础(MySQL对照)
    • 第3章 高级查询与数据库编程
    • 第4章 事务、锁与并发
    • 第5章 Java集成实战
    • 第6章 MySQL迁移与日常运维







----- 到底线了 -----

第1章 认识达梦与环境搭建 ​

🎯 本章学习目标 ​

学完本章,你应当能够:

  1. 说送达梦数据库的定位、产品家族,以及它和 MySQL 在架构概念上的对应关系(实例/数据库/模式/表空间)。
  2. 解释建库时三个「定终身」参数:页大小、字符集、大小写敏感,为什么迁移前就必须想清楚。
  3. 独立在 Windows / Linux 上安装 DM8,用 dminit 初始化数据库,启动/停止服务。
  4. 熟练使用三个官方工具:DM 管理工具(Manager)、DM 脚本助手、disql 命令行。
  5. 执行第一条达梦 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 层次结构对比 ​

text
MySQL                          达梦 DM8
─────────                      ──────────
mysqld 服务进程                 实例(dmserver 进程,靠 dm.ini 启动)
  └─ Database(库)              └─ 数据库(一个实例只挂一个数据库,1:1)
       └─ Table(表)                └─ 表空间(TABLESPACE,绑定物理数据文件)
       └─ User + 权限                   └─ 模式(SCHEMA,对象的容器,如 SYSDBA)
       └─ information_schema                 └─ 表/视图/索引/序列...(对象归属模式)
                                            └─ 用户(USER,与模式分离,一个用户可拥有多个模式)
1
2
3
4
5
6
7
8

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_schemaALL_TABLES/DBA_TABLES/USER_TABLES 等数据字典视图 + V$ 动态视图查元数据写法完全不同,第 3 章有速查表
binlogREDO 日志 + 归档日志做 CDC/同步时订阅的对象不同
mysqldump逻辑导出工具 dexp/dimp第 6 章实战
AUTO_INCREMENTIDENTITY 自增列 或 序列 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 KB16K 或 32K(索引多、行宽时选大)决定行最大长度上限(约页大小减开销),建库后不能改;从 MySQL 迁移宽表(大 VARCHAR 拼起来几百字节)时页太小会建表失败
CHARSET 字符集0=GB18030,1=UTF-81(UTF-8)建库后不能改,乱码只能重迁
CASE_SENSITIVE 大小写敏感Y / NY(默认),为快速兼容 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 明显不同:

sql
-- 达梦(大小写敏感模式)
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",若没建过就报「表不存在」
1
2
3
4
5
6
7
8
9

而 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 安装(学习推荐) ​

  1. 右键镜像「装载」或解压后运行 setup.exe,安装向导一路下一步。
  2. 选择「仅安装数据库服务器」即可(客户端工具里含管理工具)。
  3. 安装目录建议无中文、无空格,如 D:\dm8\dmdbms。
  4. 安装完成后会自动弹出达梦配置管理器,依次做两件事:
    • 「创建实例 → 创建数据库」:即 dminit 的图形化,把 1.3 的三个参数按建议设置;
    • 「创建服务」:生成 Windows 服务 DmServiceDMSERVER(开机自启)。
  5. 授权(license):开发学习用官方免费授权,过期后重新申请替换 dm.key 文件即可,不影响数据结构。

1.5.2 Linux 安装(生产形态) ​

以 root 创建用户和目录,再用图形/静默两种方式安装:

bash
# 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 DmServiceDMSERVER
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Linux 常见安装报错 Top3

  1. 内存不足/共享内存报错:检查 /dev/shm 大小与 ulimit,dminit 前先 free -h 确认余量。
  2. 以 root 安装后服务起不来:数据目录属主必须是 dmdba,chown -R dmdba:dinstall /dm8。
  3. 图形安装闪退:DISPLAY 没配好,直接走静默安装 -q 应答文件,生产上反而推荐。

1.5.3 Docker 快速体验(可选) ​

官方在官网提供达梦 Docker 镜像与构建脚本,适合「只想 5 分钟起一个库练 SQL」的同学:

bash
docker run -d --name dm8 \
  -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin \
  -e SYSDBA_PWD=Your_Pass123 \
  -p 5236:5236 \
  <官方镜像名>:<版本>
1
2
3
4
5

镜像获取方式与参数以官方文档《DM8 安装手册》和官网容器专区为准;企业生产不建议容器化跑核心库。

1.6 三个官方工具,各司其职 ​

装完达梦,/dm8/tool(Windows 为安装目录\tool)下有成套工具。Java 同学只需要记住三个:

工具类比 MySQL 圈干什么用
DM 管理工具(manager)Navicat / DBeaver连库、看对象树、建表、写 SQL、看执行计划,日常 80% 时间用它
DM 脚本助手(SqlAssistant)无对应管理工具里写 SQL 时的智能补全增强版
disqlmysql 命令行客户端终端里执行 SQL、跑脚本,服务器上没图形界面时唯一选择

1.6.1 管理工具连接 ​

新建连接 → 主机 127.0.0.1、端口 5236、用户名 SYSDBA、密码为初始化时设置的密码。左侧对象树里:模式 → 表/视图/索引/序列,先带你在图形上点一遍建表和查询。

1.6.2 disql 三板斧 ​

bash
# 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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

从 MySQL 命令行切过来要改的三个手感

  1. MySQL 里 select 1; 一行流;disql 里分号+回车才算结束,多行语句会累积。
  2. MySQL 客户端默认自动提交;disql 默认手动提交,INSERT/UPDATE 后不 COMMIT,退出就没了。
  3. disql 里跑 SQL 脚本用 START /path/script.sql 或 \i script.sql,对应 MySQL 的 source。

1.7 第一条 SQL 与 Java 侧要收集的信息 ​

在 disql 里跑一遍下面的冒烟脚本,确认环境 OK:

sql
-- 达梦支持 DUAL 伪表(Oracle 味),也支持不写 FROM(MySQL 味)
SELECT 1 + 1 FROM DUAL;
SELECT SYSDATE;                 -- 当前时间,对照 MySQL 的 NOW()
SELECT USER;                    -- 当前登录用户
SELECT * FROM V$INSTANCE;       -- 实例状态:STATUS$=OPEN 即正常
1
2
3
4
5

同时把第 5 章要用的信息登记好:

  • 主机/端口:127.0.0.1:5236
  • 账号/模式:SYSDBA(学习用);正式项目会建业务用户,登录即得同名模式
  • 驱动类名:dm.jdbc.driver.DmDriver
  • JDBC URL 模板:jdbc:dm://host:5236

1.8 本章小结 ​

  1. 达梦层次结构:实例 → 数据库(1:1)→ 表空间 → 模式 → 对象;一个用户自带一个同名模式。
  2. 建库三终身参数:页大小、字符集、大小写敏感,迁移项目在建库期就要按建议定好。
  3. 标识符规则:不加引号自动大写,加引号精确匹配,这是达梦第一大坑。
  4. 装完环境要会:dminit 建库、服务启停、管理工具连库、disql 三板斧、冒烟 SQL。

✍️ 课后练习 ​

  1. 用自己的话画出「MySQL 服务/库/表」到「达梦 实例/库/表空间/模式/表」的映射图,并讲给同事听。
  2. 用 disql 完成:建表 T_STUDENT(含主键、姓名、入学日期),插 3 行,查询后分别演示 COMMIT 前后退出重连的结果差异,体会 disql 的手动提交。
  3. 执行 SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN ('CASE_SENSITIVE','PAGE_SIZE','CHARSET');,记录你环境建库三参数的实际值。
  4. (思考题)CREATE TABLE "Student"(...) 之后,SELECT * FROM Student; 能否查到数据?为什么?

📖 参考答案 ​

第 1 题:画出「MySQL → 达梦」层次映射图

第 1 步,先按 MySQL 心智画出左边一列:服务(一个 mysqld 进程)→ 数据库(CREATE DATABASE shop)→ 表。

第 2 步,画右边时记住达梦的「1:1」和「多出两层」:一个达梦实例(dmserver 进程)只挂载一个数据库(打开目录时 1:1 绑死);库下面是表空间(物理文件的归属容器,MySQL 没有对应概念,最接近的是 tablespace);表空间里才是模式——且一个用户自带一个同名模式。

第 3 步,成品图(背下这条对应线就够):

text
MySQL                  达梦 DM8
mysqld 进程        →   实例(dmserver)→ 数据库(1:1)
DATABASE shop     →   模式 SHOP(用户 SHOP 登录即拥有同名模式)
(无感知)         →   表空间(模式对象存哪个物理文件的分组,第 2 章建表用 TABLESPACE 指定)
data/shop/*.ibd   →   数据文件(/dm8/data/DAMENG/*.DBF)
1
2
3
4
5

讲给同事的一句话版本:「库」在达梦被拆成了「实例-库-表空间-模式」四级;MySQL 的 database ≈ 达梦的 schema,MySQL 实例里可以有 N 个库,达梦实例只有 1 个库。

第 2 题:disql 建表插 3 行,演示 COMMIT 前后退出的差异

第 1 步,登录并建表(注意每句以分号结尾才执行):

sql
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(自己未提交的自己可见)
1
2
3
4
5
6
7
8

第 2 步,不 COMMIT 直接 EXIT,再重连查一次:

sql
SQL> EXIT;
./disql SYSDBA/'"Your_Pass123"'@127.0.0.1:5236
SQL> SELECT COUNT(*) FROM T_STUDENT;
----------
           0        ← 退出时未提交事务被自动回滚,3 行没了
1
2
3
4
5

注意:表本身还在——建表是 DDL,执行时隐式提交(与 MySQL 相同)。

第 3 步,重新插 3 行并显式 COMMIT,再重连验证:

sql
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 王五      ← 这次还在
1
2
3
4
5
6
7
8
9
10
11

第 4 步(可选对照),SET AUTOCOMMIT 1; 后插一条不 COMMIT 直接退出,重连能查到——这就是 MySQL 客户端的默认手感,disql 出厂是 0。

第 3 题:记录建库三参数的实际值

第 1 步,执行查询:

sql
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI
 WHERE PARA_NAME IN ('CASE_SENSITIVE','PAGE_SIZE','CHARSET');
1
2

第 2 步,输出对照解读(以 1.5.2 的 dminit 参数为例):

text
PARA_NAME       PARA_VALUE
-----------     ----------
CASE_SENSITIVE  Y            ← 大小写敏感(建库定,终身不可改)
PAGE_SIZE       16           ← 数据页 16 KB(单位 KB,不可改)
CHARSET         1            ← 1 = UTF-8;0 = GB18030(不可改)
1
2
3
4
5

第 3 步,把三行抄进你的环境登记文档(第 5 章连库前要用);若发现 PAGE_SIZE=8 且项目要迁 MySQL 宽表,趁早按计划重建库——这三个参数没有任何一个能事后修改。

第 4 题(思考题):"Student" 建表后 SELECT * FROM Student 能否查到?

查不到(报表不存在)。推理链条就是本章 1.4 的铁律两段式:

  1. 建表 CREATE TABLE "Student" 带引号 → 名字按原样小写存储,对象就叫 Student;
  2. 查询 FROM Student 不带引号 → 达梦自动转大写后去找 STUDENT → 找不到,报「表 [STUDENT] 不存在」;
  3. 只有 SELECT * FROM "Student" 才能命中(引号全程跟着走)。

例外:若建库时 CASE_SENSITIVE=N,则不区分大小写、直接能查到。所以结论是:同一套 SQL 在不同大小写策略的库里行为不同——全链路统一「不加引号」(自动大写风格)是唯一不用动脑的活法。

下一章我们进入正题:用 MySQL 的旧知识,逐条对照学达梦的 SQL 基础。

← 课程介绍第2章 SQL基础(MySQL对照) →








如果发现文档内容有错误或排版错乱,请及时联系站长老苗修改,不胜感激。联系我们
关于我们 | 隐私政策 | 豫ICP备2026003386号-4 | 豫公网安备41010202004008号
目录

本页无章节