国产数据库实战一课一得
学习实践:达梦数据库从入门到实战(附全模块操作笔记与学习心得)
作为一名聚焦国产技术的学习者,我近期以达梦数据库(DM8)为核心,完成了从基础认知到企业级实操的全流程学习。从初识国产数据库生态,到解决环境部署、数据操作、程序开发等实际问题,整个过程既掌握了达梦数据库的核心技能,也加深了对国产数据库技术体系的理解。本文将以学习实践视角,详细记录各模块操作步骤、踩坑过程与心得,希望能给同阶段学习者提供参考。
目录(学习导航)
一、实战背景与需求拆解
- 实战背景与学习目标
- 前置知识:国产数据库与达梦基础认知
二、达梦数据库核心学习模块(含详细操作步骤)
- 达梦数据库的环境部署:专属步骤(含配置要点)
- 达梦数据库常用对象管理:实操记录
- 数据操作与完整性约束:基础语法与实践
- 达梦数据库查询:单表 / 多表操作案例
- 达梦数据库高级对象管理:进阶配置
- DMSQL 程序设计:语法与实践
- DMJDBC 应用程序开发:示例与调试
- 达梦数据库备份还原与作业:运维基础
三、实践总结
- 深度踩坑实录:新手常见问题与解决(详写版)
- 达梦数据库实用技巧与优化尝试
一、实战背景与需求拆解
1. 实战背景与学习目标
- 背景:国产数据库在政企领域渗透率提升,达梦作为头部产品,是技术学习的核心方向之一
- 目标:掌握达梦数据库从部署到开发、运维的全流程技能,能独立完成基础业务场景的数据库搭建与使用
2. 前置知识:国产数据库与达梦基础认知
- 国产数据库生态:
- 主流产品:达梦、人大金仓、OceanBase 等
- 达梦定位:关系型数据库,兼容 Oracle 语法,适用于政务、金融等领域
- 达梦核心概念:
- 实例:数据库服务的运行载体
- 表空间:数据存储的逻辑单元
- DM 管理工具:DM Console(图形化)、disql(命令行)
二、达梦数据库核心学习模块(含详细操作步骤)
1. 达梦数据库的环境部署:专属步骤(含配置要点)
操作步骤:
- 系统准备(以 CentOS 7 为例):
- 关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld - 关闭 SELinux:修改
/etc/selinux/config,设置SELINUX=disabled,重启生效
- 关闭防火墙:
- 安装包获取:
- 从达梦官网下载 DM8 安装包(需申请试用授权)
- 安装流程:
- 解压安装包:
unzip dm8_202308.zip - 执行安装脚本:
./DMInstall.bin,选择 “典型安装” - 按提示设置安装路径(建议
/opt/dm8)
- 解压安装包:
- 初始化实例:
- 运行
/opt/dm8/bin/dminit,设置实例名、端口(默认 5236)、字符集(建议 UTF-8)
- 运行
- 启动服务:
- 注册服务:
/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 作业系统)
- 登录 DM Console,进入 “作业管理”
- 新建作业:设置作业名称、执行周期(如每天 23:00)
- 添加作业步骤:选择 “SQL 脚本”,输入备份命令
- 启用作业
三、实践总结
1. 深度踩坑实录:新手常见问题与解决(详写版)
问题 1:安装时提示 “物理内存不足,至少需要 2048MB”
- 场景:在内存≤2G 的虚拟机中执行
dminit初始化实例时报错 - 原因:达梦默认要求实例初始化的内存配置为 2G,低于此值会触发校验
- 解决步骤:
- 执行
dminit时手动指定内存参数:bash
运行
(/opt/dm8/bin/dminit PATH=/opt/dm8/data MEMORY_SIZE=512 PAGE_SIZE=16MEMORY_SIZE设置为 512MB,PAGE_SIZE为 16KB 适配小内存) - 若仍报错,可临时关闭内存校验(不推荐生产环境):修改
dm.ini中的MEMORY_CHECK参数为0,重启实例
- 执行
问题 2:disql 登录提示 “[-70002]: 用户名或密码错误”
- 场景:使用
disql SYSDBA/SYSDBA@localhost:5236登录时认证失败 - 原因:
- 可能是初始化实例时修改了默认密码;
- 或密码大小写敏感(达梦默认密码区分大小写)
- 解决步骤:
- 确认初始化时的密码:若忘记,可通过
dmctl工具重置:bash
运行
/opt/dm8/bin/dmctl SYSDBA/SYSDBA@localhost:5236 # 进入交互模式后执行 alter user SYSDBA identified by "SYSDBA"; - 登录时确保密码大小写与设置一致(如密码是
Sysdba,需输入SYSDBA/Sysdba)
- 确认初始化时的密码:若忘记,可通过
问题 3:插入中文数据后查询显示乱码
- 场景:插入
INSERT INTO STUDENT VALUES (3, '王五', 23);后,查询结果中 “王五” 显示为?? - 原因:
- 数据库字符集与客户端字符集不匹配;
- 初始化实例时未选择 UTF-8 字符集
- 解决步骤:
- 检查数据库字符集:
sql
(若结果是SELECT PARAM_NAME, PARAM_VALUE FROM V$DM_INI WHERE PARAM_NAME='CHARSET';1代表 GBK,0代表 UTF-8) - 若数据库是 GBK,客户端需设置编码:在 disql 中执行
SET NAMES GBK;,或在 JDBC 连接 URL 中添加characterEncoding=GBK - 若需永久改为 UTF-8,需重新初始化实例并指定
CHARSET=0
- 检查数据库字符集:
问题 4:JDBC 连接报错 “Connection refused: connect”
- 场景:Java 程序执行
DriverManager.getConnection()时提示连接被拒绝 - 原因:
- 数据库服务未启动;
- 端口未开放;
- 实例监听地址不是 0.0.0.0(仅允许本地连接)
- 解决步骤:
- 检查服务状态:
systemctl status DmServiceDMSERVER,若未启动则执行systemctl start DmServiceDMSERVER - 测试端口连通性:
telnet localhost 5236,若不通则开放端口:bash
运行
firewall-cmd --add-port=5236/tcp --permanent firewall-cmd --reload - 修改实例监听地址:编辑
dm.ini中的LISTENER_ADDRESS为0.0.0.0:5236,重启服务
- 检查服务状态:
问题 5:执行备份命令提示 “[-8002]: 权限不足”
- 场景:执行
dexp备份时提示权限错误 - 原因:
dexp工具需要操作系统用户对备份目录有读写权限 - 解决步骤:
- 确认备份文件存储目录的权限:
bash
运行
mkdir -p /opt/dm8/backup chown dmdba:dinstall /opt/dm8/backup # 达梦默认操作系统用户是dmdba - 使用
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年,随着信创产业的深入发展,掌握国产数据库技术将成为技术人员的核心竞争优势。无论你是刚入行的新人,还是希望转型的老兵,现在都是开始学习达梦数据库的最佳时机。
学习的道路从来不是孤军奋战。加入达梦技术社区,参与开源项目,与同行交流,在实践中不断成长。当你能够用达梦数据库支撑起一个关键业务系统时,你会发现,技术能力的提升带来的不仅是职业发展,更是参与国家核心技术建设的自豪感。
延伸阅读:
-
《达梦数据库架构解析》(达梦官方出品)
-
《深入理解达梦数据库存储引擎》(技术社区连载)
-
《从Oracle到达梦:迁移实战指南》(案例集)
互动讨论:
欢迎在评论区分享:
-
你在学习达梦数据库过程中遇到的最大挑战是什么?
-
你认为国产数据库未来最大的发展机会在哪里?
-
你最希望达梦数据库增加什么功能?
-
版权声明:本文为原创内容,采用CC BY-NC-SA 4.0协议共享,转载请注明出处。
更多推荐



所有评论(0)