Skip to content

达梦数据库面试高频问题汇总

达梦数据库的面试,都问些什么?

这些问题,你能答上来几个?

今天我们把达梦面试的高频问题一网打尽。

基础认知类

Q1:达梦数据库是什么?有什么特点?

参考答案:

达梦数据库(DM)是武汉达梦公司自主研发的国产关系型数据库,与 Oracle 高度兼容。

核心特点:

  • Oracle 兼容性高:语法、PL/SQL、存储过程几乎可以无缝迁移
  • 完全自主研发:拥有完整知识产权,满足信创要求
  • 国密支持:内置国密算法,支持数据加密
  • 高可用方案完善:数据守护、读写分离、MPP 集群等

Q2:达梦和 Oracle 的兼容性体现在哪些方面?

参考答案:

兼容性维度说明
SQL 语法DDL、DML 语法高度一致
PL/SQL存储过程、函数、包、触发器兼容
数据类型NUMBER、VARCHAR2、DATE 等兼容
系统视图核心视图名称一致
索引类型BTREE、HASH、BITMAP 等

Q3:达梦数据库有哪些版本?如何选择?

参考答案:

版本适用场景特点
标准版中小型企业单机部署,基本功能
企业版大型企业支持集群、高可用
安全版政府、金融国密算法、等保认证
MPP 版数据仓库大规模并行处理

架构与原理类

Q4:达梦的物理结构有哪些组件?

参考答案:

达梦的物理结构包括三大组件:

  1. 数据文件(.dbf):存储表、索引等业务数据
  2. 日志文件(.log):记录所有数据修改,保证事务的持久性
  3. 控制文件(.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)让读写操作互不阻塞。

实现机制:

  1. 每行数据带有隐藏列:TRX_ID(事务ID)和 ROLL_PTR(回滚指针)
  2. 修改数据时,在 Undo 段保存旧版本
  3. 读取时根据 ReadView 决定读取哪个版本

优势:

  • 读操作不阻塞写操作
  • 写操作不阻塞读操作
  • 并发性能大幅提升

Q9:什么是死锁?如何避免?

参考答案:

死锁是多个事务相互等待对方持有的锁,形成循环等待。

经典场景:

事务 A 锁定行 1,等待行 2
事务 B 锁定行 2,等待行 1

避免方法:

  1. 统一操作顺序:所有事务按相同顺序访问资源
  2. 减少锁持有时间:尽快提交事务
  3. 降低隔离级别:减少锁的范围
  4. 分段批量操作:避免长时间锁表

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 集群
定位高可用大规模并行处理
数据分布主备复制分片分布
查询方式单节点执行多节点并行
适用场景OLTPOLAP/数据仓库
数据量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.dmp

Q18:如何分析 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 特有功能需评估替代方案

迁移步骤:

  1. 兼容性分析
  2. 语法转换
  3. 存储过程迁移
  4. 数据迁移
  5. 功能测试
  6. 性能测试

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. 选择建议(什么场景用什么)

加分回答

面试中除了回答问题本身,适当展示:

  1. 实战经验:在项目中实际使用过
  2. 问题排查:遇到过什么问题,如何解决
  3. 深入原理:不仅会用,还知道底层机制
  4. 最佳实践:总结出自己的经验

写在最后

达梦数据库的面试,既考察基础知识,也看重实战经验。

记住:原理是基础,应用是关键

把本文的问题理解透彻,面试就不再是难题。

加油!

基于 VitePress 构建