dexp和dimp的使用。如何提高导入导出的效率?
dexpdp、dimpdp和dexp、dimp的区别?
dimp导入的一个参数overwrite overwrite2 之间的区别?
dexp(逻辑导出)和 dimp(逻辑导入)是达梦数据库自带的命令行工具,位于安装目录的 dmdbms/bin 下。它们用于在数据库联机状态下进行逻辑备份和还原,支持全库、用户、模式、表四种级别的导出导入。
此外,达梦还提供了 dexpdp / dimpdp(服务端版本),与 dexp / dimp 功能相同,但执行位置和文件生成位置不同。
本文档基于 TESTDB 实例(端口 5239)的实操记录,完整覆盖 dexp/dimp 的使用方法、效率优化、参数区别及常见问题处理。
/home/dmdba/dmdata/test/TESTDB/home/dmdba/backupdexp USERID=用户名/密码@IP:端口 参数1=值1 参数2=值2 ...
重要:
USERID参数必须放在第一位,否则报错[-2007]:语法分析出错。
导出整个 TEST 模式的所有对象。
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 SCHEMAS=TEST FILE=/home/dmdba/backup/test_schema.dmp LOG=/home/dmdba/backup/test_schema_exp.log
输出(节选):
dexp V8
正在导出 第1 个SCHEMA :TEST
----- 导出表:TEST.EMPLOYEE -----
表TEST.EMPLOYEE导出结束,共导出 100004 行数据, 大小 2.840 MB
----- 导出表:TEST.DEPT -----
表TEST.DEPT导出结束,共导出 10 行数据
成功导出, 没有出现警告
验证文件:
ls -lh /home/dmdba/backup/test_schema.dmp
输出:-rw-r--r-- 1 dmdba dinstall 2.9M Jul 28 16:43 test_schema.dmp
只导出 TEST.EMPLOYEE 表。
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 TABLES=TEST.EMPLOYEE FILE=/home/dmdba/backup/test_employee.dmp LOG=/home/dmdba/backup/test_employee_exp.log
输出:
dexp V8
----- 导出表:TEST.EMPLOYEE -----
表TEST.EMPLOYEE导出结束,共导出 100004 行数据, 大小 2.840 MB
成功导出, 没有出现警告
导出 ID < 100 的记录。
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 TABLES=TEST.EMPLOYEE QUERY="where ID<100" FILE=/home/dmdba/backup/test_employee_partial.dmp LOG=/home/dmdba/backup/test_employee_partial_exp.log
输出:
dexp V8
----- 导出表:TEST.EMPLOYEE -----
表TEST.EMPLOYEE导出结束,共导出 93 行数据, 大小 2.159 KB
成功导出, 没有出现警告
只导出表定义,不导出数据。
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 SCHEMAS=TEST FILE=/home/dmdba/backup/test_schema_struct.dmp ROWS=N LOG=/home/dmdba/backup/test_schema_struct_exp.log
输出:
dexp V8
正在导出 第1 个SCHEMA :TEST
共导出 3 个TABLE
模式[TEST]导出结束.....
成功导出, 没有出现警告
导入后验证:表存在但无数据。
| 参数 | 说明 | 示例 |
|---|---|---|
USERID |
数据库登录信息(必选,必须第一位) | USERID=SYSDBA/Dameng123@127.0.0.1:5239 |
FILE |
导出文件名,缺省为 dexp.dmp |
FILE=/data/backup/exp.dmp |
LOG |
日志文件名,缺省为 dexp.log |
LOG=exp.log |
SCHEMAS |
按模式导出(模式名列表) | SCHEMAS=TEST,HR |
TABLES |
按表导出(表名列表) | TABLES=TEST.EMPLOYEE,HR.DEPT |
QUERY |
按条件导出 | QUERY=TEST.EMPLOYEE:"where ID<100" |
ROWS |
是否导出数据行,默认 Y | ROWS=N(只导结构) |
PARALLEL |
导出线程数,默认 16 | PARALLEL=32 |
TABLE_PARALLEL |
每表子线程数,默认 8 | TABLE_PARALLEL=16 |
EXCLUDE |
忽略指定对象类型 | EXCLUDE=INDEXES,TRIGGERS |
dimp USERID=用户名/密码@IP:端口 参数1=值1 参数2=值2 ...
将 TEST 模式导入到 TEST2 模式。
步骤1:创建目标模式
disql SYSDBA/Dameng123@localhost:5239 -e "CREATE SCHEMA TEST2;"
步骤2:导入
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_schema.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 LOG=/home/dmdba/backup/dimp_test2.log
输出(节选):
dimp V8
[1/4]创建表 TEST2.EMPLOYEE ...
[1/4]创建表 TEST2.DEPT ...
[4/4]表 TEST2.DEPT 的数据导入完成,共导入数据:10 行
[4/4]表 TEST2.EMPLOYEE 的数据导入完成,共导入数据:100004 行, 大小 2.840 MB
成功导入, 没有出现警告
验证:
disql SYSDBA/Dameng123@localhost:5239 -e "SELECT COUNT(*) FROM TEST2.EMPLOYEE;"
输出:100004
当目标表已存在时,使用 APPEND 追加数据。但如果有主键冲突,需要配合 PRIMARY_CONFLICT 参数。
命令:
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_employee.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=APPEND PRIMARY_CONFLICT=IGNORE
输出关键信息:
[表: EMPLOYEE]表TEST2.EMPLOYEE, 跳过主键冲突100004 行,插入0行新数据
成功导入, 没有出现警告
先清空目标表数据,再导入新数据。
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_schema.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=TRUNCATE
先删除目标表,再重建并导入数据。
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_schema.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=REPLACE
当目标表存在主键冲突时,PRIMARY_CONFLICT 参数控制处理方式。通过实操验证,三种方式的区别如下:
| 参数值 | 行为 | 底层操作 | 日志关键信息 |
|---|---|---|---|
IGNORE |
跳过冲突行,不导入冲突数据 | 不处理 | 跳过主键冲突100004 行,插入0行新数据 |
OVERWRITE |
删除原行,插入新行 | DELETE + INSERT |
刪除主键冲突100004 行,插入100004行新数据 |
OVERWRITE2 |
更新冲突行 | UPDATE |
更新主键冲突100004 行,插入0行新数据 |
制造冲突:
UPDATE TEST2.EMPLOYEE SET NAME='CONFLICT_NAME', AGE=999 WHERE ID=1;
COMMIT;
测试 OVERWRITE:
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_employee.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=APPEND PRIMARY_CONFLICT=OVERWRITE
验证:SELECT ID, NAME, AGE FROM TEST2.EMPLOYEE WHERE ID=1; → 恢复为 张三, 30
测试 OVERWRITE2(再次制造冲突后):
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_employee.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=APPEND PRIMARY_CONFLICT=OVERWRITE2
验证:同样恢复为 张三, 30,但日志显示“更新”而非“删除+插入”。
| 对比项 | dexp / dimp | dexpdp / dimpdp |
|---|---|---|
| 执行位置 | 客户端 | 服务端 |
| 文件生成位置 | 客户端所在目录 | 服务器端指定目录 |
DIRECTORY 参数 |
不支持 | 需要数据库目录对象 |
| 适用场景 | 导出到本地 | 导出到服务器,减少网络传输 |
问题:执行 dexpdp 时直接指定路径报错。
[警告]无效的目录名[/HOME/DMDBA/BACKUP]
原因:dexpdp 不支持直接写操作系统路径,需要先在数据库中创建目录对象。
解决:
CREATE DIRECTORY BACKUP_DIR AS '/home/dmdba/backup';
GRANT READ, WRITE ON DIRECTORY BACKUP_DIR TO PUBLIC;
cd /home/dmdba/dmdbms/bin
./dexpdp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=test_dp.dmp SCHEMAS=TEST DIRECTORY=BACKUP_DIR LOG=test_dp_exp.log
输出:
dexpdp V8
正在导出 第1 个SCHEMA :TEST
表TEST.EMPLOYEE导出结束,共导出 100004 行数据, 大小 2.840 MB
成功导出, 没有出现警告
验证:
ls -lh /home/dmdba/backup/test_dp.dmp
输出:-rw-r--r-- 1 dmdba dinstall 2.9M Jul 28 16:48 test_dp.dmp
./dimpdp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=test_dp.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 DIRECTORY=BACKUP_DIR LOG=test_dp_imp_clean.log
输出关键信息:
dimpdp V8
表 TEST2.EMPLOYEE 的数据导入完成,共导入数据:100004 行
成功导入, 没有出现警告
| 参数 | 默认值 | 说明 | 调优建议 |
|---|---|---|---|
PARALLEL |
16 | 总线程数 | 大数据量时可增至 32 或更高 |
TABLE_PARALLEL |
8 | 每表子线程数(需 FAST_LOAD=Y 生效) |
单表数据量大时可增加 |
启用 FAST_LOAD=Y 会使用 dmfldr 工具进行高速数据导入。
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_schema.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=REPLACE FAST_LOAD=Y TABLE_PARALLEL=16
在本环境(约 10 万行数据)中测试三种方式:
| 导入方式 | 命令参数 | 耗时(real) |
|---|---|---|
| 常规导入 | 无额外参数 | 0m0.327s |
| 高并行 | PARALLEL=32 TABLE_PARALLEL=16 |
0m0.929s |
| 快速导入 | FAST_LOAD=Y TABLE_PARALLEL=16 |
0m0.512s |
结论:
FAST_LOAD=Y 和 PARALLEL 可显著提升效率。FAST_LOAD=Y。| 错误 | 原因 | 解决方法 |
|---|---|---|
[-2007]:语法分析出错 |
USERID 未放在第一位 |
将 USERID 作为第一个参数 |
[警告]无效的目录名 |
dexpdp 不支持直接写路径 |
创建数据库目录对象 |
[警告]违反唯一性约束条件 |
主键冲突 | 使用 PRIMARY_CONFLICT=IGNORE/OVERWRITE/OVERWRITE2 |
[警告]表已存在 |
目标表存在 | 使用 TABLE_EXISTS_ACTION=APPEND/TRUNCATE/REPLACE |
[警告]文件"dimp.log"已经存在 |
日志文件已存在 | 输入 y 覆盖,或使用 LOG 参数指定新文件名 |
TABLES 级别导入未覆盖目标 |
TABLES 级别不支持 REMAP_SCHEMA |
改用 SCHEMAS 级别 + REMAP_SCHEMA |
# ========== 导出(dexp) ==========
# 1. 按模式导出
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 SCHEMAS=TEST FILE=/home/dmdba/backup/test_schema.dmp LOG=exp_schema.log
# 2. 按表导出
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 TABLES=TEST.EMPLOYEE FILE=/home/dmdba/backup/test_employee.dmp
# 3. 按条件导出
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 TABLES=TEST.EMPLOYEE QUERY="where ID<100" FILE=/home/dmdba/backup/test_employee_partial.dmp
# 4. 只导结构
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 SCHEMAS=TEST FILE=/home/dmdba/backup/test_schema_struct.dmp ROWS=N
# 5. 高并行导出
dexp USERID=SYSDBA/Dameng123@127.0.0.1:5239 SCHEMAS=TEST FILE=/home/dmdba/backup/test_parallel.dmp PARALLEL=32 TABLE_PARALLEL=16
# ========== 导入(dimp) ==========
# 6. 导入到新模式
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_schema.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2
# 7. 追加导入(忽略主键冲突)
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_employee.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=APPEND PRIMARY_CONFLICT=IGNORE
# 8. 覆盖主键冲突(DELETE+INSERT)
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_employee.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=APPEND PRIMARY_CONFLICT=OVERWRITE
# 9. 更新主键冲突(UPDATE)
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_employee.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=APPEND PRIMARY_CONFLICT=OVERWRITE2
# 10. 清空后导入
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_schema.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=TRUNCATE
# 11. 删除重建后导入
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_schema.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=REPLACE
# 12. 快速导入
dimp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=/home/dmdba/backup/test_schema.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 TABLE_EXISTS_ACTION=REPLACE FAST_LOAD=Y TABLE_PARALLEL=16
# ========== 服务端工具(dexpdp/dimpdp) ==========
# 13. 创建目录对象(先执行)
CREATE DIRECTORY BACKUP_DIR AS '/home/dmdba/backup';
GRANT READ, WRITE ON DIRECTORY BACKUP_DIR TO PUBLIC;
# 14. dexpdp 导出
dexpdp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=test_dp.dmp SCHEMAS=TEST DIRECTORY=BACKUP_DIR LOG=dexpdp.log
# 15. dimpdp 导入
dimpdp USERID=SYSDBA/Dameng123@127.0.0.1:5239 FILE=test_dp.dmp SCHEMAS=TEST REMAP_SCHEMA=TEST:TEST2 DIRECTORY=BACKUP_DIR LOG=dimpdp.log
文章
阅读量
获赞
