达梦数据库面试高频问题汇总
达梦数据库的面试,都问些什么?
这些问题,你能答上来几个?
今天我们把达梦面试的高频问题一网打尽。
基础认知类
Q1:达梦数据库是什么?有什么特点?
参考答案:
达梦数据库(DM)是武汉达梦公司自主研发的国产关系型数据库,与 Oracle 高度兼容。
核心特点:
- Oracle 兼容性高:语法、PL/SQL、存储过程几乎可以无缝迁移
- 完全自主研发:拥有完整知识产权,满足信创要求
- 国密支持:内置国密算法,支持数据加密
- 高可用方案完善:数据守护、读写分离、MPP 集群等
Q2:达梦和 Oracle 的兼容性体现在哪些方面?
参考答案:
| 兼容性维度 | 说明 |
|---|---|
| SQL 语法 | DDL、DML 语法高度一致 |
| PL/SQL | 存储过程、函数、包、触发器兼容 |
| 数据类型 | NUMBER、VARCHAR2、DATE 等兼容 |
| 系统视图 | 核心视图名称一致 |
| 索引类型 | BTREE、HASH、BITMAP 等 |
Q3:达梦数据库有哪些版本?如何选择?
参考答案:
| 版本 | 适用场景 | 特点 |
|---|---|---|
| 标准版 | 中小型企业 | 单机部署,基本功能 |
| 企业版 | 大型企业 | 支持集群、高可用 |
| 安全版 | 政府、金融 | 国密算法、等保认证 |
| MPP 版 | 数据仓库 | 大规模并行处理 |
架构与原理类
Q4:达梦的物理结构有哪些组件?
参考答案:
达梦的物理结构包括三大组件:
- 数据文件(.dbf):存储表、索引等业务数据
- 日志文件(.log):记录所有数据修改,保证事务的持久性
- 控制文件(.ctl):记录数据库的元信息,是启动的关键
Q5:达梦的逻辑结构是什么?
参考答案:
表空间(Tablespace)
│
├── 段(Segment)
│ │
│ └── 区(Extent)
│ │
│ └── 页(Page)
│ │
│ └── 行(Row)- 页(Page):最小存储单元,默认 8KB
- 区(Extent):16 个连续页组成
- 段(Segment):表或索引的存储容器
- 表空间(Tablespace):管理多个数据文件
Q6:堆表和 HTSP 的区别?
参考答案:
| 特性 | 堆表 | HTSP(索引组织表) |
|---|---|---|
| 数据存储 | 无序堆放 | 按主键有序 |
| 主键查询 | 需回表 | 直接定位 |
| 插入性能 | 快(追加末尾) | 慢(需维护有序) |
| 空间使用 | 可能碎片化 | 紧凑 |
适用场景:
- 堆表:OLTP 场景,频繁插入
- HTSP:查询为主,主键查询频繁
事务与并发类
Q7:达梦默认的隔离级别是什么?
参考答案:
达梦默认使用 READ COMMITTED 隔离级别,与 Oracle 一致。
这个级别下:
- 事务只能看到其他事务已提交的数据
- 每次 SELECT 语句都会创建新的快照
- 不会出现脏读,但可能出现不可重复读
Q8:什么是 MVCC?达梦如何实现?
参考答案:
MVCC(Multi-Version Concurrency Control)让读写操作互不阻塞。
实现机制:
- 每行数据带有隐藏列:TRX_ID(事务ID)和 ROLL_PTR(回滚指针)
- 修改数据时,在 Undo 段保存旧版本
- 读取时根据 ReadView 决定读取哪个版本
优势:
- 读操作不阻塞写操作
- 写操作不阻塞读操作
- 并发性能大幅提升
Q9:什么是死锁?如何避免?
参考答案:
死锁是多个事务相互等待对方持有的锁,形成循环等待。
经典场景:
事务 A 锁定行 1,等待行 2
事务 B 锁定行 2,等待行 1避免方法:
- 统一操作顺序:所有事务按相同顺序访问资源
- 减少锁持有时间:尽快提交事务
- 降低隔离级别:减少锁的范围
- 分段批量操作:避免长时间锁表
Q10:两阶段提交是什么?
参考答案:
两阶段提交(2PC)用于分布式事务,保证跨节点数据一致性。
流程:
第一阶段(投票):
协调者询问所有参与者:「准备好了吗?」
参与者执行预提交,返回「可以提交」或「不能提交」
第二阶段(提交):
如果所有人都说「可以」:协调者发送「提交」指令
如果有人「不能」:协调者发送「回滚」指令局限:
- 协调者单点故障可能导致事务悬空
- 参与者等待时会阻塞
高可用类
Q11:达梦的数据守护是什么?
参考答案:
数据守护是达梦的高可用解决方案,类似于 Oracle Data Guard。
架构:
- 主库(Primary):接收所有 DML/DDL 操作
- 备库(Standby):接收主库日志并应用
- 监视器(Monitor):监控状态,触发自动切换
同步模式:
| 模式 | 说明 | 数据安全 |
|---|---|---|
| 同步(SYNC) | 等待备库确认后提交 | 最高 |
| 即时生效(TIMELY) | 有超时机制 | 较高 |
| 异步(ASYNC) | 不等待确认 | 可能有少量丢失 |
Q12:读写分离集群的原理?
参考答案:
读写分离通过 DMRDRS 代理实现:
应用 → DMRDRS(读写分离代理) → 主库(写)
→ 备库(读)路由规则:
- INSERT/UPDATE/DELETE → 主库
- SELECT(普通查询)→ 备库
- SELECT FOR UPDATE → 主库(避免读到未提交数据)
适用场景:
- 查询压力大的 OLTP 系统
- 允许一定读写延迟的业务
Q13:MPP 和普通集群有什么区别?
参考答案:
| 特性 | 普通集群 | MPP 集群 |
|---|---|---|
| 定位 | 高可用 | 大规模并行处理 |
| 数据分布 | 主备复制 | 分片分布 |
| 查询方式 | 单节点执行 | 多节点并行 |
| 适用场景 | OLTP | OLAP/数据仓库 |
| 数据量 | TB 级 | PB 级 |
MPP 核心概念:
- 协调节点:接收查询,分发任务
- 执行节点:实际存储和计算
- 数据分布键:决定数据分片策略
索引与性能类
Q14:达梦有哪些索引类型?
参考答案:
| 索引类型 | 适用场景 |
|---|---|
| BTREE | 默认索引,范围查询、排序 |
| HASH | 等值查询,高选择性列 |
| BITMAP | 低基数列,组合查询 |
| 全文索引 | 文本内容搜索 |
Q15:什么是最左前缀原则?
参考答案:
联合索引 (A, B, C) 可以支持的查询组合:
- ✅
WHERE A = ? - ✅
WHERE A = ? AND B = ? - ✅
WHERE A = ? AND B = ? AND C = ? - ❌
WHERE B = ? - ❌
WHERE C = ?
设计原则:
- 区分度高的列放前面
- 查询频率高的列放前面
- 避免在低区分度列上建索引
Q16:分区表有什么用?
参考答案:
分区将大表拆成多个小表,提升查询和维护效率。
分区类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| RANGE | 按范围 | 按日期、按金额 |
| LIST | 按枚举 | 按地区、按状态 |
| HASH | 哈希均匀分布 | 无法按业务分区时 |
| 组合 | 混合分区 | RANGE + LIST |
核心价值:
- 查询时只扫描相关分区(分区裁剪)
- 可以单独管理某个分区
- 支持并行操作
安全与运维类
Q17:如何进行数据备份?
参考答案:
| 备份类型 | 说明 |
|---|---|
| 物理备份 | 复制数据文件,效率高 |
| 逻辑备份 | 导出 SQL/数据,兼容性好 |
| 全量备份 | 备份所有数据 |
| 增量备份 | 备份变化数据 |
常用命令:
bash
# 物理全量备份
./dmrman BACKUP DATABASE FULL
# 物理增量备份
./dmrman BACKUP DATABASE INCREMENT
# 逻辑导出
./dexp SYSDBA/SYSDBA FILE=exp.dmpQ18:如何分析 SQL 性能?
参考答案:
第一步:查看执行计划
sql
EXPLAIN SELECT * FROM T_ORDER WHERE STATUS = 'COMPLETED';第二步:识别问题
- TABLE FULL SCAN → 全表扫描(需优化)
- INDEX UNIQUE SCAN → 唯一索引(好)
第三步:常见优化
- 添加合适的索引
- 避免 SELECT *
- 使用绑定变量
- 避免函数和运算
迁移类
Q19:Oracle 迁移到达梦需要注意什么?
参考答案:
| 注意点 | 说明 |
|---|---|
| 数据类型 | VARCHAR2 → VARCHAR(可选) |
| 分页语法 | ROWNUM → LIMIT/OFFSET |
| 自增主键 | SEQUENCE → 达梦 IDENTITY 或序列 |
| 特定包 | DBMS_* 包的兼容性 |
| 高级特性 | Oracle 特有功能需评估替代方案 |
迁移步骤:
- 兼容性分析
- 语法转换
- 存储过程迁移
- 数据迁移
- 功能测试
- 性能测试
Q20:如何验证迁移数据完整性?
参考答案:
记录数对比:
sql
SELECT COUNT(*) FROM T_EMPLOYEE; -- 源库和目标库对比数据抽样对比:
sql
-- 找出不一致的记录
SELECT ID, NAME FROM T_EMPLOYEE
MINUS
SELECT ID, NAME FROM T_EMPLOYEE@ORACLE;关键指标验证:
sql
SELECT SUM(AMOUNT) FROM T_ORDER; -- 业务关键数据
SELECT MAX(UPDATE_TIME) FROM T_ORDER; -- 最新更新时间面试技巧
回答问题框架
技术原理类问题:
1. 是什么?(给出定义)
2. 为什么?(解决什么问题)
3. 怎么用?(关键步骤或代码)
4. 注意点?(常见误区或最佳实践)对比类问题:
1. A 是什么,解决什么问题
2. B 是什么,解决什么问题
3. 两者区别(表格对比)
4. 选择建议(什么场景用什么)加分回答
面试中除了回答问题本身,适当展示:
- 实战经验:在项目中实际使用过
- 问题排查:遇到过什么问题,如何解决
- 深入原理:不仅会用,还知道底层机制
- 最佳实践:总结出自己的经验
写在最后
达梦数据库的面试,既考察基础知识,也看重实战经验。
记住:原理是基础,应用是关键。
把本文的问题理解透彻,面试就不再是难题。
加油!
