一、目录
- 学习背景与初衷
- DM 数据库核心实操要点
- 2.1 数据库安装与实例配置
- 2.2 备份还原策略与实操
- 2.3 函数用法与 SQL 查询实现
- 2.4 DM SQL 程序设计思路
- 存储过程与存储函数实战应用
- DM 数据库常用命令总结
- 问题解决案例与技巧总结
- 学习收获与未来展望
二、学习背景与初衷
在数字化转型加速推进的当下,国产数据库作为信息系统的核心基础设施,其自主可控性愈发关键。《国产数据库技术》课程聚焦达梦(DM)数据库这一主流国产产品,从理论到实操系统讲解了数据库技术的核心逻辑。通过本次学习,我不仅摆脱了对国外数据库的依赖思维,更深入掌握了 DM 数据库的实战技能,深刻体会到国产数据库在性能、安全性和适配性上的显著优势,为后续参与国产化项目奠定了坚实基础。
三、DM 数据库核心实操要点
3.1 数据库安装与实例配置
DM 数据库的安装与实例配置是入门核心,其流程清晰但需注重细节。安装前需提前检查操作系统环境,确保内存、磁盘空间满足最低要求,同时关闭防火墙等可能干扰安装的程序。安装过程中,通过图形化向导选择典型安装模式,依次完成安装路径设置、端口配置(默认 5236)、管理员账号密码设置等步骤。
实例配置环节是关键,需通过 DM 数据库配置助手(dbca)进行实例创建。配置时需合理设置实例名、数据文件存储路径、日志文件大小等参数,尤其要注意控制文件的冗余配置,建议至少保留 2 个副本以提升数据安全性。
3.2 备份还原策略与实操
数据备份是数据库运维的重中之重,DM 数据库提供了完整备份、增量备份和日志备份三种核心方式。在实操中,我采用 “完整备份 + 增量备份 + 日志备份” 的组合策略:每周日执行一次完整备份,工作日每日执行增量备份,每小时进行一次日志备份。
备份操作可通过 DM 管理工具图形化界面完成,也可通过命令行执行。例如,使用BACKUP DATABASE FULL TO "full_backup_2024" BACKUPSET '/dm/backup/full_2024'命令完成完整备份。还原时需遵循 “先还原完整备份,再还原增量备份,最后通过日志备份恢复到指定时间点” 的顺序,操作过程中需注意核对备份集的完整性和一致性。
3.3 函数用法与 SQL 查询实现
DM 数据库支持丰富的内置函数,包括字符串函数、日期函数、聚合函数等,合理运用这些函数能大幅提升 SQL 查询效率。例如,使用SUBSTR函数截取字符串、DATEADD函数进行日期计算、SUM和GROUP BY组合实现数据统计。
在课程实操中,我曾完成一个员工信息查询需求:查询 2023 年入职、部门为技术部且工资高于 8000 的员工姓名、入职日期和薪资,并按薪资降序排列。对应的 SQL 语句如下:
sql取消自动换行复制
SELECT emp_name, hire_date, salary
通过该案例,我深刻体会到 DM 数据库 SQL 语法与标准 SQL 的兼容性,同时其对复杂查询的优化能力也令人印象深刻。
3.4 DM SQL 程序设计思路与步骤
DM SQL 程序设计主要基于存储过程和函数,其核心思路是 “模块化封装、逻辑分层”。设计步骤可分为四步:首先明确需求,拆解功能模块;其次设计数据结构,确定输入输出参数;然后编写程序代码,包含逻辑判断、循环处理等逻辑;最后进行调试优化,通过测试用例验证程序的正确性和性能。
例如,在设计一个 “员工薪资调整” 存储过程时,我先定义了员工 ID、调整比例两个输入参数和调整结果输出参数,再通过IF-ELSE判断员工当前薪资等级,根据不同等级执行不同的调整逻辑,最后返回调整后的薪资和结果状态。程序编写完成后,通过CALL命令调用存储过程进行测试,逐步排查语法错误和逻辑漏洞。
四、存储过程与存储函数实战应用
存储过程和存储函数是 DM 数据库中实现复杂业务逻辑的核心工具,其优势在于 “一次编译、多次执行”,能减少网络传输开销,提升业务处理效率。以下结合 2 个实际业务场景,详细说明其应用过程:
4.1 存储过程实战:员工薪资批量调整
需求场景
某公司需根据部门和薪资等级执行批量调薪:技术部员工薪资低于 10000 元的上调 15%,10000-15000 元的上调 10%,15000 元以上的上调 5%;其他部门员工统一上调 8%,同时记录调薪日志。
实现步骤
- 先创建调薪日志表,用于存储调薪记录:
s取消自动换行复制
CREATE TABLE salary_adjust_log(
log_id INT PRIMARY KEY AUTOINCREMENT,
emp_id INT,
old_salary DECIMAL(10,2),
new_salary DECIMAL(10,2),
adjust_rate DECIMAL(3,2),
adjust_date DATE,
dept VARCHAR(30)
);
- 编写存储过程,包含部门参数(默认全部门)、事务处理和异常捕获:
sql取消自动换行复制
CREATE OR REPLACE PROCEDURE proc_batch_adjust_salary(
p_dept VARCHAR(30) DEFAULT 'ALL' -- 默认全部门调薪
)
AS
v_emp_id INT;
v_old_salary DECIMAL(10,2);
v_new_salary DECIMAL(10,2);
v_adjust_rate DECIMAL(3,2);
v_dept VARCHAR(30);
BEGIN
-- 声明游标,查询目标员工
DECLARE cur_emp CURSOR FOR
SELECT emp_id, salary, dept
FROM employee
WHERE p_dept = 'ALL' OR dept = p_dept;
OPEN cur_emp;
FETCH cur_emp INTO v_emp_id, v_old_salary, v_dept;
WHILE @@FETCH_STATUS = 0 LOOP
-- 根据部门和薪资等级确定调薪比例
IF v_dept = '技术部' THEN
IF v_old_salary 0000 THEN
v_adjust_rate := 0.15;
ELSIF v_old_salary BETWEEN 10000 AND 15000 THEN
v_adjust_rate := 0.10;
- 测试执行:调用存储过程调整技术部员工薪资
sql取消自动换行复制
CALL proc_batch_adjust_salary('技术部');
- 验证结果:查询调薪日志表,确认调薪记录正确性
sql取消自动换行复制
SELECT * FROM salary_adjust_log WHERE dept = '技术部';
4.2 存储函数实战:部门薪资统计
需求场景
编写函数,输入部门名称,返回该部门的 “平均薪资”“最高薪资”“最低薪资” 和 “员工总数”,支持多值返回。
实现步骤
- 由于 DM 函数支持返回自定义类型,先创建类型用于存储统计结果:
sql取消自动换行复制
CREATE TYPE dept_salary_stats AS OBJECT(
avg_salary DECIMAL(10,2),
max_salary DECIMAL(10,2),
min_salary DECIMAL(10,2),
emp_count INT
);
- 编写存储函数,实现统计逻辑:
sql取消自动换行复制
CREATE OR REPLACE FUNCTION func_dept_salary_stats(p_dept VARCHAR(30))
RETURN dept_salary_stats
AS
v_avg DECIMAL(10,2);
v_max DECIMAL(10,2);
v_min DECIMAL(10,2);
v_count INT;
BEGIN
-- 统计部门薪资数据
SELECT
AVG(salary), MAX(salary), MIN(salary), COUNT(1)
INTO v_avg, v_max, v_min, v_count
FROM employee
WHERE dept = p_dept;
-- 返回自定义类型结果
RETURN dept_salary_stats(ROUND(v_avg, 2), v_max, v_min, v_count);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN dept_salary_stats(0, 0, 0, 0); -- 无数据时返回默认值
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, '统计失败:' || SQLERRM);
END;
- 测试执行:查询技术部薪资统计结果
sql取消自动换行复制
SELECT func_dept_salary_stats('技术部') AS dept_stats FROM DUAL;
- 拆解结果:如需单独获取某一项统计值,可通过类型属性访问
sql取消自动换行复制
SELECT
func_dept_salary_stats('技术部').avg_salary AS 平均薪资,
func_dept_salary_stats('技术部').max_salary AS 最高薪资,
func_dept_salary_stats('技术部').emp_count AS 员工总数
FROM DUAL;
五、DM 数据库常用命令总结
5.1 数据库连接与用户管理命令
- 本地连接数据库:disql SYSDBA/SYSDBA@LOCALHOST:5236
- 创建用户:CREATE USER test IDENTIFIED BY "Test123456";
- 授予用户权限:GRANT DBA TO test;
- 查看用户列表:SELECT USERNAME FROM DBA_USERS;
5.2 备份与还原命令
- 完整备份数据库:BACKUP DATABASE FULL TO "full_bak" BACKUPSET '/dm/backup/full';
- 增量备份数据库:BACKUP DATABASE INCREMENT BASE ON BACKUPSET '/dm/backup/full' TO "incr_bak" BACKUPSET '/dm/backup/incr';
- 日志备份:BACKUP LOG DATABASE TO "log_bak" BACKUPSET '/dm/backup/log';
- 还原完整备份:RESTORE DATABASE FROM BACKUPSET '/dm/backup/full';
- 恢复数据库:RECOVER DATABASE FROM BACKUPSET '/dm/backup/full';
5.3 数据操作与查询命令
- 创建表:CREATE TABLE employee(emp_id INT PRIMARY KEY, emp_name VARCHAR(50), dept VARCHAR(30), hire_date DATE, salary DECIMAL(10,2));
- 插入数据:INSERT INTO employee VALUES(1, '张三', '技术部', '2023-03-15', 9500.00);
- 更新数据:UPDATE employee SET salary = 10000.00 WHERE emp_id = 1;
- 删除数据:DELETE FROM employee WHERE emp_id = 1;
- 事务提交:COMMIT;
- 事务回滚:ROLLBACK;
5.4 存储过程与函数相关命令
- 创建存储过程:(见 4.1 实战案例)
- 调用存储过程:CALL proc_batch_adjust_salary('技术部');
- 创建存储函数:(见 4.2 实战案例)
- 调用函数:SELECT func_dept_salary_stats('技术部') FROM DUAL;
- 查看存储过程 / 函数列表:SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION');
六、问题解决案例与技巧总结
学习过程中,我曾遇到 “备份集还原失败” 的问题:还原时提示 “备份集文件损坏或不兼容”。通过排查发现,问题源于备份时磁盘空间不足导致备份集不完整。解决技巧是:备份前先检查磁盘剩余空间,确保至少为备份数据量的 1.5 倍;同时开启备份校验功能,备份完成后自动验证备份集完整性。
另一个常见问题是 “SQL 查询性能低下”,针对这一问题,可通过以下技巧优化:一是为查询频繁的字段建立索引,如CREATE INDEX idx_emp_dept ON employee(dept);;二是避免使用SELECT *,只查询所需字段;三是合理使用关联查询,避免嵌套层级过深;四是通过EXPLAIN命令分析执行计划,优化 SQL 语句。
在存储过程开发中,曾遇到 “游标循环死循环” 问题,排查后发现是FETCH语句位置错误,未放在循环末尾导致。技巧总结:游标循环必须遵循 “打开游标→首次抓取→循环判断→处理逻辑→再次抓取” 的顺序,且需通过@@FETCH_STATUS判断抓取状态。
七、学习收获与未来展望
通过本次《国产数据库技术》课程学习,我系统掌握了 DM 数据库的安装配置、备份还原、SQL 查询、存储过程 / 函数开发及常用命令等核心技能,尤其在实战中理解了国产数据库的业务适配逻辑。新增的存储过程与函数实战案例,让我深刻体会到 DM 数据库在复杂业务场景下的灵活性和高效性,也认识到模块化编程对提升开发效率和代码可维护性的重要性。
DM 数据库作为国产数据库的标杆产品,其稳定的性能、完善的功能和贴心的技术支持,让我看到了国产数据库的广阔发展前景。未来,我将继续深入学习 DM 数据库的高级特性,如高可用集群配置、数据迁移工具使用、性能监控与调优等,同时关注国产数据库的行业应用案例,努力将所学知识转化为实际工作能力,为推动国产化信息技术应用贡献自己的力量。