本章节主要介绍达梦数据库备份还原常见问题,为用户提供备份还原常见问题的分析和解决思路。除此之外,用户还可前往达梦技术社区参与更多问题讨论。
目录
- 怎么配置归档,有哪些注意事项?错误号 [-8216]
- 可以通过定时作业设置调度执行的数据库增量/全量备份吗
- 执行备份命令报错[-137]
- 执行备份命令报错[-135]
- 周期性备份脚本
- 表空间还原时报错:表空间名不能为空
- 自带的备份还原工具与 dmrman 的区别
- dmrman 的用途
- 备份集还原报错:[管道连接失败]
- DMAP 启动报管道已存在连接失败
- [-7103]: 创建命名管道失败
- [-8109]: 创建 DMAP 管道失败
- 备份报错 [-8084]: 起始 LSN [47619] 小于等于基备份结束 LSN [47631]
- 备份的时候报错:创建 DMAP 管道失败
- Windows 下配置归档目录报错:归档目标无效
- 远程备份:如何用控制台远程备份数据库到本地
- 达梦数据库的自动备份机制
- Windows 中达梦导出的数据库能否在 Linux 下还原
- 关于 DmAPService 服务的相关问题
- 还原报错:-8024 数据文件读写出错
- 命令行如何开启 dmap 服务
- -8273 无效的备份集目录
- arch 归档的 log 日志可以恢复到之前的数据状态吗
- 警告窗口:库、表空间的联机备份操作需要数据库实例运行在归档模式并处于打开状态,检测到当前实例不满足备份条件,请调整实例状态然后再进行备份操作
- 备份报错:归档日志不连续
- 物理全库备份还原后,启动目的端数据库报错版本不匹配
- DM8 企业版还原到安全版报错:标记不匹配
- 新建的备份作业未运行,没有报错,也看不到历史运行记录
- 从数据库实例 A 备份还原到已有的数据库实例 B 上,用原实例 B 的数据库账号密码登录报错
- 如何对备份进行加密
- 编写脚本备份数据库,disql 一直提示无法获取一行数据,忽略此输入
- 如何通过作业备份前一天的归档
- 用控制台还原数据库,报错:【-802】非法 ini 配置参数
- 脱机备份还原报错[-7169]:bakres 与 DMAP 消息通信失败
- 如何修改归档日志相关设置
- 备份还原表结构报错:[-8324]:还原目标表定义不匹配
- 数据库如何恢复到指定时间点
- 如何联机还原表,有哪些注意要点?
- 定时备份作业报错:-5597,无备份权限
- MPP 集群任意节点执行全备报错:[错误码[-10003]:-104]写备份文件
- 传输备份文件出现丢包现象
- 备份集还原执行 recover 时报错:[-8363]从备份集生成临时日志文件失败
- dsc 环境执行备份失败报错:[-8117] 等待归档刷盘,请稍后重试
- 在达梦数据库中,差异增量备份和累积增量备份有什么区别?它们的还原结果一样吗?
- [-4558]: 数据文件已存在
- 如何避免定时删除备份作业执行后,无备份文件存在
- DPC 集群( BS 模式)联机备份还原报错:“[-8379]:指定的 BAK MAGIC 值与备份集不匹配”
- 使用 dmrman 工具进行还原时报错:“备份集版本不匹配”
- dm8 普通用户无还原权限
- 如何还原归档?两个备份集中有重复归档文件如何处理?
- 如何不开启 dmap 服务进行备份
- 备份集校验错误
- 如何使用作业进行归档备份
- 数据库存在列存储 HUGE 表时,物理全备无法对 HUGE 表数据进行备份
- 增量备份时报错:[-8036]:无基备份或无匹配基备份
- 批量安全删除满足指定条件的所有库级备份集报错:”-134: 执行码版本不匹配“
- 时区问题导致定时备份无法执行
- 2 台服务器部署了多套主备实例后备份报错:权限不足
- [备份报错:”CODE:[-8086], DESC:无效的 TRACE 文件“
- 备份报错:“-8069 待备份文件无效”
- 通过 dmrman 进行数据还原时报错:“打开文件失败”
- 如何将数据文件还原到指定的路径
- 备份报错:“-8085: 第三方介质的命令非法”
正文
怎么配置归档,有哪些注意事项?错误号 [-8216]
错误号 -8216:指定或者默认归档目录中找不到归档日志,缺少本地或者远程归档。
DM 数据库开启归档方式:
- SQL 方式开启归档
alter database mount;
alter database add archivelog 'dest=/d07,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=200000';
alter database archivelog;
alter database open;
- 图形界面方式开启归档:
选择【连接】,右键【管理服务器】,如下图所示:
进入系统管理页面,选择【配置】,点击【转换】,提示转换成功,如下图所示:
进入归档配置页面,归档模式选择【归档】,添加归档参数,填写归档目录,选择归档类型,填写文件大小,空间大小限制(注意归档路径可以有多个)。如下图所示:
返回系统管理页面,状态转换选择【打开】,重新打开数据库,如下图所示:
- 编辑配置文件方式开启归档
首先修改 dm.ini 文件的 arch_ini 参数为 1
,然后在 dm.ini 文件目录新建 dmarch.ini 文件,添加以下内容:
ARCH_WAIT_APPLY = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /d07
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
重启数据库即可开启归档模式。
注意需要注意配置 ARCH_SPACE_LIMIT 参数,为 0 是不限制归档大小,其它数值为限制归档量大小,单位是 MB。
可以通过定时作业设置调度执行的数据库增量/全量备份吗
可以通过设置 job 来备份,操作方法如下:
- 图形界面创建 job 备份数据库:
全备:
点击【作业-新建作业】,如下图所示:
作业步骤-点击【添加】,如下图所示:
步骤类型选择【备份数据库】,填写备份路径(服务器上有权限的合适路径),备份方式选择【完全备份】。如下图所示:
作业调度-新建调度,如下图所示:
填写调度名称,选择调度类型为【反复执行】,频率选择每 1 周的星期日,执行一次,执行时间为【23:00:00】。如下图所示:
增量备份:
新建作业,如下图所示:
作业步骤-新建步骤,步骤类型选择【备份数据库】,备份方式选择:增量备份,增量备份需要指定基备份目录(其中需要有完全备份)。如下图所示:
作业调度-新建调度填写名称,调度类型选择【反复执行】,频率选择每 1 周的周一到周六,每天执行 1 次,执行时间为【23:00:00】。如下图所示:
- 通过 SQL 创建 job 备份数据库
--周日全备
call SP_CREATE_JOB('backupfull',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('backupfull');
call SP_ADD_JOB_STEP('backupfull', 'step', 5, '01000/d07', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('backupfull', 'schedule', 1, 2, 1, 1, 0, '23:00:00', NULL, '2020-02-11 22:18:19', NULL, '');
call SP_JOB_CONFIG_COMMIT('backupfull');
--周一至周六增备
call SP_CREATE_JOB('backupinc',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('backupinc');
call SP_ADD_JOB_STEP('backupinc', 'step', 5, '11000/d07|/d07', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('backupinc', 'schedule', 1, 2, 1, 126, 0, '23:00:00', NULL, '2020-02-11 22:28:44', NULL, '');
call SP_JOB_CONFIG_COMMIT('backupinc');
执行备份命令报错[-137]
【问题现象】:
Linux 环境,数据库实例服务开启状态下,使用 dmdba 用户在 bin 目录下启动 DMRMAN 工具,执行备份命令报错 [-137]: 服务器正在运行或者存在其他进程正在操作同一个库。
【问题原因】:
DmServerDMSERVER 服务没有关闭。DMRMAN 是脱机备份,备份时一定要关闭数据库。
【解决方法】:
使用 root 执行如下命令关闭数据库实例服务(DMSERVER 是数据库实例名)即可。
[root@localhost ~]# systemctl stop DmServiceDMSERVER.service
执行备份命令报错[-135]
【问题现象】:
Windows 10 环境,数据库实例服务开启状态下,在 bin 目录下启动 DMRMAN 工具,执行备份命令报错 [-135]: 创建信号量失败。
【问题原因】:
DmServerDMSERVER 服务没有关闭。
【解决方法】:
使用 DM 服务查看器关闭 DmServerDMSERVER 服务。
周期性备份脚本
--周日全备
call SP_CREATE_JOB( 'back_up_db_full',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('back_up_db_full');
call SP_ADD_JOB_STEP('back_up_db_full', 'back_up_full_on_sunday', 5, '01000E:\dbdata\DAMENG\bak', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('back_up_db_full', 'back_full_once_a_week', 1, 2, 1, 1, 0, '20:20:20', NULL, '2019-11-08 16:20:41', NULL, '');
call SP_JOB_CONFIG_COMMIT('back_up_db_full');
--周一至周六增备
call SP_CREATE_JOB('back_up_db_incr',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('back_up_db_incr');
call SP_ADD_JOB_STEP('back_up_db_incr', 'back_db_inc_days', 5, '11100E:\dbdata\DAMENG\bak|E:\dbdata\DAMENG\bak', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('back_up_db_incr', 'once_a_day', 1, 2, 1, 126, 0, '20:20:20', NULL, '2019-11-08 16:22:28', NULL, '');
call SP_JOB_CONFIG_COMMIT('back_up_db_incr');
也可以通过定时作业设置调度执行的。
表空间还原时报错:表空间名不能为空
在进行表空间备份还原时,表空间名如果未选择,直接进行还原,会报【表空间名不能为空】错误,并且在查看还原表空间的 DDL 时发现,表空间名不存在。
正确还原表空间的方法如下:
在联机还原表空间时,选择需要还原的表空间备份,在表空间名选项中,下拉框中选择需要还原的表空间名即可进行还原。
还原成功后,会弹出提示界面。
自带的备份还原工具与 dmrman 的区别
DM 数据库安装完成后,在程序目录 bin 下有自带的 dmbackup/dmresore 工具,这两个工具一般用来选择 DM 数据库早期的备份还原,不是基于备份集组织的备份还原,即适用于 V1.0 版本备份还原。
而新版 DM 数据库引入了备份片、元数据文件、备份集等概念,提供第三方备份(TAPE 类型)接口,支持 RAC 备份,使用 DMRMAN 工具进行脱机备份还原,即 V2.0 版本备份还原。综合性能和灵活性优先推荐使用 V2.0 版本备份还原方式。
查看当前环境备份最便捷的方式是,查看每一次备份目录下是否有 .meta 元数据文件,如果有则是 V2.0 备份集备份方式,如果没有则是 V1.0 备份方式。
具体使用方法和配置方法详见《DM 备份与还原手册》。(手册位于数据库安装路径 /dmdbms/doc/special
文件夹下)。
dmrman 的用途
类似于 Oracle 的 rman 工具,DM 数据库提供了脱机备份还原管理工具 dmrman,由它来统一负责库级脱机备份、脱机还原、数据库恢复等相关操作,该工具支持命令行指定参数方式和控制台交互方式执行,降低了用户的操作难度。
当安装 DM 数据库后,dmrman 可执行程序就位于程序目录 bin 下,直接使用 ./dmrman 就可以进入 dmrman 命令行交互环境中,具体使用方法和配置方法详见《DM 备份与还原手册》。(手册位于数据库安装路径 /dmdbms/doc/special
文件夹下)。
备份集还原报错:[管道连接失败]
【问题描述】
DM 数据库通过备份集方式进行的物理完全备份时,报错:“CMD END.CODE: [-7105],DESC: [管道连接超时] [-7105]: 管道连接超时”。
【问题分析】
该故障一般发生于 restore 阶段,需要检查以下两点:
- DMAP 是否启动,需要使用 DMAP 来进行备份集还原。
- 使用正确的用户启动 DMAP,需要保证存放备份集文件的备份集目录有读取权限。
【问题解决】
- DMAP 服务的启动用户,必须是 DM 数据库的安装用户。例如:数据库是用 dmdba 用户安装的,那么就要用 dmdba 用户去启动;如果是 root 用户安装的,就用 root 用户去启动。
- 确定备份集保存目录的所有备份集文件有读取权限。
DMAP 启动报管道已存在连接失败
- DMAP 服务启动报错: [-7157] Name pipe exits
提示管道文件已经存在。
- 原因分析:DMAP 服务没有正常关闭,如直接 kill DMAP 服务,管道文件没有释放。
- 解决方法:切换到 dmdbms/bin 下面,找到原来的管道文件,删除,重新启动 DMAP 服务。
- DMAP 服务的启动用户,必须是 DM 数据库的安装用户。例如:数据库是用 dmdba 用户安装的,那么就要用 dmdba 用户去启动;如果是 root 用户安装的,就用 root 用户去启动。
- 如果命令配置了环境变量,则必须到
dmdbms/bin
目录下面,执行./dmap
启动 DMAP 服务,否则备份数据库报错Pipe connect failure!
[-7103]: 创建命名管道失败
【问题现象】:
中标麒麟 7 环境,在将 DM 数据库 bin 路径配置到环境变量 path 中,可以在任意目录下执行 DMRMAN 命令,但是进入 DMRMAN 后执行备份命令,会有如下报错 [-7103]: 创建命名管道失败。
【问题原因】:
当执行 DMRMAN 命令进行备份操作的时,会根据 DMRMAN 命令所在路径下寻找由 DM_PIPE_
开头的管道文件,而不是通过 path 设置的环境变量路径来寻找对应的管道文件,DM_PIPE_ 一般是在 bin 目录下生成。
【解决方法 1】:
使用 DM 数据库安装用户 dmdba 进入 DM 数据库安装路径 .../bin 目录下启动 DMRMAN 工具,执行备份脚本提示成功。
【解决方法 2】:
DM 数据库备份还原依赖 DMAP 服务,必须启动,且一定要正确的用户启动。
- 如果 dmserver 是 dmdba 用户启动的,则 DMAP 也要用 dmdba 用户启动。
- 前端命令启动方式
cd /home/dmdba/dmdbms/bin
./dmap
- 也可通过操作系统服务的方式启动
systemctrl start DmAPService
否则会报错,如下所示:
os_pipe2_create_server_with_name, name:[ /DM_PIPE_DMRMAN-3676_1_RD], error:[2]
假如 1、2 或者 1、3 都无问题,依旧报错:
os_pipe2_create_server_with_name, name:[ /DM_PIPE_DMRMAN-3676_1_RD], error:[2]
可进行以下操作:
cd /home/dmdba/dmdbms/bin
rm -rf DM_PIPE_*
完成后再依次进行 1、2 或者 1、3 操作步骤。
[-8109]: 创建 DMAP 管道失败
【问题现象】:
中标麒麟 7 环境,dmdba 在 bin 目录下启动 DMRMAN 工具,执行备份命令报错 [-8109]: 创建 DMAP 管道失败,请检查 DMAP 是否已经启动。
【问题原因】:
没有启动 DmAPService 服务。
【解决方法】:
使用 root 用户执行如下命令启动 DmAPService 服务,启动后执行备份命令正常。
[root@localhost ~]# systemctl start DmAPService.service
如若 Windows 10 环境下,DmAPService 服务已启动,仍然报这个错误,请使用以管理员身份运行 cmd 命令;同样如果在控制台工具上也报此错误,请使用以管理员身份运行控制台工具。
备份报错 [-8084]: 起始 LSN [47619] 小于等于基备份结束 LSN [47631]
【解决方法】:
未找到基备份,如果未指定基备份,DM 数据库会去默认的路径下查找基备份,默认路径可执行以下语句。
select para_name,para_value from v$dm_ini where para_name='BAK_PATH';
【解决方法】:
增量备份时指基备份集,使用以下命令。
backup database increment with backupdir ‘基备份路径‘ backupset ‘备份路径’;
可以参考链接:参考文献
同时注意全量备份后需要对数据操作一下,例如加一条数据之类的,要不然没有增量,自然不能增量备份。
备份的时候报错:创建 DMAP 管道失败
【用户场景】:
用户用的是 root 安装 DM 数据库,用 root 启动的 DM 数据库服务,用 root 做的备份操作,用 root 在 bin 目录下启动的 DMAP 服务并且可以看到 DMAP 服务已经启动。
【解决方法】:
- 按照安装手册,用 dmdba 用户安装并启动 DM 数据库服务,用 dmdba 启动 DMAP 服务,不要使用 root 用户。
- dm.ini 里面 BAK_USE_AP 改成 2 ,重启实例(如果您用 dmran 话,需要将 dmrman use_ap 修改为 2)。
Windows 下配置归档目录报错:归档目标无效
举例如下:
ALTER DATABASE ADD ARCHIVELOG 'DEST = d:/test, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048';
报错:归档目标无效
【解决方法】:
ALTER DATABASE ADD ARCHIVELOG 'DEST = D:/test, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048';
修改 DEST 路径,建议选择路径的时候直接复制文件路径,不要自己写,避免写错。
远程备份:如何用控制台远程备份数据库到本地
远程备份要到本地只能逻辑导出。备份到本地的步骤如下:
- 将备份文件备份到数据库所在那台服务器上。
- 通过 shell 脚本将备份文件分发到指定的服务器上面。
达梦数据库的自动备份机制
可以设置定时备份作业。
可参考定时备份,或《DM 作业系统使用手册》,手册位于数据库安装路径 /dmdbms/doc
文件夹。
Windows 中达梦导出的数据库能否在 Linux 下还原
可以;不过最好保持初始化参数一致。
比如字符集:源数据库的字符集,导入数据库的字符集,导入数据库的系统字符集要一直。否则容易出现中文乱码问题。
关于 DmAPService 服务的相关问题
【问题 1】:DmAPService 服务主要作用是什么呢?如果数据库正在提供业务,重启这个服务会影响业务运行吗?
【解答】:DmAPService 服务主要是备份数据库时候会用到。重启这个服务不影响业务运行。
【问题 2】:服务查看器中 DmAPService 服务路径怎么修改,或者服务怎么删除?
【解答】:这个是系统带的辅助服务,路径是不可以修改的,如果用不到的话,不启动就可以。通过操作系统自带的服务管理功能可以删除此服务。
【问题 3】:在服务查看器上怎么启动这个服务?
【解答】:那直接右键启动就可以了,DMAP 服务不需要 ini 文件。
还原报错:-8024 数据文件读写出错
【问题描述】:
利用 dmrman 工具执行还原操作时报错:[-8024]: 数据文件读写出错。报错截图如下:
【问题解决】:
- 检查当前还原所用用户是否是 dmdba 用户。
- 检查当前数据目录所有者是否是 dmdba 用户。dmdba 用户能否读写数据目录下的文件。
- 检查备份集所有者是否是 dmdba 用户。检查备份集所在目录是否对 dmdba 用户可读可写。
- 检查是否使用的是 dmdba 用户调用的 dmrman。若使用的是 root 用户调用 dmrman 服务执行备份和恢复,应确保 dmap 服务也是 root 用户执行。可以停止 dmap 服务(
./DmAPService stop
)后重新用 root 用户启动 dmap 服务(./DmAPService start
),或者在使用 dmrman 命令时添加参数 use_ap=2,不使用 dmap 辅助服务,这样可以避免由于 dmap 服务权限不够引发该报错。建议统一使用 dmdba 用户对数据库进行管理和维护。
命令行如何开启 dmap 服务
有两种启动的方式
- 直接进入安装目录的 bin 目录下执行
./dmap
。 - 注册 dmap 服务,用服务的方式启动 dmap 服务。具体的操作可以参考安装目录 doc 目录下的:“ DM_Linux 服务脚本使用手册”。
-8273 无效的备份集目录
需要把整个的备份集目录复制到对应目录,然后执行 dmrman ,对备份集进行校验,校验备份集是否存在及合法。
./dmrman CTLSTMT="CHECK BACKUPSET '/data/dmbak/BACKUP_FULL_20210223'"
备注:
备份集用来存放备份过程中产生的备份数据及备份信息。
一个备份集对应了一次完整的备份。
一般情况下,一个备份集就是一个目录,备份集包含一个或多个备份片文件,以及一个备份元数据文件。
备份片文件后缀为.BAK,用来存放备份数据。
元数据文件用来存放备份信息,元数据文件的后缀为.META。
这个报错可能是备份有问题,需要确认怎么生成的备份文件,还原的时候需要用完整的备份集进行还原。
在进行数据库还原的时候,需要用对数据备份文件有权限的用户来做还原,比如 dmdba 用户。
arch 归档的 log 日志可以恢复到之前的数据状态吗
需要完整的备份集以及完整连续的归档才能还原,详细信息可以参考安装目录 doc 目录下的 DM 备份还原手册。
警告窗口:库、表空间的联机备份操作需要数据库实例运行在归档模式并处于打开状态,检测到当前实例不满足备份条件,请调整实例状态然后再进行备份操作
需要开启归档,参考:配置本地归档
备份报错:归档日志不连续
【问题解决】:
联机备份时,关闭已配置的本地归档之后再重新打开,会造成归档文件中部分日志缺失,备份时检查归档文件连续性时将会报错。
在执行联机数据库备份过程中,如果报错归档不连续,则需要先执行生成检查点操作,才能正常备份。例如:checkpoint(100);或者,重启数据库。
物理全库备份还原后,启动目的端数据库报错版本不匹配
【问题原因】:
物理全库备份还原后,启动目的端数据库报错:
db version mismatch,database version [0x7000c]>dmserver support db_version[0x7000b]
此为高版本向低版本降级报错,一般不建议做数据库降级。
【解决方案】:
将目的端数据库升级和源端一致,然后再做全库物理备份还原。或者做逻辑导入导出,将源端高版本 bin 目录拷贝到目的端低版本的数据库中,再执行 dimp 导入工作。
DM8 企业版还原到安全版报错:标记不匹配
【问题说明】:
dm8 企业版的脱机备份,用物理备份恢复还原到安全版,在做新建表插入数据的时候,会报错提示标记不匹配。
【解决方法】:
跨版本问题,重新初始一个新库,用 DTS 迁移。
新建的备份作业未运行,没有报错,也看不到历史运行记录
【问题原因】:
一般是新建备份作业的设置问题。
检查新建作业调度是否启用,如下图所示的位置:
同时在新建作业步骤--高级选项中--作业,检查作业步骤完成后的操作,如下图所示的位置:
当作业调度未启用,且设置作业完成后,无论成功与失败均“不报告执行成功并结束作业”,则会导致作业未运行且看不到历史运行记录。
从数据库实例 A 备份还原到已有的数据库实例 B 上,用原实例 B 的数据库账号密码登录报错
【问题分析】:
登录账号密码也属于实例的对象成员之一,因此从数据库实例 A 备份还原到已有的数据库实例 B 后,原实例 B 的所有对象成员已变成 A 实例的对象成员,所以原账号不能登录,用备份实例 A 的系统账号密码登录即可。
如何对备份进行加密
【问题描述】
在达梦数据库中如何对备份进行加密?如果使用作业备份又如何加密备份?
【问题解决】:
DM 支持对备份数据进行加密处理,备份加密包括加密密码、加密类型和加密算法三个要素。加密密码通过使用 IDENTIFIED BY< 加密密码 > 来指定,使用备份集的时候必须输入对应密码。加密类型分为不加密、简单加密和完全加密。简单加密仅仅对部分数据进行加密,加密速度快;完全加密对所有数据执行加密,安全系数高。
- 例如:创建加密密码为“abc123456”,加密算法为“rc4”的完全加密全备:
BACKUP DATABASE BACKUPSET '/dm/dmbak/dbbak_scprit' IDENTIFIED BY "abc123456" WITH ENCRYPTION 2 ENCRYPT WITH RC4;
- 当使用作业备份时可以通过创建存储过程,备份作业调用的方式来对备份进行加密,具体方法如下示例:
- 全量备份及删除策略配置
在全量备份执行成功后进行删除备份操作,若全量备份执行失败,则结束作业。
(1)通过以下 SQL 创建备份作业存储过程
CREATE OR REPLACE PROCEDURE FULLBAK AS
DECLARE
V_DATE VARCHAR2(30);
STR VARCHAR2(200);
BEGIN
SELECT TO_CHAR(SYSDATE(),'YYYYMMDDHH24MISS') INTO V_DATE;
STR:= 'backup database backupset ''/dmbak/full_bak'||V_DATE||''' IDENTIFIED BY "******";';
EXECUTE IMMEDIATE STR;
END;
(2)登录管理工具——右键点击代理——创建代理环境
(3)右键点击作业——新建作业
(4)创建步骤一为全量备份调用刚才创建的全备存储过程
call"SYSDBA"."FULLBAK"();
(5)在步骤一中点击“高级”设置成功时“报告执行成功并继续执行下一步”,以及失败时“报告执行失败并结束作业”。
(7)创建步骤二,删除备份,在作业步骤中继续添加删除作业。
(8)配置删除策略中的路径和保留时间,按照实际要求填写即可,30 即保留 30 天的备份作业。
SF_BAKSET_BACKUP_DIR_ADD('DISK','/dmbak');
call SP_DB_BAKSET_REMOVE_BATCH('DISK',SYSDATE-30);
(9)可在高级中设置成功时“报告执行成功并结束作业”,以及失败时“报告执行失败并结束作业”。方便在历史作业信息中查看备份情况。
(10)设置作业调度,设置作业每周六晚 22:00 执行作业。
备份作业策略一般采用“全备 + 增备 + 删除”的策略。在主备自动切换的环境中,可以设置步骤一为增量备份,步骤二为全量备份,如果步骤一增量备份执行失败则执行步骤二进行全备,这样就可以避免因为发生主备库切换,备库由于没有全库备份,导致备份作业增备失败的问题。
- 以下介绍增量备份加全量备份的策略配置:
(1)通过以下 SQL 创建增量备份存储过程。
CREATE OR REPLACE PROCEDURE INCBAK AS
DECLARE
V_DATE VARCHAR2(30);
STR VARCHAR2(200);
BEGIN
SELECT TO_CHAR(SYSDATE(),'YYYYMMDDHH24MISS') INTO V_DATE;
STR:= 'backup database increment with backupdir ''/home/dmdba/18/dmdata1/dmbak/'' backupset ''/home/dmdba/18/dmdata1/dmbak/inc_bak'||V_DATE||'''IDENTIFIED BY "******";';
EXECUTE IMMEDIATE STR;
END;
(2)右键点击作业——新建作业,创建增量备份作业。
(3)创建步骤一为差异增量备份。
call "SYSDBA"."INCBAK"();
(4)在步骤一中点击“高级”设置成功时“报告执行成功并结束作业”,以及失败时“报告执行失败并继续执行下一步”。
(5)继续创建步骤二:全量备份
call"SYSDBA"."FULLBAK"();
(6)在高级中设置成功时“报告执行成功并结束作业”,以及失败时“报告执行失败并结束作业”,方便在历史作业信息中查看备份情况。
(7)设置作业调度,设置每周除周六外,每晚 22:00 做增备。
设置完成后点击确定,至此加密备份作业配置完成。
在增量备份作业配置完成后可以新建定时删除备份作业任务,这样可以防止由于备份集一直增加导致磁盘被大量占用的问题。
更多备份还原操作可以参考《DM 备份与还原手册》(手册位于数据库安装路径 /dmdbms/doc
文件夹下)或前往达梦在线服务平台运维指南模块参考数据库备份还原章节相关内容。
注意如果基备份集没有指定加密类型,那么增量备份也不能指定加密类型; 如果基备份集指定了加密算法,那么增量备份的加密类型、加密算法和密码 必须与基备份保持一致。
编写脚本备份数据库,disql 一直提示无法获取一行数据,忽略此输入
【问题描述】:
利用如下脚本进行数据库备份,一直报错:无法获取一行数据,忽略此输入。
备份脚本如下:
#!/bin/bash
disql 用户名/密码<<EOF
backup database backupset '/dm/dmdbms/data/dmtest/bak';
EOF
exit 0
【问题解决】:
通过 disql 登陆数据库执行备份命令后,后续无退出数据库 disql 操作界面的 exit 命令。在脚本中添加数据库备份完成后退出数据库 disql 操作界面所使用的 exit 命令,重新运行后问题解决。
修改备份脚本如下:
#!/bin/bash
disql 用户名/密码<<EOF
backup database backupset '/dm/dmdbms/data/dmtest/bak';
exit;
EOF
exit 0
如何通过作业备份前一天的归档
【问题解决】:
代理作业中归档备份是备份所有的归档日志,而要只备份前一天的归档,可按照如下步骤进行:
- 开启 dmap 服务;
- 开启数据库归档;
- 右击管理工具-【代理】-【作业】-【新建作业】;
- 在作业名称和作业描述中填写备份名称和描述;
- 在作业步骤中选择步骤类型为【SQL 脚本】,并写入如下内容:
declare
adb varchar(36);
ad varchar(36);
abc varchar(500);
begin
adb:=to_char(sysdate-1);
ad:=to_char(sysdate, 'yyyymmdd_hh24miss') ;
abc :='backup archivelog from time '''||adb||''' backupset ''E:\DB\dmdata\bak\ARCHBAK_'||ad||''';';
print (abc);
execute immediate abc;
end;
- 在作业调度中选择备份的时间策略,按需要设置【发生频率】;
- 保存作业即可。
用控制台还原数据库,报错:【-802】非法 ini 配置参数
【问题解决】:
利用控制台进行还原操作时,尝试在【环境指定】中,不指定 DFS_INI 参数,将其设置为空即可。
脱机备份还原报错[-7169]:bakres 与 DMAP 消息通信失败
【问题解决】:
出现该报错原因是:DMAP 服务未开启,请先关闭实例服务,再开启 DMAP 服务。
DMAP 服务状态查询:在安装目录 bin 下执行:./DmAPService status
若手动启动报错:
[root@hlwu5-no bin]# ./DmAPService start
Starting DmAPService: Last login: Wed Nov 17 16:56:43 CST 2021 [ FAILED ] comm_create_lsnr_sockets_low failed to create socket or listen port:4236, errno:98.
则说明 dmap 服务进程已经占用了端口 4236,如下图:
手动 kill 掉进程 19410,重新手动启动 dmap 服务就可以正常进行备份还原了。
如何修改归档日志相关设置
【问题解决】:
- 开启归档
--修改数据库为 MOUNT 状态
ALTER DATABASE MOUNT;
--配置本地归档
ALTER DATABASE ADD ARCHIVELOG 'DEST = /dmdata/dameng/arch_dsc0, TYPE = local,
FILE_SIZE = 1024, SPACE_LIMIT = 0;
--开启归档模式
ALTER DATABASE ARCHIVELOG;
--修改数据库为 OPEN 状态
ALTER DATABASE OPEN;
- 修改归档日志最大保存空间
ALTER DATABASE MOUNT;
---修改 SPACE_LIMIT 参数
ALTER DATABASE MODIFY ARCHIVELOG 'DEST = C:\dmdbms\data\DAMENG\arch, TYPE = local,FILE_SIZE = 1024, SPACE_LIMIT = 2048';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
- 增加一个归档路径
ALTER DATABASE MOUNT;
ALTER DATABASE add ARCHIVELOG 'DEST = C:\dmdbms\data\DAMENG\arch2, TYPE = local,FILE_SIZE = 1024, SPACE_LIMIT = 2048';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
- 删除一个归档路径
ALTER DATABASE MOUNT;
alter database noarchivelog;
alter database delete archivelog 'type=LOCAL,dest=C:\dmdbms\data\DAMENG\arch2,file_size=1024,space_limit=2048';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
- 查询归档配置
select * from v$dm_arch_ini;
注意在进行归档设置时,必须先设置数据到 mount 模式,并且修改为非归档模式后,再执行修改和删除操作,否则会提示语句不合法。
备份还原表结构报错:[-8324]:还原目标表定义不匹配
【问题描述】:
SQL> create table stu (id char(10),sname varchar(20));
SQL> BACKUP TABLE stu BACKUPSET '/dm8/dmdba/bak_test/stu_bak_02';
SQL> alter table stu add column(age int);
SQL> restore table struct from backupset '/dm8/dmdba/bak_test/stu_bak_02';
restore table struct from backupset '/dm8/dmdba/bak_test/stu_bak_02';
[-8324]:还原目标表定义不匹配.
【问题解决】:
需要先将表结构发生变化的表 drop,再重新还原。
SQL> drop table stu;
操作已执行
已用时间: 22.879(毫秒). 执行号:1004.
SQL> restore table struct from backupset '/dm8/dmdba/bak_test/stu_bak_02';
操作已执行
已用时间: 7.035(毫秒). 执行号:1005.
数据库如何恢复到指定时间点
【问题解决】:
当用户进行误操作数据或者数据表后,可以利用先前存在的备份将数据库恢复到误操作前,确保数据库能正常运行。要点如下:
1.确保数据库已开启归档,且有完整的备份策略;
2.对数据库进行误操作后,要记录下误操作的时间,并找到最新的备份文件;
3.如果不针对数据库进行时间点还原,则只会恢复数据库到备份前的状态;
4.恢复数据库到指定时间点,一定要保证归档的连续性,否则会失败;
5.对数据库进行时间点还原,一定要在自己记录下的时间往前推一点时间。
恢复步骤如下:关闭数据库,使用 dmrman 工具备份还原,恢复数据库。恢复数据库到指定时间点需要借助归档文件,指定时间点要往前推(例如:误操作时间为 2021-12-07 00:02:44 左右,这里考虑往前推 30 秒)。
还原:RESTORE DATABASE '/dmdata/DAMENG/dm.ini' from backupset '/dmdata/dmbak/BAK_FULL_20211206BAK';
恢复:RECOVER DATABASE '/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmdata/arch' UNTIL TIME ' 2021-12-07 00:02:10';
更新:RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC;
详细步骤参考 恢复到指定时间点。
如何联机还原表,有哪些注意要点?
【问题解决】:
对表进行误操作后,由于生产繁忙,不利于对表进行脱机恢复,因此利用原有备份对表进行联机还原。
1.对表进行联机还原的前提是要有表 test 的备份。
2.对表进行联机恢复时,要先恢复表结构,再恢复表数据。
3.对表进行联机还原时,数据库必须处于 OPEN 状态,MOUNT 和 SUSPEND 状态下不允许执行表还原。
以下以一实例介绍联机还原表的具体步骤:
1.在表 test 中创建以 ID 为条件的唯一索引,并联机备份表 test,如下图所示:
2.误操作表 test 中的数据,此时使用备份直接还原表 test 会报错:[-8327]:还原表中存在二级索引或冗余约束。如下图所示。这是因为 test 表里存在唯一索引,还原表的时候必须先还原表的结构,再还原表数据,就可以联机恢复表 test 了。
3.先还原表结构,再还原表数据。
注意STRUCT:执行表结构还原,若未指定,则认为是表中数据还原;表数据还原要求还原目标表结构与备份集中完全一致,否则报错,所以表结构还原可以在表数据还原之前执行,减少报错。
定时备份作业报错:-5597,无备份权限
【问题描述】:
定时备份作业报错:无备份权限。报错截图如下:
【问题解决】:
全库备份作业必须由具有 dba 权限的用户进行创建和修改。具有 ADMIN JOB 的权限但无 DBA 权限的用户,可以对备份作业修改保存,但该作业调度时会报该错误。
MPP 集群任意节点执行全备报错:[错误码[-10003]:-104]写备份文件
【问题解决】:
由于 mpp 中该备份操作对所有主机都会执行,因此需要核实 mpp 集群各节点备份路径权限是否为 755 或更高权限,备份路径的盘符空间是否充足。
传输备份文件出现丢包现象
【问题描述】:
服务器只能通过 xshell 远程传输文件,备份文件存放在外置存储中,单个备份文件大小 122g,通过 xshell 传入服务器后,无法通过该备份文件还原数据库,比对上传后的备份文件和外置存储的备份文件,发现 MD5 不一致,出现了丢包问题。
文件还原失败:报错-8230,备份解压失败。
【问题解决】:
该报错可能是由于网络策略限制或网络波动,导致单个大文件上传发生丢包情况。
解决办法:将大文件在本机上分卷压缩,再通过 xshell 上传至服务器中,比如 120g 文件分卷成 30 个 4g 的文件,上传后合并解压,避免直接传大文件出现错误。
上传后比对 MD5,确认无误后合并解压。
---合并
cat TEST.z* > FULLBAK.zip
---解压
unzip FULLBAK.zip
解压后再次比对大文件 MD5 无误后,再开始恢复。
备份集还原执行 recover 时报错:[-8363]从备份集生成临时日志文件失败
【问题解决】:
备份集 RECOVER 时会先在备份集目录生成归档临时文件,如果存放备份集目录的空间过小或者权限不足时,会出现 recover 失败和以上报错信息。
此时,可以把备份目录移动到剩余空间充足的磁盘并保证权限正常后,再进行还原。
dsc 环境执行备份失败报错:[-8117] 等待归档刷盘,请稍后重试
【问题解决】:
出现该报错原因为:归档文件中配置了共享本地归档的远程归档(arch_local_share=1),但是归档路径 ARCH_DEST、ARCH_INCOMING_PATH 设置的是本地磁盘,没有设置在共享存储上。导致在备份时找远程归档未找到而报错。
说明:arch_local_share:表示 DMDSC 集群本地归档是否共享给远程节点作为远程归档。0 表示不共享,1 表示共享。正常是 arch_local_share=1,本地归档和远程归档都需要配置在共享存储或者是 ASM 文件系统上,否则会因为找不到远程节点的归档日志报错。若 arch_local_share 配置为 0,则 remote 归档路径与对应节点 local 归档路径不能指向共享存储的同一个目录。
在达梦数据库中,差异增量备份和累积增量备份有什么区别?它们的还原结果一样吗?
【问题分析】:
一、差异增量备份和累积增量备份的区别:
差异增量备份的基备份集可以是一个完全备份集,也可以是一个增量备份集。会备份自上一次增量备份集或者完全备份集以来所有发生变化的数据块。
累积增量备份的基备份只能是一个完全备份集,会备份自上次完全备份集以来发生变化的数据块。相对数据量较大,占用空间多,但是恢复时间相对较少。
二、验证还原结果:
1.备份数据
---创建 tab1 表,并插入一条数据
create table tab1(a int,b varchar);
insert into tab1(a,b) values(1,'a');
commit;
---联机执行一次完全备份
backup database full backupset '/dmdata/dmbak/db_full_bak_01';
---在tab1表中再插入一条数据:
insert into tab1(a,b) values(2,'b');
commit;
---联机执行第一次差异增量备份
backup database increment with backupdir '/dmdata/dmbak' backupset '/dmdata/dmbak/db_increment_bak_01';
---联机执行第一次累计增量备份
backup database increment cumulative with backupdir '/dmdata/dmbak' backupset '/dmdata/dmbak/db_increment_cumulative_bak_01';
---在tab1表中再插入一条数据:
insert into tab1(a,b) values(3,'c');
commit;
---联机执行第二次差异增量备份
backup database increment with backupdir '/dmdata/dmbak' backupset '/dmdata/dmbak/db_increment_bak_02';
---联机执行第二次累计增量备份
backup database increment cumulative with backupdir '/dmdata/dmbak' backupset '/dmdata/dmbak/db_increment_cumulative_bak_02';
2.还原差异增量备份
(1)使用第一次差异增量备份还原数据库:
---还原
restore database '/dmdata/dmdb/DAMENG/dm.ini' from backupset '/dmdata/dmbak/db_increment_bak_01';
---恢复
recover database '/dmdata/dmdb/DAMENG/dm.ini' from backupset '/dmdata/dmbak/db_increment_bak_01';
---更新
recover database '/dmdata/dmdb/DAMENG/dm.ini' update db_magic;
此时,tab1 表中的数据为
(2)使用第二次差异增量备份
---还原
restore database '/dmdata/dmdb/DAMENG/dm.ini' from backupset '/dmdata/dmbak/db_increment_bak_02';
---恢复
recover database '/dmdata/dmdb/DAMENG/dm.ini' from backupset '/dmdata/dmbak/db_increment_bak_02';
---更新
recover database '/dmdata/dmdb/DAMENG/dm.ini' update db_magic;
此时,tab1 表中的数据为
3.还原累计增量备份
(1)使用第一次累积增量备份
---还原
restore database '/dmdata/dmdb/DAMENG/dm.ini' from backupset '/dmdata/dmbak/db_increment_cumulative_bak_01';
---恢复
recover database '/dmdata/dmdb/DAMENG/dm.ini' from backupset '/dmdata/dmbak/db_increment_cumulative_bak_01';
---更新
recover database '/dmdata/dmdb/DAMENG/dm.ini' update db_magic;
此时,tab1 表中的数据为
(2)使用第二次累积增量备份
---还原
restore database '/dmdata/dmdb/DAMENG/dm.ini' from backupset '/dmdata/dmbak/db_increment_cumulative_bak_02';
---恢复
recover database '/dmdata/dmdb/DAMENG/dm.ini' from backupset '/dmdata/dmbak/db_increment_cumulative_bak_02';
---更新
recover database '/dmdata/dmdb/DAMENG/dm.ini' update db_magic;
此时,tab1 表中的数据为
总结:根据以上验证过程可知,差异增量备份和累计增量备份的还原结果相同。
[-4558]: 数据文件已存在
【问题描述】:
使用 dmrman 在 RESTORE 进行数据库恢复时报错:[-4558] 数据文件已存在。
【问题解决】:
- 查看数据库恢复日志。
cat dm_BAKRES_202208
##通过dmrman CTLSTMT方式执行恢复,日志没有错误信息,只有一些提示信息
2022-08-16 09:48:16 [INFO] dmap_br P0000024574 PPID0000024572 CMD [BMML_INIT] is ready
2022-08-16 09:48:16 [INFO] dmap_br P0000024574 PPID0000024572 CMD [BMML_CFG_NON_BACKUP] is ready
2022-08-16 09:48:16 [INFO] dmap_br P0000024574 PPID0000024572 CMD [RESTORE_START] is ready
##进入DMRMAN命令中执行RESTORE命令,BAKRES会产生详细错误信息
RESTORE DATABASE '/dmdata/LN/XZZF/dm.ini' FROM BACKUPSET '/dmdata/dmbak/bak/DB_XZZF_INCREMENT_2022_08_15_00_08_15'
2022-08-16 10:03:12 [INFO] dmrman P0000024890 PPID4294967295 /dmdata/xxx/xxx/TBS_xxx.DBF already exists.
2022-08-16 10:03:12 [ERROR] dmrman P0000024890 PPID4294967295 CMD END.CODE:[-4558],DESC:[文件已存在]
2022-08-16 10:03:12 [ERROR] dmrman P0000024890 PPID4294967295 [-4558]:文件已存在
- 移除已存在文件。
mv /dmdata/xxx/xxx/xxx_xxx.DBF /dmdata/xxx/xxx/xxx_xxx_bak.DBF
- 重新执行还原和恢复即可。
RMAN> RESTORE DATABASE '/dmdata/xxx/xxxx/dm.ini' FROM BACKUPSET '/dmdata/dmbak/bak/DB_xxxx_INCREMENT_2022_08_15_00_08_15'
RESTORE DATABASE '/dmdata/xxx/dm.ini' FROM BACKUPSET '/dmdata/dmbak/bak/DB_xxxx_INCREMENT_2022_08_15_00_08_15'
[Percent:99.87%][Speed:0.00M/s][Cost:00:00:05][Remaining:00:00:00]
restore successfully.
RMAN> RECOVER DATABASE '/dmdata/xx/xxxx/dm.ini' FROM BACKUPSET '/dmdata/dmbak/bak/DB_xxxx_INCREMENT_2022_08_15_00_08_15';
RECOVER DATABASE '/dmdata/xx/xxxx/dm.ini' FROM BACKUPSET '/dmdata/dmbak/bak/DB_xxxx_INCREMENT_2022_08_15_00_08_15';
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[4787538]
备份集[/dmdata/dmbak/bak/DB_xxx_INCREMENT_2022_08_15_00_08_15]备份过程中未产生日志
recover successfully!
time used: 228.716(ms)
建议1.当提示的已存在数据文件并不在达梦数据库默认数据文件路径下时,可通过数据库恢复日志进一步查看已存在文件的具体路径。
2.建议创建数据文件时,放在统一目录下,方便维护。
如何避免定时删除备份作业执行后,无备份文件存在
【问题描述】:
达梦数据库可设置定时删除备份作业,但若运维人员长期未进行备份检查,且因某故障导致数据库近期无备份文件产生,此时执行定时删除备份作业,会导致数据库中无备份文件。
例如:定时删除备份作业为删除 7 天前的备份集,如果在 7 天内没有产生新的备份,或者说备份作业因为种种原因失效,此时删除 7 天前的备份集将会导致数据库失去备份冗余,如果此时发生数据库误操作或者其他需求,若没有数据库备份,将很难实现回退数据库至某一时间点。
【问题解决】:
以下提供三种方式来解决该问题,采用存储过程和作业策略的方式,保证在存在一定数量的备份集时再删除部分备份集。
方式一:创建存储过程进行判断,在符合判断条件下(存在一定数量的备份集)再删除备份集,替换原有的定时删除作业,每天定时执行。存储过程举例如下:
DECLARE --此过程避免在定时备份执行失败时删除全部备份集,此过程建议每天定时执行,替代原有的单一删除一定时间前备份集的删除策略
CON INTEGER; --备份集数量
BACKUPSETNAME VARCHAR(100);--最近一个备份集名字
CHECK_FLAG INTEGER; --备份校验标记
BEGIN
--添加备份路径 /opt/dmdbms/data根据现场实际需求进行配置
CALL SF_BAKSET_BACKUP_DIR_ADD('disk', '/opt/dmdbms/data');
--赋值CON为本库全量备份集数量
select
count(*)
INTO
CON
from
V$BACKUPSET
where
true
and "TYPE" =0
AND "RANGE#" =1
AND "OBJECT_NAME"=
(
select sys_context('USERENV', 'DB_NAME') from dual
);
--判断是否存在可用全库备份集,具体配置请合理评估后决定 CON值至少大于1,至少保留一次备份
IF CON > 2 THEN
--赋值BACKUPSETNAME为本库最近一次全量备份集名称
select
BACKUP_PATH
INTO
BACKUPSETNAME
from
V$BACKUPSET
where
true
and "TYPE" =0
AND "RANGE#" =1
AND "OBJECT_NAME"=
(
select sys_context('USERENV', 'DB_NAME') from dual
)
order by
BACKUP_TIME desc LIMIT 1;
--对本库最近一次全量备份集进行备份有效性校验
SELECT
SF_BAKSET_CHECK('DISK', BACKUPSETNAME)
INTO
CHECK_FLAG
FROM
DUAL;
IF CHECK_FLAG = 1 THEN
--删除一定时间以前的备份
call SP_DB_BAKSET_REMOVE_BATCH('DISK', SYSDATE-180);
END IF;
END IF;
END;
方式二:配置定时作业,将方法一中的存储过程配置到定时作业中。
第一步:右键作业-> 新建作业-> 常规配置。
第二步:配置作业步骤-> 添加 其中步骤类型选择 “SQL 脚本”,脚本语句就是创建的存储过程语句。
创建代理作业需要注意的是 sql 脚本的长度有精度限制,如果报错字符串截断,创建时删除一部分注释即可。
第三步:配置作业调度-> 新建 这里配置为每天凌晨 1 点执行,点击确定完成作业配置。
注意建议配置该作业调度为每天一次,如长时间没有执行该作业,可手动执行。但手动执行前此存储过程前,请提前进行数据备份,避免备份文件全部被删除。
方式三:配置作业在全量备份执行成功后进行删除备份操作,若全量备份执行失败,则结束作业。
第一步:新建全量备份作业。
第二步:设置作业步骤为完全备份。
第三步:点击“高级”设置成功时“报告执行成功并继续执行下一步”,以及失败时“报告执行失败并结束作业”。
第四步:在作业步骤中添加删除备份作业,并设置作业步骤。
也可在高级中设置成功时“报告执行成功并结束作业”,以及失败时“报告执行失败并结束作业”。方便我们在历史作业信息中查看备份情况。
第五步:设置作业调度,进行测试,设置作业每隔 2 分钟执行一次。(具体调度时间以实际需求为准,此设置只为进行测试)。
测试结果:全量备份失败时,不执行删除备份操作;全量备份成功时,进行下一步的删除备份操作。
以上三种方式均可避免定时任务清空备份集,其中前两种方式本质都是利用了存储过程来检查,当存在一定数量的备份集时再删除部分备份集;第三种方式则是使用了作业策略,每次删除操作都是在最新的备份成功后再执行,即可避免清空备份集。
DPC 集群( BS 模式)联机备份还原报错:“[-8379]:指定的 BAK MAGIC 值与备份集不匹配”
【问题描述】
DPC 集群( BS 模式)进行联机备份还原时报错:“[-8379]:指定的 BAK MAGIC 值与备份集不匹配”。
RESTORE DATABASE '/home/dmdba/test/BP2_B/DAMENG/dm.ini' FROM BACKUPSET '/dm/dpc_09/bp/BP1_C/DAMENG/bak/DB_DAMENG_FULL_20221028_192212_996485' use bak_magic 0
file dm.key not found, use default license!
Global parameter value of RLOG_RAFT_NEED_WAIT is illegal, use max value!
[-8379]:指定的BAK MAGIC值与备份集不匹配
【问题分析】
DPC 集群( BS 模式)进行联机备份还原时,检查 bak_magic 的编号会有两个不同的编号,当使用第二个 bak_magic 编号进行还原会报错:"[-8379]:指定的 BAK MAGIC 值与备份集不匹配",当使用第一个 bak_magic 编号进行还原时,可以正常进行还原。建议使用第一 bak_magic 编号进行还原。
【问题解决】
以备份集 “DB_DAMENG_FULL_20221028_192212_996485” 为例,进行还原。
- 查看 bak_magic 编号。
RMAN> show backupset
'/dm/dpc_09/bp/BP1_C/DAMENG/bak/DB_DAMENG_FULL_20221028_192212_996485' info meta
- 使用第一个 bak_magic 编号进行还原,还原成功。
RMAN> RESTORE DATABASE '/home/dmdba/test/BP2_B/DAMENG/dm.ini' FROM BACKUPSET
'/dm/dpc_09/bp/BP1_C/DAMENG/bak/DB_DAMENG_FULL_20221028_192212_996485'
use bak_magic 1469103806
使用 dmrman 工具进行还原时报错:“备份集版本不匹配”
【问题描述】
主库做联机备份后,把备份集拷贝到备库,在使用 dmrman 工具进行还原时报错:“备份集版本不匹配”,check 校验备份集时也报该错误。
【问题解决】
- 检查主备库的数据库版本是否一致,不一致则无法进行还原操作;
- 若主备库的数据库版本一致,则可以对拷贝过来的备份集压缩文件执行 Linux 命令 “md5sum 文件名”,通过对比拷贝前主库的备份 md5 值和拷贝到目的端的备份 md5 值,看其是否一致,如果不一致说明文件在拷贝过程中受到了损坏或者丢包,在还原时就会出现“备份集版本不匹配”的问题,需要重新拷贝。
dm8 普通用户无还原权限
【问题描述】
普通用户使用 backup table 备份表后,无法使用 restart table 进行还原。
【问题解决】
使用 DBA 用户,将 DBA 权限赋予该普通用户 USER01,即可进行还原操作。授权语句如下:
grant "DBA" to "USER01";
还原结束后需回收该普通用户 USER01 的 DBA 权限。使用 DBA 用户回收权限命令如下:
revoke "DBA" from "USER01";
如何还原归档?两个备份集中有重复归档文件如何处理?
【问题描述】
如何实现归档的备份还原及两个归档备份中有重复归档文件如何处理?、
【问题解决】
归档备份的还原,仅支持 dmrman 工具进行还原,具体方法如下:
- 确认需要还原的归档备份集 "bak_1228" 和归档备份还原的路径 "/dm/dsc/arch_restore"
- 在达梦数据库安装目录的 bin 目录下进入 dmrman;
- 执行以下命令进行还原;
RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET '/dm/dsc/arch_bak/bak_1228' to ARCHIVEDIR '/dm/dsc/arch_restore'
- 查看还原后的归档。
若两个备份集中存在部分相同的归档文件,直接执行还原命令会报错:“[-8354]:归档文件冲突,还原失败”。此时,若想将两个备份集中的相同归档文件跳过,需要在还原命令后加入 OVERWRITE 1
;
例如:
RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET '/dm/dsc/arch_bak/bak_1220' to ARCHIVEDIR '/dm/dsc/arch_restore' OVERWRITE 1
在还原命令后加入 OVERWRITE 1
后备份集中的重复归档文件被跳过,且跳过的记录记载于 ”dmdbms/log/dm_BAKRES_年月.log“ 日志中。
如何不开启 dmap 服务进行备份
【问题描述】
特殊情况下不能开启 dmap 服务或者 dmap 服务故障时,如何绕过 dmap 服务正常进行联机备份。
【问题解决】
将 dm.ini 文件中 BAK_USE_AP 参数值修改为 2 重启数据库后即可在关闭 dmap 服务或者 dmap 服务故障时进行联机备份操作。
参数说明:
参数名 | 默认值 | 属性 | 说明 |
---|---|---|---|
BAK_USE_AP | 1 | 动态,系统级 | 备份还原实现策略。 1:DMAP 辅助进程方式,要求必须启动 DMAP 服务,可支持第 三方备份。DMAP 插件执行,改造了备份还原任务子系统,允许 指定并行度,大幅提升了备份还原的效率,特别是加密、压缩的 处理效率。 2:无辅助进程方式,不依赖 DMAP,由主进程 DMSERVER 自身 执行备份还原,但不支持第三方备份。 |
注意此方式仅为特殊情况下使用,正常情况下应使用 dmap 服务。
备份集校验错误
【问题描述】
将 DW 集群( 2 节点)物理备份数据还原至 DSC 集群( 2 节点)出现报错:“[-8310]:备份集校验错误”。
[dmdba@dsc01 bin]$ ./dmrman dcr_ini=/opt/dsc/config/dmdcr.ini
dmrman V8
RMAN> RESTORE DATABASE '/opt/dsc/config/dsc0_config/dm.ini' FROM BACKUPSET '/opt/dmdbms/bak/DB_DAMENG_FULL_20230531_224129_680761';
RESTORE DATABASE '/opt/dsc/config/dsc0_config/dm.ini' FROM BACKUPSET '/opt/dmdbms/bak/DB_DAMENG_FULL_20230531_224129_680761';
file dm.key not found, use default license!
[-8310]:备份集校验错误
【问题分析】
该问题可能是由于备份集在传输过程中损坏导致或者是由于数据库版本跨度过大且是用高版本还原到低版本导致。
【问题解决】
- 在进行还原前校验备份集是否正常,如果备份集损坏则从新拷贝备份集进行还原。
- 建议采用相同版本的数据库进行备份还原操作,尽量避免从高版本数据库还原到低版本数据库。
如何使用作业进行归档备份
【问题解决】
例如,如下作业归档备份配置。
- 设置每 90 分钟进行增量归档备份,备份时间为 6 点到 24 点,增量备份失败自动进行全量归档备份。
call SP_CREATE_JOB('ARCH_BAK',1,0,'',0,0,'',0,'进行增量归档备份,增量备份失败自动进行全量归档备份');
call SP_JOB_CONFIG_START('ARCH_BAK');
call SP_ADD_JOB_STEP('ARCH_BAK', 'st1', 0, 'declare
v_time varchar(36);
bak_sql varchar(500);
begin
v_time:=to_char(sysdate,''yyyymmdd_hh24miss'') ;
bak_sql := ''backup archivelog all NOT BACKED UP backupset ''''/dmbak/RCPFDB/arch_bak''||v_time||'''''' ;'';
execute immediate bak_sql;
end;', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('ARCH_BAK', 'st1', 1, 1, 1, 0, 90, '06:00:00', '23:59:59', '2023-03-19 23:44:53', NULL, '');
call SP_JOB_CONFIG_COMMIT('ARCH_BAK');
- 每天 4 点删除 3 天前的归档备份。
call SP_CREATE_JOB('DELARCH_BAK',1,0,'',0,0,'',0,'删除归档备份');
call SP_JOB_CONFIG_START('DELARCH_BAK');
call SP_ADD_JOB_STEP('DELARCH_BAK', 'a', 0, 'call sf_bakset_backup_dir_add(''DISK'',''/dmbak/RCPFDB/arch_bak'');
call sp_arch_bakset_remove_batch(''DISK'',SYSDATE-3);', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('DELARCH_BAK', 'a', 1, 1, 1, 0, 0, '04:00:00', NULL, '2022-12-27 19:51:20', NULL, '');
call SP_JOB_CONFIG_COMMIT('DELARCH_BAK');
用户在参考该示例配置作业归档备份时需要按实际情况修改相关内容,如备份时间、路径等,相关参数解释可参考《DM8 作业系统使用手册》。
数据库存在列存储 HUGE 表时,物理全备无法对 HUGE 表数据进行备份
【问题描述】
当数据库存在列存储 HUGE 表时,物理全备无法对 HUGE 表数据进行备份。
【问题分析】
数据库的默认初始化参数 RLOG_GEN_FOR_HUGE 的值为 0,且初始化后不可更改该值,只有当初始化时指定了 RLOG_GEN_FOR_HUGE 的值为 1,备份数据库时才会备份 HUGE 表数据。
【问题解决】
- 当初始化时指定了 RLOG_GEN_FOR_HUGE 的值为 1 时,可以正常还原。
- 当初始化时 RLOG_GEN_FOR_HUGE 的值为 0 时,则在正常备份还原后,通过将 HMAIN 下数据文件利用 cp 拷贝至目的库 HMAIN 路径下,即可正常对列存表操作读写。
增量备份时报错:[-8036]:无基备份或无匹配基备份
【问题描述】
使用 base on 指定基备份进行增量备份时报错:[-8036]:无基备份或无匹配基备份。
【问题分析】
做增量备份需要扫描全量备份,如果全量备份和增量备份在不同目录,当用 base on 指定某个增备备份集作为基备份时会扫描不到需要使用到的全备,所以会报错“无基备份或无匹配基备份”。
【问题解决】
可以通过使用指定基备份搜索目录的方式进行增量备份,如下:
backup database increment with backupdir '/dmdata/dmbak','/dmdata/dmincr' backupset '/dmdata/dmincr/dmbak_incr_new';
批量安全删除满足指定条件的所有库级备份集报错:”-134: 执行码版本不匹配“
【问题描述】
在批量删除满足指定条件的所有库级备份集时报错:”-134: 执行码版本不匹配“。
call SF_BAKSET_REMOVE_BATCH_S ('DISK', SYSDATE-30,NULL,NULL);
【问题分析】
排查时发现同一台机器上安装了多个不同版本的数据库软件,但只启动了一个 dmap,该报错是由于执行该 sql 的库和已启动的 dmap 版本不一致导致。
【问题解决】
方法一:启动对应版本的 dmap ,如果无法直接启动可以关闭已启动的 dmap 服务再次启动需要使用到的 dmap 服务。
方法二:第一步,如果已启动的 dmap 服务不可关闭需要持续使用,可通过配置 dmap.ini 文件,内容可只配置一行“ AP_PORT=4237” , 避免端口冲突,前台启动或者注册 ap 服务后台启动;第二步,执行 sp_set_para_value(1,'EXTERNAL_AP_PORT',4237);
设置 dmap 的监听端口;第三步,执行 call SF_BAKSET_REMOVE_BATCH_S ('DISK', SYSDATE-30,NULL,NULL);
批量安全删除满足指定条件的所有库级备份集。
时区问题导致定时备份无法执行
【问题描述】
数据库时区与操作系统时区不一致,导致定时备份无法执行。
【问题分析】
- 通过查看数据库作业历史信息,发现配置好的全量备份、增量备份、定期清理备份文件的作业未执行。
- 作业历史信息没有作业执行相关信息。
- 通过查看数据库 dba_jobs 视图,没有相关执行信息。
- 查看操作系统时区和时间。
- 查看数据库 dm_svc.conf 中的时区和时间。
- 通过查看历史信息,发现操作系统时间是通过 date -s 命令设置导致操作系统时间与 +8:00 区时间一致,故而比数据库时间快 1 小时。
【问题解决】
- 修改操作系统时区为 Asia/Shanghai,再次查看时间恢复正常,且与数据库时间一致。
- 重启数据库服务后,再次测试调整定时备份时间,发现备份执行成功。
注意定时备份是依据数据库时区来决定的,如果数据库的时区与操作系统的时区不一致会影响定时备份是否被执行。可以通过校验 dm_svc.conf 文件中 TIME_ZONE=(480) 的值与操作系统 timedatectl 获取的时区是否一致,一致后如果定时备份还是未能成功执行,需要重启一次数据库服务,再次修改或重新创建定时备份等操作来确认定时备份是否会成功执行。
2 台服务器部署了多套主备实例后备份报错:权限不足
【问题描述】
2 台服务器部署了多套主备实例,每个实例都有启动独立的 DMAP 进程服务,且不同进程服务由不同的系统用户启动。当主备集群进行自动切换后备份作业执行失败,报权限不足错误。
【问题分析】
达梦在线备份和脱机备份还原默认都是通过 DMAP 进程服务进行,可并行,效率更高,还可支持第三方备份。Dmserver 进程无此优势。达梦的增量备份需要对应备份路径下有全备份的基文件,才能保证增量备份成功。
当 bak_use_ap=1 (默认配置值)时,dmserver 进程中执行备份还原命令时实际是将任务发给 DMAP 进程进行处理,当一台机器启动多个 DMAP 服务时,是发给哪个 DMAP 服务处理呢?其实是由实例的 dm.ini 中 EXTERNAL_AP_PORT 确定。该端口对应设置成 DMAP 服务的 dmap.ini 配置文件中的 ap_port。EXTERNAL_AP_PORT 设置成哪个端口,则对应的就是哪个端口的 DMAP 进程接收任务进行处理。
【问题解决】
在服务器部署多个实例且每个实例有自己的 AP 服务的主备架构,需要将主备的 dm.ini 文件中 EXTERNAL_AP_PORT 和 dmap.ini 配置文件中的 ap_port 保持一致,不能只修改主库 dm.ini 文件,这样才能避免主备切换时因未调整一致,导致发送到其它用户的 AP 进程处理,导致备份失败。
同时主备环境,建议备份路径使用共享目录(主备机器都可访问),避免因为使用本地盘作为备份路径导致主备切换后新主库目录不存在全备的基文件,导致增量备份失败;如果没条件使用共享目录,建议主备切换后,手动通过 cp 命令将原主库上最新全备复制到新主库备份目录或者在新主库手动执行一次全备。
补充:
单机部署多套不同版本的达梦数据库,不同版本服务需启动各自的版本的 AP 服务,实例 dm.ini 中的 EXTERNAL_AP_PORT 和各自版本的 dmap.ini 配置文件中的 ap_port 需保持一致,共用相同 AP 服务时,会因版本不匹配导致备份失败报错:“错误号:-134,错误消息:执行码版本不匹配”。
更多备份相关 dm.ini 参数,参考《DM8 系统管理员手册》。
注意实际使用过程中不建议在两台服务器上部署多套主备集群。
备份报错:”CODE:[-8086], DESC:[无效的 TRACE 文件“
【问题描述】
执行备份命令时报错:”CODE:[-8086], DESC:[无效的 TRACE 文件[../log/dm_SBTTRACE_202306.log]], COST:[00:00:00]“。
【问题分析】
此问题原因为 dmap 进程运行过程中 bin 目录或者产品被重装过导致,如下操作:
- dmap 进程正常运行;
- 删除数据库软件目录;
- 对数据库软件进行重新安装;
- 此时再对数据库进行 backup 备库就会报错:"CODE:[-8086], DESC:[无效的 TRACE 文件[../log/dm_SBTTRACE_202306.log]], COST:[00:00:00]"。
【问题解决】
可以通过以下两种方法解决:
方法 1:重新启动 dmap 服务进行备份;
方法 2:使用非 dmap 进程进行备份,方法如下:
- 执行以下命令修改参数 BAK_USE_AP 值为 2,不依赖 DMAP,由主进程 DMSERVER 自身执行备份还原,但不支持第三方备份。
SP_SET_PARA_VALUE(1,'BAK_USE_AP',2);
- 重新执行备份。
备份报错:“-8069 待备份文件无效”
【问题描述】
实例正常运行,但备份报错:“-8069 待备份文件无效”,备份日志中提示:“System information is invalid,please check ../DAMENG/SYSTEM.DBF or its mirror file”。
【问题分析】
排查后发现数据库服务器安装了加密软件,并对文件进行了加密存储。且加密软件白名单只添加了 dmserver 服务,导致备份时 dmrman 服务无法正常读取文件,除 dmrman 外 dmdbchk 也是同样的报错。
【问题解决】
关闭加密软件,使用数据库自带的存储加密和通讯加密。或者添加加密软件的白名单,将数据库下所有工具均加入白名单。
通过 dmrman 进行数据还原时报错:“打开文件失败”
【问题描述】
通过 dmrman 进行数据还原时报错:“打开文件失败”。
【问题分析】
该问题一般是由于备份集权限问题或 DMAP 服务启动用户为 root 导致。
【问题解决】
- 确保备份集文件的拥有者为 dmdba 用户并且具有备份集文件的读写权限。检查备份集文件及保存目录拥有者是否为 dmdba 用户,dmdba 用户是否有备份集文件的读写权限,如果权限存在问题请修改对应权限。
- 检查 DMAP 服务是否使用 dmdba 用户启动,如果为其它用户启动,需停止 DMAP 服务,使用 dmdba 用户启动 DMAP 服务。
如何将数据文件还原到指定的路径
【问题描述】
使用物理全量备份文件还原到一个新环境时,由于原始环境有两块数据盘,部分数据文件的路径和实例路径不一致,但新环境只有一块数据盘,在还原时如何能将数据文件还原到指定的路径。
【问题解决】
- 在 dmrman 中根据备份文件生成映射文件。
DUMP BACKUPSET '/home/dmdba/bak/FULL_BAK' DATABASE '/home/dmdba/cs/data/DAMENG/dm.ini' MAPPED FILE '/home/dmdba/cs/yingsfile.txt'
- 如新实例的路径为 /home/dmdba/data/DAMENG,则需要将 yingsfile.txt 文件中数据文件的路径修改为 /home/dmdba/data/DAMENG。
原始映射文件:
修改后的映射文件:
- 指定映射文件进行还原恢复。
RESTORE DATABASE '/home/dmdba/data/DAMENG/dm.ini' FROM BACKUPSET '/home/dmdba/bak/FULL_BAK' MAPPED FILE '/home/dmdba/cs/yingsfile.txt';
备份报错:“-8085: 第三方介质的命令非法”
【问题描述】
使用磁盘备份,指定备份介质为 tape,不指定 parms 参数时报错:
BACKUP DATABASE BACKUPSET '/home/dm bak/db_full_bak' DEVICE TYPE TAPE;
-8085: 第1 行附近出现错误:
第三方介质的命令非法
【问题分析】
新版本,备份介质是 tape,需要指定 parms 参数,否则会在解析的时候报错:“-8085: 第三方介质的命令非法”。
【问题解决】
添加 parms 参数,执行为传递第三方可识别的自定义字符串。 新版本必须要指定该参数,可随意填充空字符串绕过。
BACKUP DATABASE BACKUPSET '/home/dm bak/db_full_bak' DEVICE TYPE TAPE parms ' ';