注册
dimp和dexp使用方法
培训园地/ 文章详情 /

dimp和dexp使用方法

2023/04/06 3184 0 0

1、功能简介
DM 数据库的备份还原包括两种类型:物理备份还原和逻辑备份还原。逻辑导出(dexp)和逻辑导入(dimp)是 DM 数据库的两个命令行工具,分别用来实现对 DM 数据库的逻辑备份和逻辑还原。逻辑备份和逻辑还原都是在联机方式下完成,联机方式是指数据库服务器正常运行过程中进行的备份和还原。dexp 和 dimp 是 DM 数据库自带的工具,只要安装了 DM 数据库,就可以在安装目录/dmdbms/bin 中找到。

2、使用方法简单介绍
2.1逻辑导出(dexp)
可以通过./dexp help可以查看工具可以设置参数:(这里由于篇幅限制,只简单介绍常用参数)

参数名	参数说明(默认值)	备注
FILE	导出文件名	可直接填写目录加文件名
LOG	导出日志文件名	可直接填写目录加日志文件名
FULL	整库导出 (N)	
OWNER	以用户方式导出 格式 (user1,user2,...)	
SCHEMAS	以模式方式导出 格式 (schema1,schema2,...)	
TABLES	以表方式导出 格式 (table1,table2,...)	
FUZZY_MATCH	TABLES选项是否支持模糊匹配 (N)	一般和TABLES参数配合使用,TABLES=XXX%,%为通配符
QUERY	用于导出表的子集的select 子句	一般和TABLES参数配合使用,进行表的部分数据导出
PARALLEL            	用于指定导出的过程中所使用的线程数目	一般默认为1,需兼顾速度时,同时对系统影响最小的情况下,调整为2-4个线程即可
EXCLUDE	忽略指定的对象格式 EXCLUDE=(CONSTRAINTS,INDEXES,ROWS,TRIGGERS,GRANTS)or                            EXCLUDE=TABLES:table1,table2 or
EXCLUDE=SCHEMAS:sch1,sch2	可以以黑名单方式过滤表,该种需求常见为按模式导出,不导出部分大表

INCLUDE	包含指定的对象格式 INCLUDE=(CONSTRAINTS,INDEXES,ROWS,TRIGGERS,GRANTS) or                            INCLUDE=TABLES:table1,table2	可以以白名单方式过滤表,该种需求常见为按模式导出,不导出部分大表

CONSTRAINTS	导出约束 (Y)	
TRIGGERS            	导出触发器 (Y)	
ROWS                	导出数据行 (Y)	不需要数据,只需要表结构情景,该种需求常见为按模式导出,需要指定rows=n
FEEDBACK            	每 x 行显示进度 (0)	导出大表时,可以指定导出多少行进行返回结果,进行导出时间测算
常用简单基础命令导出方式如下所示,可以和上表中各种常用参数组合使用:
--简单导出表命令,可以支持多表导出
./dexp 用户名/密码@数据库ip:端口号 file=目录/文件名.dmp log=目录.log tables=模式名.表名,模式名.表名
--按照模式导出
./dexp 用户名/密码@数据库ip:端口号file=目录/文件名.dmp log=目录.log schemas=模式名
--按照用户导出,达梦中,一个用户可以拥有多个模式,可以一个命令全部导出
./dexp 用户名/密码@数据库ip:端口号file=目录/文件名.dmp log=目录.log owner=用户名

2.2逻辑导入(dimp)
可以通过./dimp help可以查看工具可以设置参数:(这里由于篇幅限制,只简单介绍常用参数)

参数名	参数说明(默认值)	备注
FILE	导入文件名	可直接填写目录加文件名
LOG	导入日志文件名	可直接填写目录加日志文件名
FULL	整库导入 (N)	
OWNER	以用户方式导入 格式 (user1,user2,...)	
SCHEMAS	以模式方式导入 格式 (schema1,schema2,...)	
TABLES	以表方式导入 格式 (table1,table2,...)	
PARALLEL	用于指定导入的过程中所使用的线程数目	
ROWS	导入数据行 (Y)	
FEEDBACK	每 x 行显示进度 (0)	
REMAP_SCHEMA	格式(SOURCE_SCHEMA:TARGET_SCHEMA)
将SOURCE_SCHEMA中的数据导入到TARGET_SCHEMA中
	
REMAP_TABLE	格式(SOURCE_SCHEMA.SOURCE_TABLE:TARGET_TABLE)
将SOURCE_TABLE中的数据导入到TARGET_TABLE中	
PRIMARY_CONFLICT	IGNORE:不覆盖主键冲突行数据。
OVERWRITE:覆盖主键冲突行数据,删除原表有冲突的行。
OVERWRITE2:覆盖主键冲突行数据,更新原表有冲突的行。	
IGNORE	忽略创建错误 (N)	该参数常用为处理导入报错“对象已存在”
TABLE_EXISTS_ACTION	SKIP:跳过此表。
APPEND:直接向现有表中导入数据。
TRUNCATE:先删除现有表中的数据,再向表中导入数据。
REPLACE:先删除现有表,再导数据。
TRUNCATE_CASCADE:先删除现有表中的数据,并且级联删除依赖表数据,再向表中导入数据。	

常用简单基础导入命令如下所示,可以和上表中各种常用参数组合使用:

--相较于导出时的各种限定,如导出整个模式、或某些表;在目的端进行数据导入时,若不限定导入,整个dmp中数据都要导入,可直接全dmp文件直接导入
./dimp 用户名/密码@数据库ip:端口号 file=目录/文件名.dmp log=目录.log 
--若源端导出为模式导出,目的端只需导入某张表,只需tables参数限定
./dimp 用户名/密码@数据库ip:端口号file=目录/文件名.dmp log=目录.log tables=模式名.表名

3、常见问题处理
1)数据导出时报“Permission denied”报错
微信图片_20230404111246.png
该报错是由于dexp导出程序对dmp文件存放文件夹没有写入权限,建议更换执行dexp程序所使用的用户,或更换dmp文件存放路径。
2)执行dimp或者dexp程序时,报“segmnet fault”,直接生成core文件。
该种情况一般为dimp或者dexp程序依赖动态库错乱导致,建议使用ldd dimp或者ldd dexp,查看程序依赖动态库是否使用到除bin目录下,其他目录的libdm开头的.so动态库,该种情况一般有两种处理方式:
将bin目录下动态库拷贝至其他目录覆盖,但在现场正式环境下,该方法有几率会导致机器上应用程序异常,所以不建议使用。
设置LD_LIBRARY_PATH环境变量,如export LD_LIBRARY_PATH=/opt/dmdbms/bin;若单次导出,只需在终端中单次申明该变量,进行导出导入即可,若使用脚本进行导出,需在脚本中进行申明。不建议直接修改用户环境变量配置文件,有几率导致机器上程序异常。
3)在执行导入时,报错:该工具不能解析此文件,请使用更高版本的工具
微信图片_20230404111325.png
该种情况可能为以下两种原因:
dimp和dexp的版本差异太大,建议将源端dexp所在bin目录,拷贝一份,目的端进行数据导入时,使用该bin目录下dimp进行导入,确保版本一致;
crc检验失败,文件本身在传输过程中导致问题,需对比两个文件的md5值。或者本身导出的文件就是有问题的,需要查看导出日志是否有报错。
4)在执行导入时,报错: xxxx对象已存在
微信图片_20230404111259.png
在执行导入时,可能只清空目的表数据,但并未删除表;该种情况,在导入时需添加前文介绍的参数ignore=y,忽略创建错误后,再进行数据导入。
5)在执行导入时,报错:违反表的唯一性约束
微信图片_20230404111304.png
这种报错可以分为两种情况进行讨论:
违反主键列唯一性约束,该种情况可以使用前文介绍的PRIMARY_CONFLICT参数进行处理。
违反普通唯一性索引引发的报错,在既不想删除数据,又想将源端表多余数据导入的情况下;可以使用REMAP_TABLE参数将表名映射成新表导入数据,然后根据唯一性列进行关联查询,查看是哪些数据违反约束,如:select * from 新表 a where a.id not in (select id from 旧表 b);找出相关数据后,酌情进行处理,如:修改源端数据后再进行数据导出导入,或删除、修改目的端相关数据,确保数据能正常录入。
6)在执行导入时,报错:违反外键约束
微信图片_20230404111309.png
这种报错一般为导入表存在外键,导入外键列数据在被依赖表的主键列中无法找到。
该种报错一般直接处理方式为直接禁用外键后,再次导入数据。但有些时候,导入模式级数据时,需禁用整个模式的的外键,执行如下SQL:

--禁用外键
select  'ALTER TABLE  '|| owner ||'.'||table_name||' DISABLE  CONSTRAINT    '|| constraint_name ||';'  from sys.dba_constraints  where  owner =’模式名’ and constraint_type='R';
--启用外键
select  'ALTER TABLE  '|| owner ||'.'||table_name||'  ENABLE  CONSTRAINT    '|| constraint_name ||';'  from sys.dba_constraints  where  owner=’模式名’ and constraint_type='R';
--附赠在导入数据后,启动外键报启动失败时,方便查看各个表外键依赖关系SQL,方便找出违反外键约束数据
--查询表的外键和列
SELECT
        D.OWNER            ,
        D.TABLE_NAME       ,
        D.CONSTRAINT_NAME  , 
        D.COLUMN_NAME      ,
        D.R_OWNER          ,
        R.TABLE_NAME       ,
        D.R_CONSTRAINT_NAME,
        R.COLUMN_NAME      ,
        R.POSITION
FROM
        (
                SELECT
                        CONS.OWNER            ,
                        CONS.TABLE_NAME       ,
                        CONS.CONSTRAINT_NAME  ,
                        CONS.R_OWNER          ,
                        CONS.R_CONSTRAINT_NAME,
                        COND.COLUMN_NAME      ,
                        COND.POSITION
                FROM
                        DBA_CONS_COLUMNS COND,
                        DBA_CONSTRAINTS CONS
                WHERE
                        CONS.OWNER          =COND.OWNER
                    AND CONS.CONSTRAINT_NAME=COND.CONSTRAINT_NAME
                    AND CONS.TABLE_NAME     =COND.TABLE_NAME
                    AND CONS.CONSTRAINT_TYPE='R'
        )
        D,
        (
                SELECT
                        CONS.OWNER          ,
                        CONS.TABLE_NAME     ,
                        CONS.CONSTRAINT_NAME,
                        CONR.COLUMN_NAME    ,
                        CONR.POSITION
                FROM
                        DBA_CONSTRAINTS CONS,
                        DBA_CONS_COLUMNS CONR
                WHERE
                        CONS.CONSTRAINT_TYPE='P'
                    AND CONS.OWNER          =CONR.OWNER
                    AND CONS.TABLE_NAME     =CONR.TABLE_NAME
                    AND CONS.CONSTRAINT_NAME=CONR.CONSTRAINT_NAME
        )
        R
WHERE
        D.R_OWNER          =R.OWNER
    AND D.R_CONSTRAINT_NAME=R.CONSTRAINT_NAME
    AND D.POSITION         =R.POSITION
    ORDER BY D.OWNER,D.TABLE_NAME;

4、常用导出脚本
在线系统中,随着数据量的不断增长,数据库全库物理备份时间会逐渐增加,同时备份期间会应用也会受一定影响;而逻辑备份以轻便灵活著称,可以实现每次备份部分数据,对系统影响最小。
以下脚本通过两种方式,实现对两种数据的备份,一种为重要数据,一种为历史数据。针对重要数据,每天进行备份,同时压缩备份文件,保留30天。

#expdb
export LD_LIBRARY_PATH=/home/dmdba/dm/dmdbms/bin
export DM_HOME=/home/dmdba/dm/dmdbms
export LANG=zh_CN
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
#init backup path
BACKUPPATH=/dbbak/d5000_dmp
time=`date +%Y%m%d%H%M%S`
#run dexp 

pidcount=`ps cax -o pid,command | grep -w dmserver | grep -c dmserver`
if [ $pidcount -eq 1 ]; 
	then
	$DM_HOME/bin/dexp SYSDBA/XXXX@127.0.0.1:5236  FILE=${BACKUPPATH}/d5000xxxxxx${time}.dmp LOG=${BACKUPPATH}/d5000xxxxxx${time}.log owner=d5000 
sleep 3
cd  ${BACKUPPATH}
#auto tar.gz bakup file
tar -zcvf d5000xxxxxx${time}.tar.gz d5000xxxxxx${time}.* 	
#auto delete tar.gz file 30 days ago end with .tar.gz
find ${BACKUPPATH} -mtime +30 -name "d5000*.tar.gz" -exec rm -rf {} \;
#auto delete bakup file 1 days ago begin with d5000xxxxxx 
find ${BACKUPPATH} -mtime +1 -name "d5000*.dmp" -exec rm -rf {} \;
#auto delete bakup log 1 days ago begin with d5000xxxxxx
find ${BACKUPPATH} -mtime +1 -name "d5000*.log" -exec rm -rf {} \;
fi

针对历史数据,利用dexp的对表名通配符功能(FUZZY_MATCH)和查询数据功能(query),每天备份前一天历史数据,同时压缩备份文件。
#expdb
export LD_LIBRARY_PATH=/home/dmdba/dm/dmdbms/bin
export DM_HOME=/home/dmdba/dm/dmdbms
export LANG=zh_CN
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
#init backup path
BACKUPPATH=/dbbak/hisdb_dmp
#input starttime and endtime
start_time=`date -d "1 day ago"  +"%Y-%m-%d 00:00:00"`
#echo $start_time
end_time=`date  +"%Y-%m-%d 00:00:00"`
#echo $end_time
ftime=`date -d "${start_time}"  +%Y%m%d`
#run dexp 

pidcount=`ps cax -o pid,command | grep -w dmserver | grep -c dmserver`
if [ $pidcount -eq 1 ]; 
	then
	$DM_HOME/bin/dexp HISDB/xxx@127.0.0.1:5236  FILE=${BACKUPPATH}/YC_HS_${ftime}.dmp LOG=${BACKUPPATH}/YC_HS_${ftime}.log TABLES=YC_HS% query="where occur_time>='${start_time}' and occur_time<'${end_time}'"  FUZZY_MATCH=Y LOG_WRITE=Y 
	sleep 3
	
	cd ${BACKUPPATH}
	#tar yc_hs
	tar -zcvf YC_HS${ftime}.tar.gz  YC_HS_${ftime}.*
	
	sleep 3
	#auto delete bakup file 1 days ago begin with YC_HS 
	find ${BACKUPPATH} -mtime +1 -name "YC_HS*.dmp" -exec rm -rf {} \;
	find ${BACKUPPATH} -mtime +1 -name "YC_HS*.log" -exec rm -rf {} \;
	
fi


5、总结
数据库备份是DBA的生命线,在日常的备份计划中,物理备份为最后备用手段,不到最后一刻不轻易使用,而逻辑备份以其轻量、灵活的特性,方便在误删数据、少量数据迁移等场景中大量使用。采用物理备份和逻辑备份相结合的方式,有计划的进行备份,可以确保我们在遇到各种数据丢失的情景下,帮助用户找回数据。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服