数据库系统在运行过程中可能会发生一些故障。造成故障的原因多种多样,包括磁盘崩溃、电源故障、软件错误,甚至人为破坏。这些情况一旦发生,就可能会丢失数据,数据库系统将无法正常运行。因此,故障恢复是数据库系统必不可少的组成部分,即数据库系统必须保证即使发生故障,也可以保障数据的完整性和一致性。
支持故障恢复的技术主要是日志,日志以一种安全的方式记录数据库系统变更的历史信息,一旦系统出现故障,数据库系统可以根据日志将系统恢复至故障发生前的某个时刻。数据库系统的日志分为两种类型:一是 REDO 日志,在数据被修改后记录它的新值;另一种是UNDO 日志,在数据被修改前记录它的旧值。
另外,当服务器处于归档模式时,如果数据库发生故障,通过备份文件和归档日志可以恢复到指定时间点。
-
物理备份与还原
- 1非归档模式下的全备与异机还原
数据库信息 |
源端 |
目标端 |
数据库名 |
dmdb1 |
dmdb2 |
数据文件路径 |
/dmdata/dmdb1 |
/dmdata/dmdb2 |
IP地址 |
192.168.1.11 |
192.168.1.12 |
1.1.1 前提条件:
- DmAPService 已启动
- 数据库实例已关闭
# # # |
ps -ef |grep dmap dmdba 9169 1 0 12:17 ? 00:00:03 /dm/bin/dmap –已经启动了 --手动启动DMAP: cd /dm/bin ./DmAPService start --关闭数据库实例 systemctl stop DmServicedmdb1.service |
1.1.2 源端使用dmrman工具冷备
# $ RMAN> |
su - dmdba cd /dm/bin ./dmrman backup database '/dmdata/dmdb1/dm.ini' backupset '/dmbak/dmdb1_full_01'; backup database '/dmdata/dmdb1/dm.ini' backupset '/dmbak/dmdb1_full_01'; file dm.key not found, use default license! Database mode = 0, oguid = 0 EP[0]'s cur_lsn[45684] BACKUP DATABASE [dmdb1],execute...... CMD CHECK LSN...... BACKUP DATABASE [dmdb1],collect dbf...... CMD CHECK ...... DBF BACKUP SUBS...... total 1 packages processed... total 3 packages processed... total 4 packages processed... DBF BACKUP MAIN...... BACKUPSET [/dmbak/dmdb1_full_01] END, CODE [0]...... META GENERATING...... total 6 packages processed... total 6 packages processed... total 6 packages processed! CMD END.CODE:[0] backup successfully! time used: 00:00:01.219 |
1.1.3 备份拷贝到目标库,目标库需提前安装数据库软件,不需要初始化实例
$ |
scp -r dmdb1_full_01 192.168.1.12:/dmbak/ scp /dmdata/dmdb1/dm.ini 192.168.1.12:/dmbak/ |
1.1.4 目标端创建相关目录
# $ |
su - dmdba scp -r dmdb1_full_01 192.168.1.12:/dmbak/ |
1.1.5 目标端先进行restore
使用 RESTORE 命令完成脱机还原操作,在还原语句中指定库级备份集,可以是脱机库级备份集,或是联机库级备份集。数据库的还原包括数据库配置文件还原和数据文件还原,
目 前 可 能需 要 还原 的数 据 库 配置 文 件包 括 dm.ini、 dm.ctl、 服 务器 秘 钥 文件(dm_service.prikey 或者 dm_external.config,若备份库指定 usbkey 加密,则无秘钥文件)、联机日志文件。
RMAN> |
cd /dm/bin ./dmrman restore database to '/dmdata/dmdb2' from backupset '/dmbak/dmdb1_full_01' rename to 'dmdb2'; restore database to '/dmdata/dmdb2' from backupset '/dmbak/dmdb1_full_01' rename to 'dmdb2'; RESTORE DATABASE CHECK...... chattr: 没有那个文件或目录 当尝试对/dmdata/dmdb2/dm.ctl进行stat调用时 RESTORE DATABASE,dbf collect...... RESTORE DATABASE,dbf refresh ...... RESTORE BACKUPSET [/dmbak/dmdb1_full_01] START...... total 4 packages processed... total 6 packages processed... RESTORE DATABASE,UPDATE ctl file...... RESTORE DATABASE,REBUILD key file...... RESTORE DATABASE,CHECK db info...... RESTORE DATABASE,UPDATE db info...... RESTORE DATABASE,REUSE or REBUILD dm.ini...... total 6 packages processed... total 6 packages processed! CMD END.CODE:[0] restore successfully. time used: 416.893(ms) |
1.1.6 目标端再进行recover.
使用 RECOVER 命令完成数据库恢复工作,可以是基于备份集的恢复工作,也可以是使用本地归档日志的恢复工作。如果还原后,数据已经处于一致性状态了,则可以使用更新DB_MAGIC 方式恢复,前提是不需要重做日志。
RMAN> |
recover database '/dmdata/dmdb2/dm.ini' from backupset '/dmbak/dmdb1_full_01'; recover database '/dmdata/dmdb2/dm.ini' from backupset '/dmbak/dmdb1_full_01'; Read ini warning, default dm.ctl backup path [/dmdata/dmdb2/ctl_bak] does not exist. Read ini warning, default backup path [/dmdata/dmdb2/bak] does not exist. Database mode = 0, oguid = 0 EP[0]'s cur_lsn[45684] RESTORE RLOG CHECK...... CMD END.CODE:[603],DESC:[备份集[/dmbak/dmdb1_full_01]备份过程中未产生日志] 备份集[/dmbak/dmdb1_full_01]备份过程中未产生日志 recover successfully! time used: 292.056(ms) |
1.1.7 目标端最后进行数据库更新
数据库更新是指更新数据库的 DB_MAGIC,并将数据库调整为可正常工作状态,与数据
库恢复一样使用 RECOVER 命令完成。数据库更新发生在重做 REDO 日志恢复数据库后,或
者目标库不需要执行重做日志已经处于一致状态的情况。
RMAN> |
recover database '/dmdata/dmdb2/dm.ini' update db_magic recover database '/dmdata/dmdb2/dm.ini' update db_magic Read ini warning, default dm.ctl backup path [/dmdata/dmdb2/ctl_bak] does not exist. Read ini warning, default backup path [/dmdata/dmdb2/bak] does not exist. Database mode = 0, oguid = 0 EP[0]'s cur_lsn[45684] EP[0]'s apply_lsn[45684] >= end_lsn[45684] recover successfully! time used: 989.704(ms) |
1.1.8 目标端启动实例
$ SQL> |
dmserver /dmdata/dmdb1/dm.ini --另开一个窗口 disql sysdba/dameng123 select name,status$,host_name from v$instance; 行号 NAME STATUS$ HOST_NAME ---------- ------ ------- --------- 1 DMDB81 OPEN dmdb83 –这里实例名并没有改过来 |
1.1.9 目标端添加服务
# |
su - root cd /dm/script/root ./dm_service_installer.sh -t dmserver -dm_ini /dmdata/dmdb2/dm.ini -p dmdb2 |