在本次针对达梦数据库 DM8 的学习中,我重点钻研了命令行逻辑备份工具 dexp 与 dimp 的使用。尽管这两个工具在概念上类似于 Oracle 的 exp/imp,看似只需掌握几个核心参数即可上手,但在实际动手操作与故障排查过程中,我遇到了不少预料之外的难点。
dexp 提供了数据库级(FULL)、用户级(OWNER)、模式级(SCHEMAS)和表级(TABLES)四种导出粒度,且这四者完全互斥,一次只能指定一种。在初学时的练习中,我曾试图在一次导出中既指定 FULL=Y 又指定 SCHEMAS=TEST,结果被工具直接报错拒绝。这迫使我必须清晰区分“用户”与“模式”在达梦体系中的微妙差异:虽然通常一个用户拥有一个同名默认模式,但用户级导出针对的是该用户拥有的所有对象,而模式级则严格锁定在具体的命名空间下,导出命令行如下面所示
数据库级:
# $DM_HOME/bin/dexp SYSDBA/密码@ip地址:端口FILE=dexp01.dmp LOG=dexp01.log DIRECTORY=/dmapp/backup/dexp FULL=Y
用户级:
# $DM_HOME/bin/dexp SYSDBA/密码@ip地址:端口FILE=dexp01.dmp LOG=dexp01.log DIRECTORY=/dmapp/backup/dexp OWNER=目标用户名
模式级:
# $DM_HOME/bin/dexp SYSDBA/密码@ip地址:端口FILE=dexp01.dmp LOG=dexp01.log DIRECTORY=/dmapp/backup/dexp SCHEMAS=模式名
表级:
# $DM_HOME/bin/dexp SYSDBA/密码@ip地址:端口FILE=dexp01.dmp LOG=dexp01.log DIRECTORY=/dmapp/backup/dexp TABLES=SCOTT.EMP #tables后面接 模式.表名
需要注意,SCHEMAS 与 TABLES 不能同时出现。 我在练习时曾试图写 SCHEMAS=TEST TABLES=TEST.EMP,想只导出 TEST 模式下的 EMP 表,结果被工具直接拒绝。模式级和表级是互斥的四种级别之一,不能混用。模式级导出与用户级导出最核心的区别在于:SCHEMAS 精确锁定命名空间,而 OWNER 针对的是用户及其拥有的所有对象。一个用户可能拥有多个模式,SCHEMAS 只导出你点名的那几个,不会多带。
dimp 的级别参数与 dexp 一一对应,同样互斥,一次只能选一种。
数据库级:对应 FULL=Y,还原整个数据库的所有对象。。
# $DM_HOME/bin/dimp USERID=密码@ip地址:端口 FILE=dexp01.dmp LOG=dimp01.log DIRECTORY=/dmapp/backup/dexp FULL=Y
用户级:对应 OWNER=用户名。关键前提是目标库必须先创建好同名用户,否则导入会失败。这一点与全库导入不同,全库导入通常不要求预先手工建用户。
# $DM_HOME/bin/dimp USERID=SYSDBA/密码@ip地址:端口 FILE=dexp01.dmp LOG=dimp01.log DIRECTORY=/dmapp/backup/dexp OWNER=目标用户名
模式级:对应 SCHEMAS=模式名。同样要求目标模式已存在。如果要把数据还原到另一个模式名下,SCHEMAS 仍写导出时的原模式名,另加 REMAP_SCHEMA=原模式:目标模式 做映射。这是模式级导入最容易出错的地方。
# $DM_HOME/bin/dimp USERID=SYSDBA/密码@ip地址:端口 FILE=dexp01.dmp LOG=dimp01.log DIRECTORY=/dmapp/backup/dexp SCHEMAS=原模式名 REMAP_SCHEMA=原模式名:目标模式名
表级:对应 TABLES=模式.表名。如果要导入到不同表名的表中,用 REMAP_TABLE=原表名:目标表名(通常只写表名部分,不带模式前缀)。
# $DM_HOME/bin/dimp USERID=SCOTT/密码@ip地址:端口 FILE=table_test.dmp LOG=table_imp.log DIRECTORY=/dmapp/backup/dexp TABLES=SCOTT.TEST REMAP_TABLE=TEST:TEST_BAK
如果实在图形化界面,请注意,REMAP_SCHEMA,REMAP_TABLE 对应的是表映射,并且在填写的时候一定要注意全部为大写。
易错点
1.模式不存在
使用图形化界面进行模式级的导入导出,在不同名模式之间进行导出导入,在目的集群已创建对应的模式,在映射也创建成功的时候,会出现已有的模式不存在的情况,导致数据导入失败。
建议还是直接使用命令行进行导入
> ./dimp SYSDBA/Dameng123 directory=/dm/backup file=imp_20261102151537.dmp log=dimpdmhr.log remap_schema=TEST:TESTPORD
2.视图,物化视图的迁移
创建视图和物化视图的时候会在界面上指定模式名,所以视图体内部不需要再添加模式名.表名,如果添加后从一个模式导入另外一个不同名的模式会出现视图异常
可以看到导入后的视图体还是test模式下面,工具不会改动视图体内部的内容。
所以在导出视图和物化视图的时候需要注意,已经指定了模式名,不需要再视图内部进行添加。
备份的作用是做数据的归档或者数据的迁移,生产环境中经常使用,结合dca考试还有我的实际参与的项目中来,进行以下几点的延伸
1.归档
生产环境中一定要开启归档,联机备份(热备)的前提是数据库必须处于归档模式。这是因为备份期间业务仍在写入,需要依靠归档日志来保证备份集的一致性,并支持后续恢复到任意时间点。
生产环境通常通过 SQL 联机开启归档,无需停库:
> ALTER DATABASE MOUNT;
> ALTER DATABASE ARCHIVELOG;-- 添加本地归档路径(生产建议独立磁盘,限制空间防止撑爆)
> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
> ALTER DATABASE OPEN;
检查数据库是否开启归档
> SELECT ARCH_MODE FROM V$DATABASE;
2.数据加载
一些poc环境中需要进行性能测试,一般来说需要快速加载大量数据,我亲身经历的一个poc项目需要加载大概1.5T的数据,这些数据如果使用insert写代码批量入库会十分的缓慢,语句大概消耗1天左右的时间,所以这时候需要用的快速加载的办法
> ./dmfldr userid=SYSDBA/Dameng123@127.0.0.1:5236 control='/insertdata/customer_large_part_000.ctl' log='/insertdata/load_000.log' badfile='/insertdata/load_000.bad'
userid : 数据库登录信息
control : 数据导入文件
Log : 导入日志
Badfile: 数据导入失败数据
其中control 文件格式
LOAD DATA
INFILE '/insertdata/customer_large_part_000.csv'
INTO TABLE customer_large
FIELDS '|'
(
age ,
name ,
sex ,
birth_date DATE 'YYYY-MM-DD' ,
education ,
monthly_income ,
credit_score ,
id_number ,
phone_num ,
address ,
create_at DATE 'YYYY-MM-DD HH24:MI:SS'
)
其中
INFILE :导入文件地址
INTO TABLE : 要导入到那张表
FIELDS : 导入文件字段的分隔符
括号内为字段信息
这种快速加载的办法相较于直接insert的办法常能快 10 倍以上,原先1天的任务,使用快速加载大概1个小时就能够完成
文章
阅读量
获赞
