学习实践:达梦数据库从入门到实战(附全模块操作笔记与学习心得)

作为一名聚焦国产技术的学习者,我近期以达梦数据库(DM8)为核心,完成了从基础认知到企业级实操的全流程学习。从初识国产数据库生态,到解决环境部署、数据操作、程序开发等实际问题,整个过程既掌握了达梦数据库的核心技能,也加深了对国产数据库技术体系的理解。本文将以学习实践视角,详细记录各模块操作步骤、踩坑过程与心得,希望能给同阶段学习者提供参考。

目录(学习导航)

一、实战背景与需求拆解

  1. 实战背景与学习目标
  2. 前置知识:国产数据库与达梦基础认知

二、达梦数据库核心学习模块(含详细操作步骤)

  1. 达梦数据库的环境部署:专属步骤(含配置要点)
  2. 达梦数据库常用对象管理:实操记录
  3. 数据操作与完整性约束:基础语法与实践
  4. 达梦数据库查询:单表 / 多表操作案例
  5. 达梦数据库高级对象管理:进阶配置
  6. DMSQL 程序设计:语法与实践
  7. DMJDBC 应用程序开发:示例与调试
  8. 达梦数据库备份还原与作业:运维基础

三、实践总结

  1. 深度踩坑实录:新手常见问题与解决(详写版
  2. 达梦数据库实用技巧与优化尝试

一、实战背景与需求拆解

1. 实战背景与学习目标

  • 背景:国产数据库在政企领域渗透率提升,达梦作为头部产品,是技术学习的核心方向之一
  • 目标:掌握达梦数据库从部署到开发、运维的全流程技能,能独立完成基础业务场景的数据库搭建与使用

2. 前置知识:国产数据库与达梦基础认知

  1. 国产数据库生态
    • 主流产品:达梦、人大金仓、OceanBase 等
    • 达梦定位:关系型数据库,兼容 Oracle 语法,适用于政务、金融等领域
  2. 达梦核心概念
    • 实例:数据库服务的运行载体
    • 表空间:数据存储的逻辑单元
    • DM 管理工具:DM Console(图形化)、disql(命令行)

二、达梦数据库核心学习模块(含详细操作步骤)

1. 达梦数据库的环境部署:专属步骤(含配置要点)

操作步骤

  1. 系统准备(以 CentOS 7 为例):
    • 关闭防火墙:systemctl stop firewalld && systemctl disable firewalld
    • 关闭 SELinux:修改/etc/selinux/config,设置SELINUX=disabled,重启生效
  2. 安装包获取
    • 从达梦官网下载 DM8 安装包(需申请试用授权)
  3. 安装流程
    • 解压安装包:unzip dm8_202308.zip
    • 执行安装脚本:./DMInstall.bin,选择 “典型安装”
    • 按提示设置安装路径(建议/opt/dm8
  4. 初始化实例
    • 运行/opt/dm8/bin/dminit,设置实例名、端口(默认 5236)、字符集(建议 UTF-8)
  5. 启动服务
    • 注册服务:/opt/dm8/script/root/dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /opt/dm8/data/DAMENG/dm.ini
    • 启动服务:systemctl start DmServiceDMSERVER

2. 达梦数据库常用对象管理:实操记录

操作工具:disql 命令行(登录:disql SYSDBA/SYSDBA@localhost:5236

(1)表空间管理

sql

-- 创建表空间
CREATE TABLESPACE TEST_TBS DATAFILE 'TEST_TBS.DBF' SIZE 100M AUTOEXTEND ON NEXT 10M;

-- 扩展表空间
ALTER TABLESPACE TEST_TBS ADD DATAFILE 'TEST_TBS2.DBF' SIZE 50M;
(2)用户与权限管理

sql

-- 创建用户(指定默认表空间)
CREATE USER TEST_USER IDENTIFIED BY "Test@123" DEFAULT TABLESPACE TEST_TBS;

-- 授予权限
GRANT RESOURCE, CREATE SESSION TO TEST_USER;
(3)表管理

sql

-- 切换用户
CONNECT TEST_USER/"Test@123";

-- 创建表
CREATE TABLE STUDENT (
    ID INT PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL,
    AGE INT
);

3. 数据操作与完整性约束:基础语法与实践

(1)数据操作(DML)

sql

-- 插入数据
INSERT INTO STUDENT VALUES (1, '张三', 20);
INSERT INTO STUDENT VALUES (2, '李四', 22);

-- 更新数据
UPDATE STUDENT SET AGE = 21 WHERE ID = 1;

-- 删除数据
DELETE FROM STUDENT WHERE ID = 2;
(2)完整性约束

sql

-- 新增唯一约束
ALTER TABLE STUDENT ADD CONSTRAINT UK_STUDENT_NAME UNIQUE(NAME);

-- 新增检查约束(年龄≥18)
ALTER TABLE STUDENT ADD CONSTRAINT CK_STUDENT_AGE CHECK(AGE >= 18);

4. 达梦数据库查询:单表 / 多表操作案例

(1)单表查询

sql

-- 查询所有学生
SELECT * FROM STUDENT;

-- 条件查询(年龄>20)
SELECT NAME, AGE FROM STUDENT WHERE AGE > 20;
(2)多表查询(示例:新增 COURSE、STUDENT_COURSE 表)

sql

-- 创建课程表
CREATE TABLE COURSE (
    CID INT PRIMARY KEY,
    CNAME VARCHAR(30)
);
INSERT INTO COURSE VALUES (101, '数据库');
INSERT INTO COURSE VALUES (102, 'Python');

-- 创建学生-课程关联表
CREATE TABLE STUDENT_COURSE (
    SID INT,
    CID INT,
    SCORE INT,
    PRIMARY KEY(SID, CID),
    FOREIGN KEY(SID) REFERENCES STUDENT(ID),
    FOREIGN KEY(CID) REFERENCES COURSE(CID)
);
INSERT INTO STUDENT_COURSE VALUES (1, 101, 90);

-- 多表关联查询(学生姓名+课程名+成绩)
SELECT S.NAME, C.CNAME, SC.SCORE
FROM STUDENT S
JOIN STUDENT_COURSE SC ON S.ID = SC.SID
JOIN COURSE C ON SC.CID = C.CID;

5. 达梦数据库高级对象管理:进阶配置

(1)索引管理

sql

-- 创建普通索引(优化NAME字段查询)
CREATE INDEX IDX_STUDENT_NAME ON STUDENT(NAME);
(2)视图管理

sql

-- 创建视图(学生成绩视图)
CREATE VIEW STUDENT_SCORE_VIEW AS
SELECT S.NAME, C.CNAME, SC.SCORE
FROM STUDENT S
JOIN STUDENT_COURSE SC ON S.ID = SC.SID
JOIN COURSE C ON SC.CID = C.CID;

6. DMSQL 程序设计:语法与实践

示例:存储过程(查询学生年龄)

sql

CREATE OR REPLACE PROCEDURE SP_QUERY_STUDENT_AGE(
    IN P_ID INT,
    OUT P_AGE INT
)
AS
BEGIN
    SELECT AGE INTO P_AGE FROM STUDENT WHERE ID = P_ID;
END;
/

-- 调用存储过程
DECLARE
    V_AGE INT;
BEGIN
    SP_QUERY_STUDENT_AGE(1, V_AGE);
    PRINT '学生年龄:' || V_AGE;
END;
/

7. DMJDBC 应用程序开发:示例与调试

步骤 1:获取 DMJDBC 驱动

  • 路径:/opt/dm8/drivers/jdbc/dmjdbc8.jar

步骤 2:Java 连接示例

java

运行

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DmJdbcDemo {
    public static void main(String[] args) {
        String url = "jdbc:dm://localhost:5236";
        String user = "TEST_USER";
        String password = "Test@123";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT * FROM STUDENT")) {

            while (rs.next()) {
                System.out.println("ID:" + rs.getInt("ID") + ",姓名:" + rs.getString("NAME"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

步骤 3:编译运行

  • 编译:javac -cp dmjdbc8.jar DmJdbcDemo.java
  • 运行:java -cp .:dmjdbc8.jar DmJdbcDemo

8. 达梦数据库备份还原与作业:运维基础

(1)逻辑备份(使用 dexp)

bash

运行

# 备份TEST_USER用户下的所有对象
/opt/dm8/bin/dexp SYSDBA/SYSDBA@localhost:5236 FILE=test_user.dmp OWNER=TEST_USER
(2)逻辑还原(使用 dimp)

bash

运行

# 还原备份文件到数据库
/opt/dm8/bin/dimp SYSDBA/SYSDBA@localhost:5236 FILE=test_user.dmp OWNER=TEST_USER
(3)定时作业(使用 DM 作业系统)
  1. 登录 DM Console,进入 “作业管理”
  2. 新建作业:设置作业名称、执行周期(如每天 23:00)
  3. 添加作业步骤:选择 “SQL 脚本”,输入备份命令
  4. 启用作业

三、实践总结

1. 深度踩坑实录:新手常见问题与解决(详写版)

问题 1:安装时提示 “物理内存不足,至少需要 2048MB”
  • 场景:在内存≤2G 的虚拟机中执行dminit初始化实例时报错
  • 原因:达梦默认要求实例初始化的内存配置为 2G,低于此值会触发校验
  • 解决步骤
    1. 执行dminit时手动指定内存参数:

      bash

      运行

      /opt/dm8/bin/dminit PATH=/opt/dm8/data MEMORY_SIZE=512 PAGE_SIZE=16
      
      MEMORY_SIZE设置为 512MB,PAGE_SIZE为 16KB 适配小内存)
    2. 若仍报错,可临时关闭内存校验(不推荐生产环境):修改dm.ini中的MEMORY_CHECK参数为0,重启实例
问题 2:disql 登录提示 “[-70002]: 用户名或密码错误”
  • 场景:使用disql SYSDBA/SYSDBA@localhost:5236登录时认证失败
  • 原因
    • 可能是初始化实例时修改了默认密码;
    • 或密码大小写敏感(达梦默认密码区分大小写)
  • 解决步骤
    1. 确认初始化时的密码:若忘记,可通过dmctl工具重置:

      bash

      运行

      /opt/dm8/bin/dmctl SYSDBA/SYSDBA@localhost:5236
      # 进入交互模式后执行
      alter user SYSDBA identified by "SYSDBA";
      
    2. 登录时确保密码大小写与设置一致(如密码是Sysdba,需输入SYSDBA/Sysdba
问题 3:插入中文数据后查询显示乱码
  • 场景:插入INSERT INTO STUDENT VALUES (3, '王五', 23);后,查询结果中 “王五” 显示为??
  • 原因
    • 数据库字符集与客户端字符集不匹配;
    • 初始化实例时未选择 UTF-8 字符集
  • 解决步骤
    1. 检查数据库字符集:

      sql

      SELECT PARAM_NAME, PARAM_VALUE FROM V$DM_INI WHERE PARAM_NAME='CHARSET';
      
      (若结果是1代表 GBK,0代表 UTF-8)
    2. 若数据库是 GBK,客户端需设置编码:在 disql 中执行SET NAMES GBK;,或在 JDBC 连接 URL 中添加characterEncoding=GBK
    3. 若需永久改为 UTF-8,需重新初始化实例并指定CHARSET=0
问题 4:JDBC 连接报错 “Connection refused: connect”
  • 场景:Java 程序执行DriverManager.getConnection()时提示连接被拒绝
  • 原因
    • 数据库服务未启动;
    • 端口未开放;
    • 实例监听地址不是 0.0.0.0(仅允许本地连接)
  • 解决步骤
    1. 检查服务状态:systemctl status DmServiceDMSERVER,若未启动则执行systemctl start DmServiceDMSERVER
    2. 测试端口连通性:telnet localhost 5236,若不通则开放端口:

      bash

      运行

      firewall-cmd --add-port=5236/tcp --permanent
      firewall-cmd --reload
      
    3. 修改实例监听地址:编辑dm.ini中的LISTENER_ADDRESS0.0.0.0:5236,重启服务
问题 5:执行备份命令提示 “[-8002]: 权限不足”
  • 场景:执行dexp备份时提示权限错误
  • 原因dexp工具需要操作系统用户对备份目录有读写权限
  • 解决步骤
    1. 确认备份文件存储目录的权限:

      bash

      运行

      mkdir -p /opt/dm8/backup
      chown dmdba:dinstall /opt/dm8/backup  # 达梦默认操作系统用户是dmdba
      
    2. 使用dmdba用户执行备份命令:

      bash

      运行

      su - dmdba
      /opt/dm8/bin/dexp SYSDBA/SYSDBA@localhost:5236 FILE=/opt/dm8/backup/test_user.dmp OWNER=TEST_USER
      

2. 达梦数据库实用技巧与优化尝试

  • 技巧 1:使用EXPLAIN分析 SQL 执行计划,优化慢查询
  • 技巧 2:开启归档模式,保障数据恢复安全性
  • 优化尝试:对大表分表存储,提升查询效率

结语:在国产化浪潮中把握技术脉搏

达梦数据库不仅仅是一个技术产品,更是中国基础软件四十年发展的缩影。从最初的艰难探索到今天的行业标杆,每一步都凝聚着中国技术人的智慧与汗水。学习达梦数据库,掌握的不仅是一套工具的使用方法,更是理解中国信息技术自主创新的逻辑与路径。

在未来的3-5年,随着信创产业的深入发展,掌握国产数据库技术将成为技术人员的核心竞争优势。无论你是刚入行的新人,还是希望转型的老兵,现在都是开始学习达梦数据库的最佳时机。

学习的道路从来不是孤军奋战。加入达梦技术社区,参与开源项目,与同行交流,在实践中不断成长。当你能够用达梦数据库支撑起一个关键业务系统时,你会发现,技术能力的提升带来的不仅是职业发展,更是参与国家核心技术建设的自豪感。


延伸阅读

  1. 《达梦数据库架构解析》(达梦官方出品)

  2. 《深入理解达梦数据库存储引擎》(技术社区连载)

  3. 《从Oracle到达梦:迁移实战指南》(案例集)

互动讨论
欢迎在评论区分享:

  1. 你在学习达梦数据库过程中遇到的最大挑战是什么?

  2. 你认为国产数据库未来最大的发展机会在哪里?

  3. 你最希望达梦数据库增加什么功能?

  4. 版权声明:本文为原创内容,采用CC BY-NC-SA 4.0协议共享,转载请注明出处。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐