作为一名正在备考达梦认证管理员(DCA)的学员,在做第 8 章逻辑备份还原与综合实操题时,我遇到了这么一个问题:“将 U_DMSALM 用户下的所有对象和数据导入到备份用户 SAL_BAK 模式下”。
本以为这只是一次普通的 dexp/dimp 数据迁移,结果在 DM 管理工具中实操时,我连续遇到了“导入空数据”、“无效对象”以及“编译权限报错”等问题。本博客将深入剖析每一步失败的底层原因,讲解模式重映射(REMAP_SCHEMA)、所有者参数(OWNER)以及高级对象依赖权限的核心机制。
源用户模式:U_DMSALM(包含部门表 DEPT、员工表 EMP、工资表 SALARY、普通视图 V_EMPSAL、V_TOTAL 以及物化视图 V_TJ 等)。
目标用户模式:SAL_BAK(新建的备份用户)。
实操目标:将 U_DMSALM 模式下的所有表、约束、普通视图、物化视图及业务数据完整导入到 SAL_BAK 模式下。
在进行数据迁移前,我首先在实验环境中将源用户 U_DMSALM 进行了逻辑导出。
打开 DM 管理工具,在左侧对象导航中展开【用户】→【管理用户】。
找到 U_DMSALM 用户,右键点击并选择 【导出 dmp…】。
在弹出窗口中配置路径与选项:
导出目录:/home/dmdba/dmdbms/data/DAMENG/bak
导出文件:U_DMSALM.dmp
导出选项:勾选数据行、索引、约束、触发器、视图、过程、包、序列、权限等元数据。
dexp 工具将 U_DMSALM 模式下的所有元数据定义与数据行打包成了二进制 .dmp 文件。注意:dmp 文件中记录的所有对象的默认拥有者都是 U_DMSALM。
SAL_BAK 节点下导入的连续失败SAL_BAK 用户节点上直接导入(无映射)在新建好 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
检查发现,SAL_BAK 用户下没有任何表和数据!
OWNER 参数的作用:在达梦 dimp 工具中,OWNER 参数表示 “仅从 dmp 文件中过滤并读取属于该用户的对象”。
矛盾点: U_DMSALM.dmp 备份文件中记录的对象拥有者是 U_DMSALM,根本不存在名为 SAL_BAK 的导出对象。
dimp 解析到 OWNER=("SAL_BAK") 时,在 dmp 文件中匹配不到任何对象,直接报出 [警告]无效的对象: SAL_BAK 并退出。
经历第一次失败后,我翻阅了 DCA 操作手册关于模式导入章节的内容,发现跨模式/跨用户导入时必须使用模式映射机制。
模式映射(REMAP_SCHEMA)用于在导入逻辑备份文件时,将 dmp 文件中原本属于源模式的对象与数据,在目标数据库中重命名并创建到指定的目标模式下。
REMAP_SCHEMA = <源模式名> : <目标模式名>
REMAP_SCHEMA = SCHEMA_A:SCHEMA_B, SCHEMA_C:SCHEMA_D
dimp 工具解析 dmp 数据流中的建表、建索引、建约束等 DDL 语句时,数据库引擎会自动将 SQL 中的对象前缀从 源模式.表名 动态替换为 目标模式.表名,并将数据流写入目标用户默认的表空间中。既然掌握了模式映射的原理,我便在图形化工具中开始进行第二次尝试。
SAL_BAK 用户节点上导入并添加模式映射我重新在 SAL_BAK 用户节点上右键点击【导入 dmp…】,并在选项的【模式映射】中配置了规则:U_DMSALM → SAL_BAK。
此时底层生成的执行命令变成了:
/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
日志依然显示:
图形界面的前置逻辑:只要在 SAL_BAK 节点上右键导入,DM 管理工具就会自动将 OWNER=("SAL_BAK") 注入为前置参数。
参数优先级:dimp 工具会优先执行 OWNER 前置过滤;由于在 dmp 文件中连 SAL_BAK 对象都找不到,过滤后结果为空,后置的 REMAP_SCHEMA 根本没有机会被触发执行。
U_DMSALM 节点下执行映射导入U_DMSALM 节点上执行?要让 dimp 成功读出数据,命令中的 OWNER 必须与备份文件一致(即 OWNER=("U_DMSALM")),同时依靠 REMAP_SCHEMA 将读取到的对象写入目标模式 SAL_BAK。
在 DM 管理工具中右键点击 U_DMSALM 用户节点,选择【导入 dmp…】,并配置模式映射 U_DMSALM → 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
这次基础表(DEPT、EMP、SALARY)的数据全部成功写入了 SAL_BAK,但在导入视图和物化视图时,日志抛出了权限异常:
在实训题目中创建视图(V_EMPSAL、V_TOTAL)时,SQL 语句中显式带有源模式前缀(如 FROM U_DMSALM.EMP)。
迁移到 SAL_BAK 下重新编译该视图时,SAL_BAK 用户缺少跨模式访问 U_DMSALM.EMP 的 SELECT 权限。
V_TJ。新创建的 SAL_BAK 用户仅拥有默认基础权限,缺少 CREATE MATERIALIZED VIEW 系统权限,导致物化视图重建失败。为了让 SAL_BAK 用户不仅能容纳常规表,还能编译包含跨模式依赖的高级对象,我重新规划了权限并执行了授权:
授予角色 ROLE_SALM:该角色封装了 CREATE MATERIALIZED VIEW、CREATE TABLE、CREATE VIEW、CREATE PROCEDURE 等系统权限(解决 Error Code: -5622)。
授予跨模式对象权限:显式授予 SAL_BAK 对 U_DMSALM 下业务表(DEPT、EMP、SALARY)及物化视图(V_TJ)的 SELECT 权限(解决 Error Code: -5504)。
-- 授予登录会话权限与系统角色(包含物化视图创建权限)
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;
权限配置生效后,再次在 U_DMSALM 节点上执行 OWNER=("U_DMSALM") + REMAP_SCHEMA="U_DMSALM":"SAL_BAK" 导入。
至此,U_DMSALM 下的所有表结构、外键约束、业务数据、普通视图以及物化视图全部成功迁移并编译到了 SAL_BAK 用户下。
这次实操排错让我对达梦数据库的迁移逻辑有了更深入的认识,总结为以下两点核心经验:
OWNER 与 REMAP_SCHEMA 的协作逻辑:OWNER 决定了 “从备份文件中提取谁”(必须与 dmp 文件中的导出所有者一致)。
REMAP_SCHEMA 决定了 “把提取出的对象写入谁”(格式为 源模式:目标模式)。
在使用 DM 管理工具进行图形化跨用户导入时,务必在源用户节点上右键导入,防止工具自动注入错误的目标 OWNER 参数。
目标用户必须预先具备对应对象类型的创建权限(如 CREATE MATERIALIZED VIEW)。
编写视图与存储过程时若带有硬编码的模式名前缀(如 U_DMSALM.EMP),必须提前为目标用户授予源表对象的 SELECT 权限,以确保导入后的对象编译顺利通过。
文章
阅读量
获赞
