达梦数据库 DCA 认证培训学习笔记
DCA(达梦认证管理员) 是达梦数据库针对国产数据库从业者设立的初级认证,主要考察数据库基本操作与管理能力。本文为系统培训的知识整理,涵盖公司背景、数据库理论、安装部署、实例管理、SQL 应用等核心模块。
目录
- 达梦公司概况与认证体系
- 数据库理论基础
- 数据库架构演进与分类
- 达梦企业版安装与目录结构
- 数据库实例管理
- 逻辑存储结构与表空间管理
- 用户、安全与权限管理
- 表结构与 SQL 语言基础
- SQL 查询与高级应用
- 索引、视图与数据库对象
- 逻辑备份与还原
- PL/SQL 程序开发
- ODBC 与 Python 驱动配置
一、达梦公司概况与认证体系
1.1 公司背景与核心技术
- 企业实力:达梦成立于 2000 年,拥有六大研发中心(北京、上海等),持有专利超 320 项及软件著作权 370 余项,具备全栈产品自主知识产权。
- 业务范围:提供覆盖数据全生命周期的产品与解决方案,深度服务于金融、能源、电力、通信等关键行业。
1.2 产品矩阵与技术生态
- 核心数据库产品:涵盖关系型数据库(DM8)、共享存储集群(DSC)、读写分离集群(DMRWC)、数据守护集群(DataWatch)及分布式计算集群(DPC)。
- 多模数据库支持:除关系型外,还提供图数据库(楚天梦图)、缓存数据库(对标 Redis)、文档数据库(对标 MongoDB)、时序数据库(对标 TimescaleDB)等非关系型产品。
- 生态工具链:包含数据集成工具 DIS(ETL)、逻辑复制软件 DRS(OGG)、数据校验软件 DVS、融合管理平台 DFM 及开发者工具 SQLark/百灵连接。
1.3 认证体系与学习路径
| 认证级别 | 全称 | 定位 |
|---|---|---|
| DAE | 达梦助理工程师 | 零基础入门 |
| DCA | 达梦认证管理员 | 初级运维开发 |
| DCP | 达梦认证专家 | 中级架构师 |
| DCM | 达梦认证大师 | 高级顾问 |
考核通过后颁发工信部人才交流中心与达梦联合认证证书。
二、数据库理论基础
2.1 基本定义与组成要素
| 概念 | 定义 |
|---|---|
| 数据库(DB) | 存储在磁盘上的有组织的数据集合 |
| 数据库管理系统(DBMS) | 操作和管理数据库的大型软件 |
| 数据库系统(DBS) | 由硬件、软件和人构成的完整生态系统 |
数据管理发展史:人工管理阶段(20 世纪 50 年代中期前)→ 文件系统阶段(1955—1965 年)→ 数据库系统阶段。
2.2 事务特性(ACID)
事务是数据库的基本操作单元,必须满足以下四个特性:
| 特性 | 说明 |
|---|---|
| 原子性(Atomicity) | 事务内所有操作要么全部完成,要么全部不完成 |
| 一致性(Consistency) | 事务执行前后数据库必须保持一致性状态,如转账前后总金额不变 |
| 隔离性(Isolation) | 并发事务之间互不影响,一个事务看不到其他未提交事务的中间状态 |
| 持久性(Durability) | 事务一旦提交,对数据的更改即为永久性的 |
2.3 关系模型三要素
- 数据结构:二维表(关系)
- 数据操作:增、删、改、查
- 数据完整性约束:实体完整性、参照完整性、自定义完整性
2.4 表关联与实体关系
- 一对一:如人与身份证号
- 一对多:如科室与医生
- 多对多:如学生与课程
核心术语:元组代表行记录,属性代表字段/列,实体代表客观事物集合(如学生群体)。
三、数据库架构演进与分类
3.1 单机与主备架构
- 单机架构局限:部署集中但存在单点故障风险,只能纵向扩展,扩容需停机,通常仅用于测试环境。
- 主备架构改进:引入备库提升可用性,主库对外提供读写服务,备库仅作备份,但仍存在资源浪费和写压力集中的问题。
3.2 主从与多活架构
- 主从架构:适用于读多写少场景,从库分担读请求,支持故障自动切换,但无法解决写入瓶颈。
- 多活架构:
- 双向同步:可能存在数据不一致风险
- 共享存储:无数据一致性问题,但存储端可能成为性能瓶颈
3.3 分片与无共享架构
- 分片技术:将大表水平拆分到不同节点以应对海量数据和高并发,但涉及跨片查询和分布式事务处理。
- 存算一体:各节点角色对等。
- 存算分离:计算节点无状态,存储节点负责数据持久化,适合构建超大规模集群。
四、达梦企业版安装与目录结构
4.1 安装前环境准备
| 版本 | 适用场景 |
|---|---|
| 企业版 | 支持集群功能,生产首选 |
| 标准版 | 满足中小企业需求 |
| 安全版 | 增强安全特性 |
| 开发版 | 仅供学习测试(一年授权期) |
硬件最低要求:CPU 奔腾 4 以上,内存至少 4GB(推荐 8GB),临时空间需预留 3GB 以上。
操作系统兼容性:支持 Windows、Linux、Unix 及国产 OS;glibc 版本需 ≥ 2.28,内核版本需 ≥ 2.6。
4.2 图形化安装流程
- 用户权限规范:严禁使用 root 用户直接安装数据库,必须创建专用的
dmdba用户并赋予相应目录权限。 - DISPLAY 变量设置:远程图形化安装需正确设置 DISPLAY 变量,例如:
export DISPLAY=192.168.17.1:0.0 xhost + - 关键步骤:安装时需指定正确的安装目录、端口号及密码;安装完成后务必以 root 身份执行脚本注册辅助插件服务。
4.3 命令行交互式安装
./DMInstall.bin -i # 启动交互式安装,无需图形界面
按提示依次输入语言、时区、安装类型、安装路径等信息完成安装。
4.4 安装目录结构解析
| 目录 | 说明 |
|---|---|
bin/ |
存放可执行文件和动态链接库(.so),是数据库管理和客户端工具的核心位置 |
doc/ |
包含官方技术文档和使用说明,考试期间允许查阅 |
tool/ |
集成运维管理工具:Console(控制台)、Analysis(性能分析)、DTS(数据迁移)、Manager(管理工具) |
sample/ |
参数配置模板(dm.ini)、示例数据库脚本(bookshop、whr)及优化调整脚本 |
script/ |
服务注册与卸载脚本,需由 root 用户执行 |
五、数据库实例管理
5.1 核心概念
- 实例与数据库的关系:实例是由后台进程/线程及共享内存组成的运行实体;数据库是存储在磁盘上的物理文件集合。单机环境为一对一,共享存储集群(如 DSC)为一对多。
- 初始化参数:页大小(Page Size)、簇大小(Extent Size)、字符集等参数在数据库生命周期内不可修改,必须在建库时谨慎设定。
5.2 创建方式对比
| 工具 | 特点 | 注意事项 |
|---|---|---|
图形化工具(dbca) |
可视化操作,适合新手 | 需手动执行生成的脚本以注册服务 |
命令行工具(dminit) |
适合自动化部署,不依赖 GUI | 不会自动注册服务,不创建示例库,需后续手工补充 |
5.3 关键初始化参数
| 参数 | 说明 |
|---|---|
| 字符集 | GB18030:每个汉字 2 字节,节省空间;UTF-8:每个汉字 3 字节,通用性强 |
| 大小写敏感 | 开启后 table 和 TABLE 视为不同对象;迁移时源端与目标端必须保持一致 |
| 行尾空格填充 | 开启时 'A' 和 'A ' 视为不同字符串;关闭时忽略行尾空格(兼容 Oracle 行为) |
5.4 服务注册与启停管理
# 注册系统服务
dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /dm/data/DAMENG/dm.ini
# 系统服务方式管理(推荐)
systemctl start DmServiceDMSERVER
systemctl stop DmServiceDMSERVER
systemctl status DmServiceDMSERVER
⚠️ 重要原则:必须遵循"用什么方式启动就用什么方式停止",严禁交叉使用不同方式启停,否则可能导致服务异常。
四种启动方式:图形化、系统服务(推荐)、前台(dmserver 命令)、后台方式。
5.5 客户端连接工具
- Manager:图形化管理界面,考试和日常维护中最常用。
- disql:命令行工具,适合脚本自动化。
- 第三方工具:如 DBeaver 等。
当密码中包含特殊符号(如
@)时,连接字符串中必须使用双引号包裹密码,例如disql SYSDBA/"P@ssword"@localhost:5236。
5.6 数据库状态管理
Open ←→ Mount
Open ←→ Suspend
Mount ✗ Suspend(不能直接互切)
| 状态 | 说明 |
|---|---|
| Open | 正常运行状态,允许读写业务数据 |
| Mount | 配置状态,仅允许访问动态性能视图,不允许访问业务数据 |
| Suspend | 挂起状态(只读),事务提交会被阻塞 |
六、逻辑存储结构与表空间管理
6.1 逻辑体系结构
数据库 → 表空间 → 段 → 簇 → 页(最小 I/O 单元)
预定义表空间:
| 表空间 | 用途 |
|---|---|
| SYSTEM | 存放元数据(数据字典) |
| ROLL | 存放前镜像(回滚数据) |
| TEMP | 排序、临时计算 |
| MAIN | 用户默认表空间 |
6.2 表空间维护操作
-- 创建表空间
CREATE TABLESPACE "TEST_TS"
DATAFILE '/dm/data/DAMENG/test01.dbf' SIZE 128 AUTOEXTEND ON NEXT 32;
-- 扩容(增加数据文件)
ALTER TABLESPACE "TEST_TS"
ADD DATAFILE '/dm/data/DAMENG/test02.dbf' SIZE 128;
-- 表空间脱机(维护用)
ALTER TABLESPACE "TEST_TS" OFFLINE;
ALTER TABLESPACE "TEST_TS" ONLINE;
⚠️ 系统表空间(SYSTEM)禁止脱机;数据文件迁移必须在 Open 状态下先将表空间脱机,修改路径后再联机。
6.3 重做日志管理
| 模式 | 行为 |
|---|---|
| 非归档模式 | 日志文件循环覆盖,无法基于日志恢复 |
| 归档模式 | 日志覆盖前先备份,保证完整恢复能力 |
⚠️ 增加、重命名或迁移联机日志文件必须在 Mount 状态下进行,不能在 Open 状态下直接操作。
七、用户、安全与权限管理
7.1 模式(Schema)管理
- 达梦中,一个用户可拥有多个模式,但每个模式仅属于一个用户(一对多关系)。
- 不同模式下的对象名称允许重名,通过
模式名.对象名进行区分。
-- 查看所有模式
SELECT * FROM SYS.SYSOBJECTS WHERE TYPE$='SCH';
-- 切换当前模式
SET SCHEMA 模式名;
7.2 资源限制项(Profile)配置
-- 创建 Profile
CREATE PROFILE "SECURITY_PROFILE" LIMIT
PASSWORD_LIFE_TIME 90, -- 口令有效期(天)
GRACE_TIME 7, -- 宽限期(天)
FAILED_LOGIN_ATTEMPTS 5, -- 最大失败登录次数
PASSWORD_LOCK_TIME 1/24, -- 锁定时长(天,此处为1小时)
IDLE_TIME 30, -- 最大空闲时间(分钟)
SESSION_PER_USER 10; -- 最大并发会话数
-- 分配给用户
ALTER USER 用户名 PROFILE "SECURITY_PROFILE";
7.3 权限与角色体系
权限分类:
- 系统权限:DDL 操作(CREATE TABLE、DROP TABLE 等)
- 对象权限:DML 操作(SELECT、INSERT、UPDATE、DELETE 等)
-- 授权
GRANT SELECT, INSERT ON 模式名.表名 TO 用户名 WITH GRANT OPTION;
-- 回收权限
REVOKE SELECT ON 模式名.表名 FROM 用户名;
-- 创建角色并授予用户
CREATE ROLE "APP_ROLE";
GRANT SELECT ON 模式名.表名 TO "APP_ROLE";
GRANT "APP_ROLE" TO 用户名;
预定义角色:
| 角色 | 说明 |
|---|---|
| DBA | 超级管理员,拥有所有权限 |
| RESOURCE | 拥有创建数据库对象的权限 |
| PUBLIC | 所有用户默认拥有的公共权限 |
SYS 用户不可登录,仅存放数据字典。严禁随意删除系统预定义用户(SYSDBA、SYSAUDITOR、SYSSSO)。
7.4 用户生命周期管理
-- 创建用户
CREATE USER "APP_USER" IDENTIFIED BY "Password123"
DEFAULT TABLESPACE "MAIN"
DEFAULT INDEX TABLESPACE "MAIN"
PROFILE "SECURITY_PROFILE";
-- 锁定 / 解锁用户
ALTER USER "APP_USER" ACCOUNT LOCK;
ALTER USER "APP_USER" ACCOUNT UNLOCK;
-- 删除用户
DROP USER "APP_USER" CASCADE;
八、表结构与 SQL 语言基础
8.1 SQL 语言分类
| 分类 | 全称 | 代表语句 |
|---|---|---|
| DDL | 数据定义语言 | CREATE / ALTER / DROP |
| DML | 数据操纵语言 | INSERT / UPDATE / DELETE |
| DQL | 数据查询语言 | SELECT |
| DCL | 数据控制语言 | GRANT / REVOKE |
| TCL | 事务控制语言 | COMMIT / ROLLBACK |
8.2 达梦支持的表类型
| 类型 | 说明 |
|---|---|
| 堆表 | 数据无序存储,适合频繁 DML |
| 索引组织表(IOT) | 达梦默认表类型,数据按主键顺序存储 |
| 列存表 | 适合 OLAP 分析场景 |
| 外部表 | 映射外部文件,只读 |
| 临时表 | 会话或事务级临时数据 |
8.3 常用数据类型
| 分类 | 类型 | 说明 |
|---|---|---|
| 字符型 | CHAR(n) |
固定长度 |
| 字符型 | VARCHAR(n) |
可变长度 |
| 数值型 | NUMBER / DECIMAL(p,s) |
DECIMAL(10,2) 表示总长10位,小数占2位 |
| 日期时间 | DATE / TIMESTAMP |
— |
| 大字段 | BLOB / CLOB / TEXT |
不支持普通索引,只能建全文索引 |
| 布尔型 | BOOLEAN |
— |
8.4 表的七大约束
CREATE TABLE "EMPLOYEE" (
"EMP_ID" INT IDENTITY(1, 1), -- 自增约束
"EMP_NO" VARCHAR(20) NOT NULL UNIQUE, -- 非空 + 唯一约束
"EMP_NAME" VARCHAR(50) NOT NULL, -- 非空约束
"DEPT_ID" INT,
"SALARY" DECIMAL(10,2) DEFAULT 0.00 -- 默认值约束
CHECK ("SALARY" >= 0), -- 检查约束
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMP_ID"), -- 主键约束
CONSTRAINT "FK_DEPT" FOREIGN KEY ("DEPT_ID") -- 外键约束
REFERENCES "DEPT"("DEPT_ID")
);
| 约束 | 说明 |
|---|---|
| PRIMARY KEY | 不允许重复且不能为 NULL,每张表只能有一个主键 |
| FOREIGN KEY | 子表引用父表的主键或唯一键 |
| UNIQUE | 列值不能重复,但允许一个 NULL 值 |
| NOT NULL | 列值不允许为 NULL |
| CHECK | 限制列值满足指定条件表达式 |
| DEFAULT | 未指定列值时使用默认值填充 |
| IDENTITY | 由系统自动生成递增值 |
8.5 TRUNCATE 与 DELETE 的区别
| 对比项 | TRUNCATE | DELETE |
|---|---|---|
| 语言类型 | DDL | DML |
| 执行速度 | 极快 | 慢(逐行删除) |
| 日志量 | 少 | 大 |
| 回滚支持 | ❌ 不支持 | ✅ 支持 |
| 触发器 | ❌ 不触发 | ✅ 触发 |
| 自增序列 | ✅ 重置 | ❌ 不重置 |
| 条件过滤 | ❌ 不支持 | ✅ 支持 WHERE |
九、SQL 查询与高级应用
9.1 查询语句执行顺序
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
关键区别:
WHERE在分组前过滤原始行;HAVING在分组后过滤聚合结果,可使用聚合函数。列别名可在SELECT和ORDER BY中使用,但不能在WHERE或HAVING中直接引用。
9.2 运算符与空值处理
-- NULL 判断必须用 IS NULL,严禁用 =
SELECT * FROM T WHERE COL IS NULL;
SELECT * FROM T WHERE COL IS NOT NULL;
-- NULL 不能参与算术运算,结果仍为 NULL
SELECT NULL + 1; -- 结果:NULL
-- 字符串拼接
SELECT '姓名:' || NAME FROM T;
SELECT CONCAT('姓名:', NAME) FROM T;
9.3 多表连接查询
-- 内连接:仅返回匹配的记录
SELECT e.*, d.DEPT_NAME
FROM EMPLOYEE e
INNER JOIN DEPT d ON e.DEPT_ID = d.DEPT_ID;
-- 左外连接:保留左表所有记录,右表无匹配补 NULL
SELECT e.*, d.DEPT_NAME
FROM EMPLOYEE e
LEFT JOIN DEPT d ON e.DEPT_ID = d.DEPT_ID;
-- 全外连接
SELECT e.*, d.DEPT_NAME
FROM EMPLOYEE e
FULL JOIN DEPT d ON e.DEPT_ID = d.DEPT_ID;
⚠️ N 张表连接时至少需要 N-1 个连接条件,否则会产生笛卡尔积。建议使用
JOIN ON标准语法替代旧式逗号分隔写法。
9.4 分组聚合与多维分析
-- 基础分组聚合
SELECT DEPT_ID, COUNT(*) AS CNT, AVG(SALARY) AS AVG_SAL
FROM EMPLOYEE
GROUP BY DEPT_ID
HAVING COUNT(*) > 5;
-- ROLLUP:层次化汇总(N+1 种组合)
SELECT YEAR, MONTH, SUM(SALES)
FROM SALES_DATA
GROUP BY ROLLUP(YEAR, MONTH);
-- CUBE:多维交叉分析(2^N 种组合,性能消耗较大)
SELECT REGION, PRODUCT, SUM(SALES)
FROM SALES_DATA
GROUP BY CUBE(REGION, PRODUCT);
-- GROUPING SETS:灵活指定分组维度
SELECT REGION, PRODUCT, SUM(SALES)
FROM SALES_DATA
GROUP BY GROUPING SETS((REGION), (PRODUCT), ());
9.5 子查询
-- 标量子查询(返回单行单列)
SELECT EMP_NAME, SALARY,
(SELECT AVG(SALARY) FROM EMPLOYEE) AS AVG_SAL
FROM EMPLOYEE;
-- EXISTS 子查询(通常比 IN 性能更好)
SELECT * FROM DEPT d
WHERE EXISTS (
SELECT 1 FROM EMPLOYEE e WHERE e.DEPT_ID = d.DEPT_ID
);
-- DML 中使用子查询:将研发部员工薪资上调 5%
UPDATE EMPLOYEE
SET SALARY = SALARY * 1.05
WHERE DEPT_ID = (
SELECT DEPT_ID FROM DEPT WHERE DEPT_NAME = '研发部'
);
9.6 排序与分页
-- 推荐写法一:TOP N, M(从第M+1条开始取N条)
SELECT TOP 10, 20 * FROM EMPLOYEE ORDER BY EMP_ID;
-- 推荐写法二:LIMIT ... OFFSET ...
-- LIMIT 10 OFFSET 20 表示跳过前20条,返回第21到第30条
SELECT * FROM EMPLOYEE ORDER BY EMP_ID LIMIT 10 OFFSET 20;
-- WITH TIES:最后一行有并列时,一并包含所有并列记录
SELECT TOP 10 WITH TIES * FROM EMPLOYEE ORDER BY SALARY DESC;
ROWNUM伪列方式语法繁琐,属于传统老式写法,不推荐在生产环境中使用。
十、索引、视图与数据库对象
10.1 索引管理
10.1.1 索引分类
| 类型 | 说明 |
|---|---|
| 聚簇索引(一级索引) | 决定数据的物理存储顺序,通常为主键 |
| 非聚簇索引(二级索引) | 包含索引列值及主键值 |
| 全文索引 | 用于大字段(BLOB、CLOB、TEXT)的文本搜索 |
| 位图索引 | 适用于低基数列(如性别、状态) |
| 空间索引 | 用于地理空间数据 |
达梦默认表结构为索引组织表(IOT)。索引可以独立存放在不同的表空间中,以减少磁盘争用。
10.1.2 索引创建原则
适合建索引的场景:
- 高频查询的列
- 被驱动表的连接列
- 排序、分组的列
- 主键/唯一键(自动创建)
不适合建索引:
- 小表(全表扫描更快)
- 大字段类型(BLOB、CLOB、TEXT)
- 区分度低的列(如性别)
⚠️ 组合索引需将前导列(区分度最高的列)放在最前面,因为达梦不支持索引跳跃扫描。
-- 创建组合索引
CREATE INDEX "IDX_EMP_DEPT_SALARY" ON EMPLOYEE(DEPT_ID, SALARY);
-- 创建唯一索引
CREATE UNIQUE INDEX "IDX_EMP_NO" ON EMPLOYEE(EMP_NO);
10.1.3 索引维护与监控
-- 重建失效索引(必须加 ONLINE 选项避免锁表)
ALTER INDEX "IDX_EMP_DEPT_SALARY" REBUILD ONLINE;
-- 开启索引使用监控
ALTER INDEX "IDX_EMP_DEPT_SALARY" MONITORING USAGE;
-- 查看索引使用情况
SELECT * FROM DBA_OBJECT_USAGE WHERE INDEX_NAME = 'IDX_EMP_DEPT_SALARY';
| 状态属性 | 说明 |
|---|---|
| VALID / INVALID | 索引是否有效 |
| VISIBLE / INVISIBLE | 索引对优化器是否可见 |
10.2 视图
10.2.1 普通视图
视图是虚拟表,不存储数据,仅保存查询定义。
-- 创建视图
CREATE OR REPLACE VIEW "V_EMP_INFO" AS
SELECT e.EMP_NO, e.EMP_NAME, d.DEPT_NAME, e.SALARY
FROM EMPLOYEE e
JOIN DEPT d ON e.DEPT_ID = d.DEPT_ID;
-- 使用视图
SELECT * FROM "V_EMP_INFO" WHERE DEPT_NAME = '研发部';
| 视图类型 | 说明 | 是否可更新 |
|---|---|---|
| 简单视图 | 基于单表,不含聚合函数 | ✅ 通常可更新 |
| 复杂视图 | 多表连接或含聚合函数 | ❌ 需借助替代触发器 |
| 动态性能视图 | 实时内存数据 | ❌ 只读 |
10.2.2 物化视图
物化视图是物理表,预先计算并存储查询结果,适用于 OLAP 场景。
-- 创建物化视图(按需完全刷新)
CREATE MATERIALIZED VIEW "MV_DEPT_SALES"
REFRESH COMPLETE ON DEMAND AS
SELECT DEPT_ID, SUM(SALARY) AS TOTAL_SAL
FROM EMPLOYEE
GROUP BY DEPT_ID;
-- 手动刷新
CALL DBMS_MVIEW.REFRESH('MV_DEPT_SALES', 'C'); -- C=COMPLETE
| 刷新策略 | 说明 |
|---|---|
| COMPLETE(完全刷新) | 重新执行全量查询,适合数据量较小的场景 |
| FAST(快速刷新) | 基于物化视图日志进行增量刷新,需提前创建日志 |
| FORCE(强制刷新) | 优先快速刷新,不支持时降级为完全刷新 |
10.3 序列(Sequence)
-- 创建序列
CREATE SEQUENCE "SEQ_EMP_ID"
START WITH 1 -- 起始值
INCREMENT BY 1 -- 步长
CACHE 20 -- 缓存大小
NOCYCLE; -- 不循环
-- 获取序列值(首次使用前必须先调用 NEXTVAL)
SELECT SEQ_EMP_ID.NEXTVAL; -- 获取下一个值
SELECT SEQ_EMP_ID.CURRVAL; -- 获取当前值
10.4 同义词(Synonym)
-- 创建私有同义词(需指定模式名)
CREATE SYNONYM "EMP" FOR "SYSDBA"."EMPLOYEE";
-- 创建公共同义词(所有用户可直接访问)
CREATE PUBLIC SYNONYM "PUB_EMP" FOR "SYSDBA"."EMPLOYEE";
当私有同义词与公共同义词同名时,优先访问私有同义词。
10.5 DBLink(数据库链接)
-- 创建私有 DBLink(DPI 方式,达梦到达梦推荐)
CREATE LINK "LINK_TO_DB2"
CONNECT WITH "SYSDBA" IDENTIFIED BY "Password123"
USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.2)(PORT=5236)))';
-- 通过 DBLink 跨库查询
SELECT * FROM "SYSDBA"."TABLE_NAME"@"LINK_TO_DB2";
-- 删除 DBLink
DROP LINK "LINK_TO_DB2";
| 连接类型 | 说明 |
|---|---|
| DPI | 达梦特有协议,效率高,达梦到达梦首选 |
| ODBC | 通用协议,兼容性强 |
| Oracle | 连接 Oracle 数据库 |
⚠️ 注意事项:网络延迟对 DBLink 性能影响较大;存在明文密码存储风险,建议使用加密连接;需注意跨库事务的 XA 协议支持及数据类型兼容性。
十一、逻辑备份与还原
11.1 物理备份 vs 逻辑备份
| 对比项 | 物理备份(DMRMAN) | 逻辑备份(dexp/dexpdp) |
|---|---|---|
| 原理 | 基于数据页 | 通过 SQL 导出 |
| 速度 | 快 | 慢 |
| 备份类型 | 完全/增量/差异 | 全量导出 |
| 时间点恢复 | ✅ 支持 | ❌ 不支持 |
| 文件丢失恢复 | ✅ 支持 | ❌ 不支持 |
| 跨平台迁移 | ❌ 受限 | ✅ 灵活 |
11.2 逻辑导出工具
| 工具 | 执行位置 | 文件存放 |
|---|---|---|
dexp |
客户端 | 本地 |
dexpdp |
服务器端 | 服务器 |
备份级别:支持数据库、用户、模式、表四种级别,不支持表空间级别。
11.3 关键参数
# 导出示例(模式级别)
dexp SYSDBA/Password123@localhost:5236 \
SCHEMAS=DMHR \
FILE=dmhr_export.dmp \
LOG=dmhr_export.log \
FILESIZE=1024 \
EXCLUDE=INDEX
# 导入示例(模式映射)
dimp SYSDBA/Password123@localhost:5236 \
FILE=dmhr_export.dmp \
REMAP_SCHEMA=DMHR:NEW_DMHR \
TABLE_EXISTS_ACTION=REPLACE
| 参数 | 说明 |
|---|---|
FILESIZE |
控制文件拆分大小,防止单文件过大 |
EXCLUDE / INCLUDE |
排除或包含特定对象 |
QUERY |
带 WHERE 条件的过滤导出 |
REMAP_SCHEMA |
跨模式迁移时进行模式映射,模式名必须大写 |
TABLE_EXISTS_ACTION |
冲突处理:IGNORE(忽略)/ REPLACE(替换)/ OVERWRITE(覆盖冲突行) |
⚠️ 导出时必须充分考虑权限问题,否则导入失败。
十二、PL/SQL 程序开发
12.1 程序块结构
DECLARE
-- 声明部分(可选):变量、游标、异常定义
v_count INT := 0;
BEGIN
-- 执行部分(必需):业务逻辑
SELECT COUNT(*) INTO v_count FROM EMPLOYEE;
PRINT '员工总数:' || v_count;
EXCEPTION
-- 异常处理部分(可选)
WHEN OTHERS THEN
PRINT '发生异常:' || SQLERRM;
END;
12.2 循环控制
-- FOR 循环
BEGIN
FOR i IN 1..5 LOOP
PRINT i;
END LOOP;
END;
-- WHILE 循环
DECLARE v_i INT := 1;
BEGIN
WHILE v_i <= 5 LOOP
PRINT v_i;
v_i := v_i + 1;
END LOOP;
END;
-- LOOP 循环(必须设置退出条件,否则死循环)
DECLARE v_i INT := 1;
BEGIN
LOOP
PRINT v_i;
v_i := v_i + 1;
EXIT WHEN v_i > 5; -- ⚠️ 必须设置退出条件
END LOOP;
END;
12.3 分支语句
-- IF-THEN-ELSEIF-ELSE
DECLARE v_salary DECIMAL(10,2) := 8000;
BEGIN
IF v_salary >= 15000 THEN
PRINT '高薪';
ELSEIF v_salary >= 8000 THEN
PRINT '中等';
ELSE
PRINT '低薪';
END IF;
END;
-- CASE-WHEN
DECLARE v_grade CHAR(1) := 'B';
BEGIN
CASE v_grade
WHEN 'A' THEN PRINT '优秀';
WHEN 'B' THEN PRINT '良好';
WHEN 'C' THEN PRINT '及格';
ELSE PRINT '不及格';
END CASE;
END;
12.4 存储过程与函数
| 对比项 | 存储过程 | 函数 |
|---|---|---|
| 返回值 | 无 | 必须有且仅有一个 |
| 调用方式 | CALL 过程名(...) |
SELECT 函数名(...) |
| 参数模式 | IN / OUT / IN OUT | IN / OUT / IN OUT |
-- 创建存储过程
CREATE OR REPLACE PROCEDURE "SP_RAISE_SALARY"(
p_dept_id IN INT,
p_rate IN DECIMAL(5,2),
p_count OUT INT
)
AS
BEGIN
UPDATE EMPLOYEE
SET SALARY = SALARY * (1 + p_rate / 100)
WHERE DEPT_ID = p_dept_id;
p_count := SQL%ROWCOUNT;
COMMIT;
END;
-- 调用存储过程
DECLARE v_cnt INT;
BEGIN
CALL SP_RAISE_SALARY(1, 5.0, v_cnt);
PRINT '已更新 ' || v_cnt || ' 条记录';
END;
12.5 异常处理
DECLARE
e_not_found EXCEPTION; -- 自定义异常声明
BEGIN
DECLARE v_name VARCHAR(50);
BEGIN
SELECT EMP_NAME INTO v_name FROM EMPLOYEE WHERE EMP_ID = 99999;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE e_not_found; -- 抛出自定义异常
END;
EXCEPTION
WHEN e_not_found THEN
PRINT '员工不存在';
WHEN OTHERS THEN
PRINT '未知错误:' || SQLERRM;
END;
十三、ODBC 与 Python 驱动配置
13.1 ODBC 数据源配置
安装步骤(源码包编译):
# 1. 解压源码包
tar -zxvf unixODBC-2.3.x.tar.gz
cd unixODBC-2.3.x
# 2. 编译安装(三步骤)
./configure
make
make install
配置文件:
# /etc/odbcinst.ini - 驱动注册
[DM ODBC DRIVER]
Description = DM ODBC Driver
Driver = /dm/bin/libdodbc.so
# /etc/odbc.ini - 数据源配置
[DM_DSN]
Description = DM Database
Driver = DM ODBC DRIVER
Server = 192.168.1.1
Port = 5236
Database = DAMENG
# 验证连接
isql d m -v
13.2 Python 驱动部署
# 安装 dmPython 驱动
cd /dm/dmdbms/drivers/python/dmPython
python3 setup.py install
可以执行以下python脚本进行测试,执行方式python3 test.py,以下为test.python脚本内容
import dmPython
conn=dmPython.connect(user='SYSDBA',password='Dameng123',server='192.168.88.103',port=5236)
cursor =conn.cursor()
cursor.execute('select employee_name from DMHR.EMPLOYEE limit 10')
values =cursor.fetchall()
print(values)
cursor.close()
conn.close()
📝 学习小结:DCA 认证涵盖了达梦数据库从安装、实例管理到 SQL 开发的完整知识体系。重点掌握实例参数配置(不可修改的初始化参数)、表空间管理、权限体系、表的创建(包括表结构,索引,主键,外键)、sql脚本执行、逻辑导入导出及 SQL 高级查询,是通过认证考试的关键。
本文整理自达梦数据库 DCA 认证培训课程,供学习参考。
达梦社区地址:https://eco.dameng.com
更多推荐




所有评论(0)