达梦数据库 (Dameng DB / DM8) 全方位指南:部署、运维、开发与核心功能#
达梦数据库 (DM) 是中国自主研发的高性能关系型数据库管理系统,广泛应用于国内政府、金融、能源等关键领域。它在架构设计、SQL 语法和使用习惯上高度兼容 Oracle,是“去 IOE"(特别是去 Oracle)国产化替代的首选方案之一。
1. 部署与安装#
达梦数据库通常提供图形化安装界面(类似 Oracle OUI),也支持静默安装。
1.1 环境准备 (Linux)#
达梦对操作系统内核参数有一定要求,且不建议使用 root 用户直接运行数据库,需创建专用用户。
# 1. 创建用户和组
groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
# 2. 修改系统限制 ( limits.conf )
# 编辑 /etc/security/limits.conf,添加:
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft nproc 10240
dmdba hard nproc 10240
# 3. 上传安装包并解压
# 假设安装包为 dm8_202xxxx_x86_rh6_64.iso
mount -o loop dm8_202xxxx_x86_rh6_64.iso /mnt
cp -r /mnt /home/dmdba/dm_install
chown -R dmdba:dinstall /home/dmdba/dm_install
# 4. 切换用户
su - dmdba1.2 图形化安装 (推荐)#
# 在 dmdba 用户下执行
cd /home/dmdba/dm_install
./DMInstall.bin
# 后续步骤:
# 1. 选择语言 (中文/英文)
# 2. 选择 Key 文件 (试用版可跳过)
# 3. 选择时区
# 4. 选择安装类型 (典型/服务器/客户端/自定义)
# 5. 选择安装路径 (例如 /dm8)
# 6. 执行安装脚本 (最后会提示用 root 执行 root.sh)安装完成后,需切换回 root 执行脚本:
sudo /dm8/script/root/root_install.sh1.3 初始化实例 (DINIT)#
安装软件后,需要初始化数据库实例。
# 使用图形化助手
cd /dm8/tool
./dbca.sh
# 或使用命令行初始化 (推荐生产环境脚本化)
cd /dm8/bin
./dminit PATH=/dm8/data PAGE_SIZE=16 CASE_SENSITIVE=1 CHARSET=1 LOG_SIZE=2048 EXTENT_SIZE=32
# 参数说明:
# PAGE_SIZE=16: 页大小 16K (默认,适合 OLTP)
# CASE_SENSITIVE=1: 大小写敏感 (兼容 Oracle 习惯,建议设为 1)
# CHARSET=1: UTF-81.4 注册服务并启动#
# 注册服务 (root 用户执行)
cd /dm8/script/root
./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DAMENG/dm.ini -p DMSERVER
# 启动服务
sudo systemctl start DmServiceDMSERVER
sudo systemctl enable DmServiceDMSERVER
# 检查状态
sudo systemctl status DmServiceDMSERVER1.5 关键配置文件#
dm.ini: 主配置文件 (类似postgresql.conf或oracle spfile),控制内存、端口、路径等。dm_service.conf: 服务启动参数。dm_hba.conf: 访问控制列表 (类似pg_hba.conf),控制 IP 和用户访问权限。
2. 日常使用命令 (增删改查)#
达梦兼容 Oracle 语法,客户端工具为 disql (类似 sqlplus)。
2.1 连接数据库#
# 本地连接
./disql SYSDBA/SYSDBA
# 远程连接 (IP:Port)
./disql SYSDBA/SYSDBA@192.168.1.50:52362.2 基础 CRUD 操作#
达梦 SQL 语法与 Oracle 高度一致。
创建 (Create)#
-- 创建表空间 (达梦推荐先建表空间)
CREATE TABLESPACE MAIN_TS DATAFILE '/dm8/data/DAMENG/MAIN_TS.DBF' SIZE 1024 AUTOEXTEND ON;
-- 创建用户并指定表空间
CREATE USER TEST_USER IDENTIFIED BY "Password123" DEFAULT TABLESPACE MAIN_TS;
GRANT RESOURCE, PUBLIC TO TEST_USER;
-- 切换用户
CONN TEST_USER/"Password123";
-- 创建表
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(50) NOT NULL,
salary NUMBER(10, 2),
hire_date DATE DEFAULT SYSDATE,
status CHAR(1) DEFAULT 'A'
);
-- 创建序列 (Oracle 风格)
CREATE SEQ_EMP_ID START WITH 1 INCREMENT BY 1;插入 (Insert)#
-- 使用序列插入
INSERT INTO employees (emp_id, emp_name, salary)
VALUES (SEQ_EMP_ID.NEXTVAL, 'Alice', 8000.00);
-- 批量插入
INSERT ALL
INTO employees (emp_id, emp_name, salary) VALUES (SEQ_EMP_ID.NEXTVAL, 'Bob', 7500)
INTO employees (emp_id, emp_name, salary) VALUES (SEQ_EMP_ID.NEXTVAL, 'Charlie', 8200)
SELECT 1 FROM DUAL;查询 (Select)#
-- 基本查询
SELECT * FROM employees WHERE emp_id = 1;
-- 分页查询 (Oracle 风格 ROWNUM 或达梦特有 OFFSET)
-- 方式 1: OFFSET (推荐,兼容 PG/MySQL)
SELECT emp_name, salary FROM employees ORDER BY salary DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
-- 方式 2: ROWNUM (传统 Oracle 风格)
SELECT * FROM (SELECT t.*, ROWNUM rn FROM employees t WHERE ROWNUM <= 10) WHERE rn > 0;
-- 日期函数
SELECT emp_name, TO_CHAR(hire_date, 'YYYY-MM-DD HH24:MI:SS') as hire_time FROM employees;
-- 空值处理 (NVL)
SELECT emp_name, NVL(salary, 0) as real_salary FROM employees;更新 (Update) & 删除 (Delete)#
-- 更新
UPDATE employees SET salary = salary * 1.1 WHERE emp_name = 'Alice';
-- 删除
DELETE FROM employees WHERE emp_id = 1;
-- 清空表 (TRUNCATE)
TRUNCATE TABLE employees;3. 运维与研发常用命令#
3.1 运维人员 (DBA) 常用命令#
| 场景 | 命令/SQL | 说明 |
|---|---|---|
| 查看实例状态 | SELECT STATUS$ FROM V$INSTANCE; | 检查实例是否 OPEN |
| 查看会话 | SELECT SESS_ID, SQL_TEXT FROM V$SESSIONS; | 类似 pg_stat_activity |
| 杀掉会话 | SP_CLOSE_SESSION(SESS_ID); | 终止指定会话 |
| 查看锁 | SELECT * FROM V$LOCK; | 诊断死锁 |
| 表空间使用 | SELECT TABLESPACE_NAME, TOTAL_SIZE, FREE_SIZE FROM DBA_TABLESPACES; | 监控空间 |
| 手动备份 | BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' TO "BACKUP_FILE" BACKUPSET '/dm8/backup/FullBackup'; | 物理全备 |
| 归档日志 | ALTER DATABASE ARCHIVELOG; | 开启归档模式 (必需) |
| 查看参数 | SELECT * FROM V$PARAMETER WHERE NAME LIKE '%buffer%'; | 检查运行时参数 |
| 重建索引 | ALTER INDEX idx_name REBUILD; | 整理索引碎片 |
| 统计信息 | DBMS_STATS.GATHER_SCHEMA_STATS('TEST_USER'); | 收集统计信息优化执行计划 |
| DSC 集群状态 | SELECT * FROM V$DSC_EP; | 查看达梦共享存储集群节点状态 |
3.2 研发人员 (Dev) 常用命令#
| 场景 | 命令/SQL | 说明 |
|---|---|---|
| 执行计划 | EXPLAIN SELECT ...; 或 SET EXPLAIN ON; | 查看查询代价和路径 |
| 序列操作 | SELECT SEQ_NAME.CURRVAL FROM DUAL; | 获取当前值 |
| 伪表 | SELECT SYSDATE FROM DUAL; | 达梦完全兼容 Oracle 的 DUAL 表 |
| Hint 提示 | SELECT /*+ INDEX(emp idx_emp_name) */ * FROM emp; | 强制使用索引 |
| 包管理 | CREATE OR REPLACE PACKAGE ... | 支持存储过程包 (Package) |
| 物化视图 | CREATE MATERIALIZED VIEW ... REFRESH FAST ON COMMIT; | 支持预计算结果集 |
| XML/JSON | SELECT EXTRACTVALUE(...), JSON_VALUE(...) FROM ... | 支持半结构化数据查询 |
4. 核心自带功能讲解#
4.1 高度 Oracle 兼容性#
这是达梦最大的卖点。
- 语法兼容: 支持 PL/SQL、包 (Package)、触发器、序列 (Sequence)、同义词 (Synonym)、伪列 (ROWNUM, LEVEL)、DUAL 表等。
- 数据类型:
VARCHAR2,NUMBER,DATE,CLOB,BLOB等与 Oracle 一致。 - 驱动兼容: 提供 JDBC 驱动 (
DmJdbcDriver),应用层修改极少即可迁移。
4.2 四大高可用解决方案#
达梦提供完整的 HA 体系,对标 Oracle RAC 和 Data Guard:
- 数据守护 (Data Watch): 主备架构,类似 Oracle DG。支持实时同步、异步同步,自动故障切换。
- 共享存储集群 (DSC): 类似 Oracle RAC。多节点共享同一份存储数据,提供高可用和负载均衡(需共享存储硬件支持)。
- 读写分离集群 (MPP): 类似 Greenplum/Oracle Exadata。数据分片分布,适合海量数据分析。
- 实时同步 (DTS): 异构或同构数据库之间的数据同步工具。
4.3 存储架构#
- 页式存储: 默认页大小 8K/16K/32K。
- 表空间管理: 严格区分系统表空间、回滚表空间、临时表空间和用户表空间。
- 重做日志 (Redo Log): 循环写入,保证事务持久性。
- 归档日志: 开启后配合数据守护实现容灾。
4.4 安全特性 (等保合规)#
达梦在安全性上做了大量增强,满足国内等级保护要求:
- 三权分立: 默认将权限拆分为 数据库管理员 (DBA)、安全审计员 (AUDITOR)、安全管理员 (SSO),互相制约。
- 强制访问控制 (MAC): 基于标签的安全策略,防止越权访问。
- 透明加密 (TDE): 对数据文件、日志文件进行加密,防止文件被盗后数据泄露。
- 审计功能: 细粒度记录用户操作,支持审计日志分析。
4.5 工具生态#
- DM Manager: 图形化管理工具 (类似 PL/SQL Developer 或 Navicat)。
- DTS (Data Transformation Service): 数据迁移工具,支持从 Oracle/MySQL/SQL Server 迁移到达梦。
- DIsql: 命令行工具。
- Console: 监控控制台。
5. 注意事项与最佳实践#
5.1 迁移注意事项 (Oracle -> DM)#
- 大小写敏感: 初始化实例时
CASE_SENSITIVE=1非常重要。如果 Oracle 是大小写不敏感,而 DM 设为敏感,可能导致应用报错(如 SQL 中表名未加引号)。建议新建实例时尽量与源库保持一致,或通过LOWER/UPPER函数调整应用代码。 - 空字符串与 NULL: Oracle 中空字符串
''等同于NULL。达梦默认模式下''是空字符串,不等于NULL。若需完全兼容 Oracle,需在dm.ini中设置COMPATIBLE_MODE=4(Oracle 兼容模式)。 - 保留字冲突: 达梦可能有不同的保留字,迁移时需检查表名和字段名。
5.2 性能优化#
- 内存配置: 达梦非常依赖内存。需在
dm.ini中合理配置MEMORY_TARGET(目标内存) 和BUFFER(缓冲池)。通常建议占物理内存的 60%-80%。 - 排序区: 调整
SORT_BLK_SIZE和SORT_BUF_SIZE以优化大表排序和 Join 操作。 - 执行计划稳定性: 对于核心 SQL,如果统计信息变化导致执行计划波动,可使用 Outline (执行计划绑定) 功能固定计划。
- 避免全表扫描: 达梦优化器虽强,但在大表上仍需依赖正确的索引。注意复合索引的最左前缀原则。
5.3 运维规范#
- 定期巡检: 使用
dm_monitor脚本或图形化工具定期检查表空间使用率、归档日志堆积情况、备份有效性。 - 备份策略:
- 每周一次全量物理备份。
- 每天一次增量备份。
- 实时归档日志备份。
- 务必定期演练恢复流程。
- 日志管理: 监控
dm_log和sql_log,及时清理过期日志防止磁盘爆满。
5.4 常见陷阱#
- ** License 过期**: 试用版 License 有过期时间,生产环境务必申请正式永久 License,否则数据库会停止服务。
- 字符集问题: 初始化实例后字符集无法修改。若应用涉及多语言,务必在安装时选择
UTF-8(CHARSET=1)。 - 连接数限制: 默认连接数可能较小,需根据并发量调整
MAX_SESSIONS参数。 - 事务未提交: 达梦(同 Oracle)默认非自动提交。开发时需显式
COMMIT,否则长事务会导致回滚段膨胀,影响性能。
5.5 监控建议#
- 核心指标: CPU 使用率、内存使用率、IOPS、活跃会话数、死锁次数、缓冲区命中率。
- 工具: 达梦自带的监控控制台、Prometheus (需配置 Exporter) 或第三方国产监控平台 (如云智慧、听云等,通常已适配达梦)。
达梦数据库作为国产数据库的领军者,其核心优势在于对 Oracle 生态的无缝承接和自主可控的安全性。对于从 Oracle 迁移过来的团队,学习成本相对较低,但需特别注意初始化参数的选择(尤其是大小写敏感和兼容模式)以及国产化环境下的运维规范。