注册
DCA学习记录
专栏/技术分享/ 文章详情 /

DCA学习记录

DM_407202 2026/08/28 169 0 0
摘要

DCA 学习记录:达梦数据库跨用户模式导入(dimp)

作为一名正在备考达梦认证管理员(DCA)的学员,在做第 8 章逻辑备份还原与综合实操题时,我遇到了这么一个问题:“将 U_DMSALM 用户下的所有对象和数据导入到备份用户 SAL_BAK 模式下”

本以为这只是一次普通的 dexp/dimp 数据迁移,结果在 DM 管理工具中实操时,我连续遇到了“导入空数据”、“无效对象”以及“编译权限报错”等问题。本博客将深入剖析每一步失败的底层原因,讲解模式重映射(REMAP_SCHEMA)、所有者参数(OWNER)以及高级对象依赖权限的核心机制。


实验任务

  • 源用户模式U_DMSALM(包含部门表 DEPT、员工表 EMP、工资表 SALARY、普通视图 V_EMPSALV_TOTAL 以及物化视图 V_TJ 等)。

  • 目标用户模式SAL_BAK(新建的备份用户)。

  • 实操目标:将 U_DMSALM 模式下的所有表、约束、普通视图、物化视图及业务数据完整导入到 SAL_BAK 模式下。


阶段一:源用户对象逻辑导出(dexp)

在进行数据迁移前,我首先在实验环境中将源用户 U_DMSALM 进行了逻辑导出。

1. 我的操作步骤

  1. 打开 DM 管理工具,在左侧对象导航中展开【用户】\rightarrow【管理用户】。

  2. 找到 U_DMSALM 用户,右键点击并选择 【导出 dmp…】

  3. 在弹出窗口中配置路径与选项:

  • 导出目录/home/dmdba/dmdbms/data/DAMENG/bak

  • 导出文件U_DMSALM.dmp

  • 导出选项:勾选数据行、索引、约束、触发器、视图、过程、包、序列、权限等元数据。

image.png

2. 底层机制解析

dexp 工具将 U_DMSALM 模式下的所有元数据定义与数据行打包成了二进制 .dmp 文件。注意:dmp 文件中记录的所有对象的默认拥有者都是 U_DMSALM


阶段二:在 SAL_BAK 节点下导入的连续失败

第一次尝试:在 SAL_BAK 用户节点上直接导入(无映射)

1. 操作与底层命令

在新建好 SAL_BAK 用户后,顺理成章地在 SAL_BAK 节点上右键点击【导入 dmp…】,选中刚导出的 U_DMSALM.dmp 文件直接点击了确定。

系统底层生成的实际 dimp 执行命令如下:

/home/dmdba/dmdbms/bin/dimp "SYSDBA"/"******"@LOCALHOST:5236 \ DIRECTORY=/home/dmdba/dmdbms/data/DAMENG/bak \ FILE=U_DMSALM.dmp \ OWNER=("SAL_BAK") \ IGNORE=N COMPILE=Y INDEXFIRST=N TABLE_FIRST=N COMMIT_ROWS=5000 FAST_LOAD=N \ LOG=imp_U_DMSALM_dmp_20260825142321.log LOG_WRITE=N

2. 报错信息

image.png

检查发现,SAL_BAK 用户下没有任何表和数据!

3. 失败原因分析

  • OWNER 参数的作用:在达梦 dimp 工具中,OWNER 参数表示 “仅从 dmp 文件中过滤并读取属于该用户的对象”

  • 矛盾点U_DMSALM.dmp 备份文件中记录的对象拥有者是 U_DMSALM,根本不存在名为 SAL_BAK 的导出对象。

  • dimp 解析到 OWNER=("SAL_BAK") 时,在 dmp 文件中匹配不到任何对象,直接报出 [警告]无效的对象: SAL_BAK 并退出。


知识铺垫:DCA 核心考点——模式映射机制

经历第一次失败后,我翻阅了 DCA 操作手册关于模式导入章节的内容,发现跨模式/跨用户导入时必须使用模式映射机制。

1. 什么是模式映射?

模式映射(REMAP_SCHEMA)用于在导入逻辑备份文件时,将 dmp 文件中原本属于源模式的对象与数据,在目标数据库中重命名并创建到指定的目标模式下

2. 语法规范与使用方式

  • 标准语法格式
REMAP_SCHEMA = <源模式名> : <目标模式名>
  • 多模式映射支持:如果导出的备份中包含多个模式,支持同时配置多个映射规则,以逗号隔开:
REMAP_SCHEMA = SCHEMA_A:SCHEMA_B, SCHEMA_C:SCHEMA_D
  • 核心工作原理:当 dimp 工具解析 dmp 数据流中的建表、建索引、建约束等 DDL 语句时,数据库引擎会自动将 SQL 中的对象前缀从 源模式.表名 动态替换为 目标模式.表名,并将数据流写入目标用户默认的表空间中。

既然掌握了模式映射的原理,我便在图形化工具中开始进行第二次尝试。


第二次尝试:在 SAL_BAK 用户节点上导入并添加模式映射

1. 操作与底层命令

我重新在 SAL_BAK 用户节点上右键点击【导入 dmp…】,并在选项的【模式映射】中配置了规则:U_DMSALM \rightarrow SAL_BAK
image.png
此时底层生成的执行命令变成了:

/home/dmdba/dmdbms/bin/dimp "SYSDBA"/"******"@LOCALHOST:5236 \ DIRECTORY=/home/dmdba/dmdbms/data/DAMENG/bak \ FILE=U_DMSALM.dmp \ OWNER=("SAL_BAK") \ IGNORE=N COMPILE=Y INDEXFIRST=N TABLE_FIRST=N COMMIT_ROWS=5000 FAST_LOAD=N \ REMAP_SCHEMA="U_DMSALM":"SAL_BAK" \ LOG=imp_U_DMSALM_dmp_20260825142522.log LOG_WRITE=N

2. 报错日志现象

日志依然显示:
image.png

3. 失败原因分析

  • 图形界面的前置逻辑:只要在 SAL_BAK 节点上右键导入,DM 管理工具就会自动将 OWNER=("SAL_BAK") 注入为前置参数。

  • 参数优先级dimp 工具会优先执行 OWNER 前置过滤;由于在 dmp 文件中连 SAL_BAK 对象都找不到,过滤后结果为空,后置的 REMAP_SCHEMA 根本没有机会被触发执行


阶段三:在源用户 U_DMSALM 节点下执行映射导入

1. 为什么要在 U_DMSALM 节点上执行?

要让 dimp 成功读出数据,命令中的 OWNER 必须与备份文件一致(即 OWNER=("U_DMSALM")),同时依靠 REMAP_SCHEMA 将读取到的对象写入目标模式 SAL_BAK

在 DM 管理工具中右键点击 U_DMSALM 用户节点,选择【导入 dmp…】,并配置模式映射 U_DMSALM \rightarrow SAL_BAK

底层生成的命令变更为:

/home/dmdba/dmdbms/bin/dimp "SYSDBA"/"******"@LOCALHOST:5236 \ DIRECTORY=/home/dmdba/dmdbms/data/DAMENG/bak \ FILE=U_DMSALM.dmp \ OWNER=("U_DMSALM") \ IGNORE=N COMPILE=Y INDEXFIRST=N TABLE_FIRST=N COMMIT_ROWS=5000 FAST_LOAD=N \ REMAP_SCHEMA="U_DMSALM":"SAL_BAK" \ LOG=imp_U_DMSALM_dmp_20260825142839.log LOG_WRITE=N

2. 产生新的报错:权限缺失

这次基础表(DEPTEMPSALARY)的数据全部成功写入了 SAL_BAK,但在导入视图和物化视图时,日志抛出了权限异常:
image.png

报错根因分析:

  1. 对象查询权限缺失(Error Code: -5504)
  • 在实训题目中创建视图(V_EMPSALV_TOTAL)时,SQL 语句中显式带有源模式前缀(如 FROM U_DMSALM.EMP)。

  • 迁移到 SAL_BAK 下重新编译该视图时,SAL_BAK 用户缺少跨模式访问 U_DMSALM.EMPSELECT 权限。

  1. 系统权限缺失(Error Code: -5622)
  • DCA 实训题中包含物化视图 V_TJ。新创建的 SAL_BAK 用户仅拥有默认基础权限,缺少 CREATE MATERIALIZED VIEW 系统权限,导致物化视图重建失败。

阶段四:权限补全后成功导入

1. 完善用户权限配置

为了让 SAL_BAK 用户不仅能容纳常规表,还能编译包含跨模式依赖的高级对象,我重新规划了权限并执行了授权:

  1. 授予角色 ROLE_SALM:该角色封装了 CREATE MATERIALIZED VIEWCREATE TABLECREATE VIEWCREATE PROCEDURE 等系统权限(解决 Error Code: -5622)。
    image.png

  2. 授予跨模式对象权限:显式授予 SAL_BAKU_DMSALM 下业务表(DEPTEMPSALARY)及物化视图(V_TJ)的 SELECT 权限(解决 Error Code: -5504)。
    image.png

我的授权 SQL 脚本:

-- 授予登录会话权限与系统角色(包含物化视图创建权限) GRANT "PUBLIC", "SOI", "ROLE_SALM" TO SAL_BAK; GRANT CREATE SESSION TO SAL_BAK; -- 授予跨模式源表与对象的查询权限 GRANT SELECT ON "U_DMSALM"."DEPT" TO SAL_BAK; GRANT SELECT ON "U_DMSALM"."EMP" TO SAL_BAK; GRANT SELECT ON "U_DMSALM"."SALARY" TO SAL_BAK; GRANT SELECT ON "U_DMSALM"."V_TJ" TO SAL_BAK;

2. 最终导入验证

权限配置生效后,再次在 U_DMSALM 节点上执行 OWNER=("U_DMSALM") + REMAP_SCHEMA="U_DMSALM":"SAL_BAK" 导入。

最终成功的日志输出:

image.png

至此,U_DMSALM 下的所有表结构、外键约束、业务数据、普通视图以及物化视图全部成功迁移并编译到了 SAL_BAK 用户下。


DCA 备考心得

这次实操排错让我对达梦数据库的迁移逻辑有了更深入的认识,总结为以下两点核心经验:

  1. 彻底搞清 OWNERREMAP_SCHEMA 的协作逻辑
  • OWNER 决定了 “从备份文件中提取谁”(必须与 dmp 文件中的导出所有者一致)。

  • REMAP_SCHEMA 决定了 “把提取出的对象写入谁”(格式为 源模式:目标模式)。

  • 在使用 DM 管理工具进行图形化跨用户导入时,务必在源用户节点上右键导入,防止工具自动注入错误的目标 OWNER 参数。

  1. 迁移前理清权限与对象依赖链
  • 目标用户必须预先具备对应对象类型的创建权限(如 CREATE MATERIALIZED VIEW)。

  • 编写视图与存储过程时若带有硬编码的模式名前缀(如 U_DMSALM.EMP),必须提前为目标用户授予源表对象的 SELECT 权限,以确保导入后的对象编译顺利通过。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服