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”报错
该报错是由于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)在执行导入时,报错:该工具不能解析此文件,请使用更高版本的工具
该种情况可能为以下两种原因:
dimp和dexp的版本差异太大,建议将源端dexp所在bin目录,拷贝一份,目的端进行数据导入时,使用该bin目录下dimp进行导入,确保版本一致;
crc检验失败,文件本身在传输过程中导致问题,需对比两个文件的md5值。或者本身导出的文件就是有问题的,需要查看导出日志是否有报错。
4)在执行导入时,报错: xxxx对象已存在
在执行导入时,可能只清空目的表数据,但并未删除表;该种情况,在导入时需添加前文介绍的参数ignore=y,忽略创建错误后,再进行数据导入。
5)在执行导入时,报错:违反表的唯一性约束
这种报错可以分为两种情况进行讨论:
违反主键列唯一性约束,该种情况可以使用前文介绍的PRIMARY_CONFLICT参数进行处理。
违反普通唯一性索引引发的报错,在既不想删除数据,又想将源端表多余数据导入的情况下;可以使用REMAP_TABLE参数将表名映射成新表导入数据,然后根据唯一性列进行关联查询,查看是哪些数据违反约束,如:select * from 新表 a where a.id not in (select id from 旧表 b);找出相关数据后,酌情进行处理,如:修改源端数据后再进行数据导出导入,或删除、修改目的端相关数据,确保数据能正常录入。
6)在执行导入时,报错:违反外键约束
这种报错一般为导入表存在外键,导入外键列数据在被依赖表的主键列中无法找到。
该种报错一般直接处理方式为直接禁用外键后,再次导入数据。但有些时候,导入模式级数据时,需禁用整个模式的的外键,执行如下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的生命线,在日常的备份计划中,物理备份为最后备用手段,不到最后一刻不轻易使用,而逻辑备份以其轻量、灵活的特性,方便在误删数据、少量数据迁移等场景中大量使用。采用物理备份和逻辑备份相结合的方式,有计划的进行备份,可以确保我们在遇到各种数据丢失的情景下,帮助用户找回数据。
文章
阅读量
获赞