达梦数据库 (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 - dmdba

1.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.sh

1.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-8

1.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 DmServiceDMSERVER

1.5 关键配置文件#

  • dm.ini: 主配置文件 (类似 postgresql.conforacle 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:5236

2.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/JSONSELECT 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:

  1. 数据守护 (Data Watch): 主备架构,类似 Oracle DG。支持实时同步、异步同步,自动故障切换。
  2. 共享存储集群 (DSC): 类似 Oracle RAC。多节点共享同一份存储数据,提供高可用和负载均衡(需共享存储硬件支持)。
  3. 读写分离集群 (MPP): 类似 Greenplum/Oracle Exadata。数据分片分布,适合海量数据分析。
  4. 实时同步 (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_SIZESORT_BUF_SIZE 以优化大表排序和 Join 操作。
  • 执行计划稳定性: 对于核心 SQL,如果统计信息变化导致执行计划波动,可使用 Outline (执行计划绑定) 功能固定计划。
  • 避免全表扫描: 达梦优化器虽强,但在大表上仍需依赖正确的索引。注意复合索引的最左前缀原则。

5.3 运维规范#

  • 定期巡检: 使用 dm_monitor 脚本或图形化工具定期检查表空间使用率、归档日志堆积情况、备份有效性。
  • 备份策略:
    • 每周一次全量物理备份。
    • 每天一次增量备份。
    • 实时归档日志备份。
    • 务必定期演练恢复流程
  • 日志管理: 监控 dm_logsql_log,及时清理过期日志防止磁盘爆满。

5.4 常见陷阱#

  • ** License 过期**: 试用版 License 有过期时间,生产环境务必申请正式永久 License,否则数据库会停止服务。
  • 字符集问题: 初始化实例后字符集无法修改。若应用涉及多语言,务必在安装时选择 UTF-8 (CHARSET=1)。
  • 连接数限制: 默认连接数可能较小,需根据并发量调整 MAX_SESSIONS 参数。
  • 事务未提交: 达梦(同 Oracle)默认非自动提交。开发时需显式 COMMIT,否则长事务会导致回滚段膨胀,影响性能。

5.5 监控建议#

  • 核心指标: CPU 使用率、内存使用率、IOPS、活跃会话数、死锁次数、缓冲区命中率。
  • 工具: 达梦自带的监控控制台、Prometheus (需配置 Exporter) 或第三方国产监控平台 (如云智慧、听云等,通常已适配达梦)。

达梦数据库作为国产数据库的领军者,其核心优势在于对 Oracle 生态的无缝承接自主可控的安全性。对于从 Oracle 迁移过来的团队,学习成本相对较低,但需特别注意初始化参数的选择(尤其是大小写敏感和兼容模式)以及国产化环境下的运维规范。