达梦数据库(DM Database)是由武汉达梦数据库有限公司研发的一款国产数据库管理系统。
- 官网:达梦数据库管理系统DM8
- 技术社区 :达梦技术社区 | 达梦数据库
- 技术文档:SQL 语法 | 达梦技术文档
DM8是达梦公司在总结DM系列产品研发与应用经验的基础上,坚持开放创新、简洁实用的理念,推出的新一代自研数据库。DM8吸收借鉴当前先进新技术思想与主流数据库产品的优点,融合了分布式、弹性计算与云计算的优势,对灵活性、易用性、可靠性、高安全性等方面进行了大规模改进,多样化架构充分满足不同场景需求,支持超大规模并发事务处理和事务-分析混合型业务处理,动态分配计算资源,实现更精细化的资源利用、更低成本的投入。一个数据库,满足用户多种需求,让用户能更加专注于业务发展。
与其他数据库的比较
- 与Oracle的比较:达梦数据库在功能和性能上与Oracle等国际主流数据库相当,但在价格和售后服务方面具有优势,尤其在国产化替代项目中表现出色。
- 与MySQL的比较:相比之下,MySQL虽然在开源和社区支持方面有优势,但达梦数据库在事务处理和高并发支持方面更为强大,同时提供了更全面的企业级特性和支持服务。
安装参考:
https://www.kdocs.cn/l/cp9qqC228P4d
达梦数据库生态系统全景图
- 核心组件 :
- DM Server(核心数据库引擎)
- DM Manager(图形化管理工具)
- DM Studio(开发调试工具)
- 数据迁移工具(dexp/dimp、DTS)
- 高可用组件(数据守护、主备集群)
- 适用场景 :
- 事务处理(OLTP)、分析型(OLAP)、混合负载(HTAP)。
- 国产化替代场景(兼容Oracle语法)。
使用:
一、建表案例(DDL)
1. 基础建表
-- 达梦语法
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR2(50) NOT NULL,
salary NUMBER(10,2) CHECK (salary > 0),
hire_date DATE DEFAULT SYSDATE,
dept_id INT,
CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(id)
);
-- MySQL对比
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
salary DECIMAL(10,2) CHECK (salary > 0),
hire_date DATE DEFAULT CURRENT_DATE,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(id)
);
差异点:
- 达梦使用
VARCHAR2
(兼容Oracle),MySQL用VARCHAR
。 - 达梦默认日期函数为
SYSDATE
,MySQL为CURRENT_DATE
。 - 达梦支持显式命名约束(
CONSTRAINT fk_dept
),MySQL可省略。
2. 自增列实现
-- 达梦语法
CREATE TABLE products (
product_id INT IDENTITY(1,1) PRIMARY KEY,
product_name VARCHAR2(100)
);
-- MySQL对比
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100)
);
差异点:
- 达梦使用
IDENTITY
关键字,MySQL使用AUTO_INCREMENT
。 - 达梦可通过序列(Sequence)实现复杂自增逻辑。
二、DML操作
1. 插入数据
-- 达梦语法
INSERT INTO employees (id, name, salary) VALUES (1, '张三', 8000.00);
-- MySQL对比(语法一致)
INSERT INTO employees (id, name, salary) VALUES (1, '张三', 8000.00);
2. 更新数据
-- 达梦语法
UPDATE employees SET salary = salary * 1.1 WHERE dept_id = 10;
-- MySQL对比(语法一致)
UPDATE employees SET salary = salary * 1.1 WHERE dept_id = 10;
3. 删除数据
-- 达梦语法
DELETE FROM employees WHERE id = 1;
-- MySQL对比(语法一致)
DELETE FROM employees WHERE id = 1;
三、DQL操作
1. 分页查询
-- 达梦语法(ROWNUM)
SELECT * FROM (
SELECT A.*, ROWNUM RN
FROM employees A
WHERE ROWNUM <= 20
) WHERE RN > 10;
-- MySQL对比(LIMIT)
SELECT * FROM employees
ORDER BY id
LIMIT 10, 10; -- 跳过10行,取10行
2. 连接查询
-- 达梦特有:外连接操作符(*)
SELECT e.name, d.dept_name
FROM employees e, departments d
WHERE e.dept_id = d.id(+); -- (+)表示左外连接
-- MySQL标准语法
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;
与MySQL的关键差异
功能 | 达梦数据库 | MySQL |
数据类型 |
|
|
自增列 |
|
|
分页查询 |
|
|
字符串连接 | ` | |
事务隔离级别 | 默认 | 默认 |
存储过程语法 | 兼容Oracle PL/SQL | 自有语法,不兼容Oracle |
使用过程总结
1. 数据类型映射
- 达梦的
NUMBER
对应MySQL的DECIMAL
,避免直接使用FLOAT
。 - 达梦的
DATE
包含日期和时间,MySQL的DATE
仅含日期,需用DATETIME
替代。
2. SQL语法兼容性
- 大小写敏感:达梦默认区分大小写(需用双引号包裹),MySQL默认不区分。
- 分页逻辑:达梦需用
ROWNUM
子查询,MySQL直接使用LIMIT
。 - 空值处理:达梦用
NVL(expr1, expr2)
,MySQL用IFNULL(expr1, expr2)
。
3. 工具与命令
- 命令行工具:达梦用
disql
,MySQL用mysql
。 - 备份恢复:达梦用
dexp/dimp
,MySQL用mysqldump
。 - 执行计划:达梦用
EXPLAIN
,MySQL用EXPLAIN
,但输出格式不同。
4. 性能优化
- 索引优化:达梦支持函数索引,MySQL需避免在索引列使用函数。
- 绑定变量:达梦推荐使用绑定变量减少硬解析,MySQL自动优化更灵活。
- 事务控制:达梦默认提交需显式
COMMIT
,MySQL默认自动提交。
常见问题解决
- 自增列冲突
- 达梦需手动创建序列(Sequence)管理复杂自增逻辑,MySQL依赖表属性。
- 示例:
CREATE SEQUENCE seq_product_id START WITH 1 INCREMENT BY 1;
INSERT INTO products VALUES (seq_product_id.NEXTVAL, '商品A');
- 日期隐式转换错误
- 达梦需用
TO_DATE('2023-01-01', 'YYYY-MM-DD')
,MySQL直接支持'2023-01-01'
。
- 达梦需用
- 外键约束删除
- 达梦需显式添加
CASCADE CONSTRAINTS
:
- 达梦需显式添加
DROP TABLE employees CASCADE CONSTRAINTS;
总结
达梦数据库在语法和功能上更接近Oracle,适合需要高安全性、兼容国产化场景的用户。通过了解上述内容可以快速掌握达梦数据库的核心操作,并规避迁移或开发中的兼容性问题。
与MySQL相比,需重点关注以下差异:
- 数据类型:
VARCHAR2
↔VARCHAR
,NUMBER
↔DECIMAL
。 - 分页语法:
ROWNUM
↔LIMIT
。 - 自增列:
IDENTITY
↔AUTO_INCREMENT
。 - 事务与锁:默认隔离级别不同,需根据业务调整。
工具使用详解
- DM Manager:
- 图形化创建表、用户、监控性能。
- 导入/导出数据(支持CSV、Excel)。
- disql命令行:
- 连接语法、脚本执行(
@script.sql
)。 - 格式化输出(
SET LINESIZE
,SET PAGESIZE
)。
- 连接语法、脚本执行(
- 监控工具:
- 动态视图(
V$SESSION
,V$SYSTEM_EVENT
)。 - 性能监控面板(DM Studio)。
- 动态视图(
安全与权限管理
- 用户与角色:
-- 创建角色并授权
CREATE ROLE analyst;
GRANT SELECT ON employees TO analyst;
-- 分配角色给用户
GRANT analyst TO user_zhangsan;
- 三权分立模式:
- 启用三权分立(
ENABLE_TRIPLE=Y
),分离系统管理员、安全管理员、审计管理员权限。
- 启用三权分立(
- 数据加密:
- 透明加密表空间:
CREATE TABLESPACE encrypted_ts DATAFILE '/dmdata/encrypted_ts.dbf' ENCRYPT;
性能优化与监控
- 关键优化手段:
- 索引优化:
-- 创建组合索引
CREATE INDEX idx_emp_dept_salary ON employees(dept_id, salary);
-
- 参数调优:
- 修改
dm.ini
中的MEMORY_TARGET
(内存自动管理)。 - 调整
FAST_POOL_PAGES
(快速缓存池大小)。
- 修改
- 参数调优:
- 监控命令:
-- 查看当前会话
SELECT * FROM V$SESSION;
-- 查看慢查询
SELECT * FROM V$SYSTEM_LONG_EXEC_SQLS;
迁移与兼容性指南
- 从MySQL迁移:
- 使用
dmsql
工具转换SQL语法(如LIMIT
转ROWNUM
)。 - 数据迁移工具:
dexp
(导出) +dimp
(导入)。
- 使用
- 兼容模式:
- 启用Oracle兼容模式(
COMPATIBLE_MODE=1
):
- 启用Oracle兼容模式(
# 修改dm.ini
COMPATIBLE_MODE = 1