dexp/dimp 工具名称有两种写法 dexp/dimp 和 dexpdp/dimpdp,两者语法完全相同。
唯一的区别在于,dexp/dimp 导出/导入的文件必须存放在客户端,dexpdp/dimpdp 导出/导入的文件必须存放在服务器端。
为了避免字符集焦虑,建议将操作终端(xshell)和操作系统($LANG)的字符集均设置成数据库的字符集(通常为UTF8)。
逻辑导出和逻辑导入数据库对象分为四种级别:数据库级、用户级、模式级和表级。四种级别独立互斥,不能同时存在。
- 数据库级(full=y):导出或导入整个数据库中的所有对象。
- 用户级(owner=XXX):导出或导入一个或多个用户所拥有的所有对象。
- 模式级(schemas=XXX):导出或导入一个或多个模式下的所有对象。
- 表级(tables=XX):导出或导入一个或多个指定的表或表分区。
$ dexp userid=sysdba/Dameng123:5236 directory=/dmdb/expimp file=full.dmp full=y log=dexp_`date +"%F-%H-%M"`.log
$ dimp userid=sysdba/Dameng123:5238 directory=expimp file=full.dmp full=y log=dimp_`date +"%F-%H-%M"`.log老版本使用直接路径,新版已经不支持直接路径了,需要使用目录对象。
SQL> create directory expimp as '/orabak';
如果密码有特殊字符,可以用如下的写法:
userid='sysdba/"特殊密码"':25236
也支持 REMAP,示例如下:
REMAP_SCHEMA=DMHR:DMTEST
remap_tablespace=DEMOTBS:DEMO_TBS
如果 exclude 里面要排查多张表,只需要写一下 TABLES 关键字就行,例如 exclude = TABLES:T1,T2,T3....
如果只想导表结构,达梦没有 CONTENTS 选项,使用 rows=n (表示不导出行)来实现。
如果只想导数据,可以使用 DATA_ONLY=Y 来实现。
也可以使用 manager 来操作,要操作某个对象,就在某个对象上右击即可。
关于通过网络连接导入与导出:
源端:
DB: 03134284094-20231124-209612-20067
dexpdp V8
version: 03134284094-20231124-209612-20067 Pack15
目标端:
dexpdp V8
version: 03134284294-20241225-255012-20119 Pack20
在目标端通过网络连接执行 expdp 命令,将源端的 YXGL 用户导出到目录对象下。
但源端实际上不存在该目录对象,最终导出的文件在源端的 /dmdb/dmdbms/bin/ 下。
dimp 报错示例
dimp 导入完成后,报有两个 warning,在导入日志中找到报错的地方:
[TABLE: DEMO_TABLE] CREATE SCHEMA "DEMOUSER" AUTHORIZATION "DEMOUSER" CREATE TABLE "DEMO_TABLE"
(
"FINDEMO" VARCHAR(60 CHAR) NOT NULL,
.....
"PROVDEMO" VARCHAR(100),
NOT CLUSTER PRIMARY KEY("FINDEMO")) STORAGE(CLUSTERBTR) AUTO_INCREMENT = 266065;
[TABLE: DEMO_TABLE]
[WARNING]Error Code:-2071,AUTO_INCREMENT column must be part of unique constraint
[TABLE: DEMO_TABLE]
[WARNING]create table fail, import table DEMOUSER.DEMO_TABLE ...报错说自增列 FINDEMO 必须是唯一约束的一部分。但表里该列上没有唯一约束。
从业务人员处得到到初始化的 DDL 语句:
REATE TABLE "DEMOUSER"."DEMO_TABLE"
(
"FINDEMO" VARCHAR(60 CHAR) NOT NULL,
.....
"PROVDEMO" VARCHAR(100),
NOT CLUSTER PRIMARY KEY("FINDEMO"),
CONSTRAINT "DEMO_TABLE_RECORDID_IDX" UNIQUE("RECORDID")) STORAGE(ON "DEMOUSER_TBS", CLUSTERBTR) AUTO_INCREMENT = 7;手动创建表后,只导数据:
$ dimp userid='xxx/"xxxx"':5236 directory=/dmdb/ DATA_ONLY=Y TABLES=DEMOUSER.DEMO_TABLE file=DEMOUSER.dmp remap_tablespace=MAIN:DEMOUSER_TBS log=dimp_`date +"%F-%H-%M"`.log