一、备份还原简介
数据库备份是 DBA 日常最重要的工作内容。备份的主要目的是数据容灾,保证数据的安全性,在数据库发生故障时,通过还原备份集,将数据恢复到可用状态。
下面主要讲一下以联机执行SQL 语句进行备份还原和脱机工具 DMRMAN 进行备份还原的方式。
二、归档配置
备份与恢复过程都依赖归档日志,归档日志是保证数据一致性和完整性的重要保障。配有归档日志的数据库系统在出现故障时丢失数据的可能性更小,这是因为一旦出现介质故障如磁盘损坏时,利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时间点。
使用如下语句检查DM归档是否开启:
select arch_mode from v$database
ARCH_MODE字段查询结果为“Y”表示已开启,如果为“N”,则DM数据库归档未开启。
或者查看配置文件dm.ini,参数ARCH_INI的值:1表示已开启归档,0表示未开启归档
可以使用如下系列命令开启归档模式。开启归档模式,需要确定归档类型、归档路径、归档文件大小、归档空间大小限制参数,根据实际情况进行设置。
alter database mount;
alter database add archivelog 'dest=/dmdata/dmarch/arch,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=102400';
alter database archivelog;
alter database open;
或者修改配置文件dm.ini中的参数ARCH_INI=1,在dm.ini所在目录中,创建dmarch.ini文件并添加以下内容后,重启数据库实例。
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/dmarch/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 102400
ARCH_FLUSH_BUF_SIZE = 0
ARCH_HANG_FLAG = 1
三、使用disql进行联机备份还原
使用 DIsql 工具备份数据库、用户表空间、用户表和归档,系统必须处于归档模式下时,才允许进行数据库联机备份且保证数据库处于 OPEN 状态。
1 备份数据库
1.1 完全备份
执行数据库备份,数据库必须处于 OPEN 状态,MOUNT 和 SUSPEND 状态下不允许执行数据库备份。
在disql 中输入备份数据库语句,最简单的不设置其他参数的完全备份语句如下:
指定备份集路径为“/home/dm_bak/db_full_bak_01”
BACKUP DATABASE FULL BACKUPSET ‘/home/dm_bak/db_full_bak_01’;
这是最简单的数据库备份语句,如果要设置其他的备份选项需了解联机备份数据库的语法。 详细请参考《DM8备份与还原.pdf》中的3.2.2.1.1 概述。1.2 设置备份名
系统为每个备份指定一个备份名,它可作为识别备份的一种方式。备份时用户可以采用系统生成的备份名也可以指定属于自己的备份名。
创建备份集,备份名设置为“WEEKLY_FULL_BAK”。
1.3 增量备份
增量备份指基于指定的库(或者表空间)的某个备份(完全备份或者增量备份),备份 自该备份以来所有发生修改的数据页。执行增量备份的主要目的是快速备份数据库中的修改, 减少备份时间和避免重复的备份。
在disql 中输入备份数据库语句,最简单的不设置其他参数的增量备份语句如下:
BACKUP DATABASE INCREMENT WITH BACKUPDIR ‘/home/dm_bak’ BACKUPSET ‘/home/dm_bak/db_increment_bak_02’;
2 表空间备份
2.1 完全备份
表空间备份就是拷贝表空间内所有数据文件中的有效数据的过程。DM 仅支持表空间联机备份,完全备份一个表空间步骤如下:
在 disql 中输入备份表空间语句,最简单的不设置其他参数的完全备份表空间语句:
BACKUP TABLESPACE MAIN FULL BACKUPSET ‘/home/dm_bak/ts_full_bak_01’;
2.2 增量备份
执行表空间增量备份的主要目的同数据库增量备份一样是为了快速备份数据库中的修改,减少备份时间和避免重复的备份。
在disql 中输入备份表空间语句,最简单的不设置其他参数的增量备份语句如下:
BACKUP TABLESPACE MAIN
INCREMENT WITH BACKUPDIR ‘/home/dm_bak’
BACKUPSET ‘/home/dm_bak/ts_increment_bak_02’;
3 表备份
表备份拷贝指定表所使用的所有数据页到备份集中,并记录各个数据页之间的逻辑关系用来恢复表数据结构。表备份均为联机完全备份,不需要备份归档日志,不存在增量备份之说。当数据库中某张表比较重要而又没必要备份整个数据库或表空间时就可以选择表备份。完整的备份表步骤如下:
1.如有需要,可创建待备份的表 TAB1: SQL>CREATE TABLE TAB1(C1 INT);
2.在disql 中输入备份表语句,简单的备份语句如下:
BACKUP TABLE TAB1 BACKUPSET ‘/home/dm_bak/tab_bak_01’;
4 归档备份
归档备份拷贝指定归档目录下的所有的归档文件到备份集中,并记录各个归档文件的属性、文件大小以及 LSN 区间等。归档备份不存在增量备份之说。当需要保存库的归档时,可以使用归档备份。
在disql 中输入备份数据库语句。
通过 LSN BETWEEN … AND …来指定起始和截至 LSN。
首先,确定 LSN 范围。:
select ARCH_LSN, CLSN, PATH from V$ARCH_FILE;
通过查询结果选出备份的起始 LSN 和截至 LSN。比如 36766 38135
其次,备份归档:
BACKUP ARCHIVELOG LSN BETWEEN 36766 AND 38135 BACKUPSET ‘/home/dm_bak/arch_bak_time_36766-38135’;
5 数据还原
DM 仅支持表的联机还原,数据库、表空间和归档日志的还原必须通过脱机工具 DMRMAN执行。
5.1 表还原
执行表还原,数据库必须处于 OPEN 状态,MOUNT 和 SUSPEND 状态下不允许执行表还原。表还原不需要配置归档,因为表还原是联机完全备份还原,所以不需要借助本地归档日志进行恢复。
表结构还原:
表备份和目标表中都包含索引,如果直接执行表数据还原会报错:还原表中存在二级索引或冗余约束。创建待备份的表;
create table tab1 (a int, b varchar);
备份表数据;
BACKUP TABLE tab1 BACKUPSET ‘/home/dm_bak/tab1_bak_01’;
表结构还原:
RESTORE TABLE tab1 STRUCT FROM BACKUPSET
‘/home/dm_bak/tab1_bak_01’;
表数据还原:
RESTORE TABLE tab1 FROM BACKUPSET
‘/home/dm_bak/tab1_bak_01’
还原表数据,但不重建索引:
RESTORE TABLE tab1 WITHOUT INDEX
FROM BACKUPSET ‘/home/dm_bak/tab1_bak_01’;
还原表数据,但不还原约束:
RESTORE TABLE tab1 WITHOUT CONSTRAINT
FROM BACKUPSET ‘/home/dm_bak/tab1_bak_01’;
四、使用 DMRMAN工具进行脱机备份还原
1 备份数据库
1.1 完全备份
执行数据库备份要求数据库处于脱机状态。若是正常退出的数据库,则脱机备份前不需
要配置归档;若是故障退出的数据库,则备份前,需先进行归档修复。
备份到默认目录:
RMAN>BACKUP DATABASE '/dmdata/dmdb/DAMENG/dm.ini';
--命令执行完后会在默认的备份路径下生成备份集目录,默认的备份路径为 dm.ini 中BAK_PATH 的配置值,若未配置,则使用 SYSTEM_PATH 下的 bak 目录。
备份到指定目录:
RMAN>BACKUP DATABASE '/dmdata/dmdb/DAMENG/dm.ini' FULL BACKUPSET '/home/dm_bak/db_full_bak_01';
1.2 增量备份
增量备份指基于指定的库的某个备份(完全备份或者增量备份),备份自该备份以来所有发生修改了的数据页。脱机增量备份要求两次备份之间数据库必须有操作,否则备份会报
错。
RMAN>BACKUP DATABASE '/dmdata/dmdb/DAMENG/dm.ini' INCREMENT WITH BACKUPDIR '/home/dm_bak'BACKUPSET '/home/dm_bak/db_increment_bak_02';
--命令中的 INCREMENT 参数表示执行的备份为增量备份,增量备份时该参数不可省略。如果增量备份的基备份不在默认备份目录中,则必须指定 WITH BACKUPDIR 参数用于搜索基备份集。
2 备份归档
2.1 创建归档备份
使用 DMRMAN 备份归档需要设置归档,否则会报错。关闭数据库实例。
备份到默认目录:
RMAN>BACKUP ARCHIVE LOG DATABASE '/dmdata/dmdb/DAMENG/dm.ini';
--命令执行完后会在默认的备份路径下生成备份集目录,默认的备份路径为 dm.ini 中BAK_PATH 的配置值,若未配置,则使用 SYSTEM_PATH 下的 bak 目录。
备份到指定目录:
RMAN>BACKUP ARCHIVE LOG ALL DATABASE '/dmdata/dmdb/DAMENG/dm.ini' BACKUPSET
'/home/dm_bak/arch_all_bak_01';
--命令中的 ALL 参数表示执行的备份为备份所有的归档,也可以不指定该参数,DMRMAN默认执行的备份类型为 ALL 类型归档备份。
2.2 创建设置条件的归档备份
设置条件的归档备份指通过设置 LSN 或者时间点,控制需要备份归档的范围。
RMAN>BACKUP ARCHIVE LOG LSN BETWEEN 50000 AND 120000 DATABASE '/dmdata/DAMENG/dm.ini' BACKUPSET '/home/dm_bak/arch_lsn_bak_02';
3 数据库还原和恢复
使用 RESTORE 命令完成脱机还原操作,在还原语句中指定库级备份集,可以是脱机库级备份集,也可以是联机库级备份集。
3.1 还原数据库
RMAN>RESTORE DATABASE '/dmdata/dmdb/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_restore';
3.2数据库恢复
RMAN>RECOVER DATABASE '/dmdata/dmdb/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_arch/arch';
--使用 RECOVER DATABASE...UNTIL TIME 命令恢复到指定的时间:
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH ARCHIVEDIR'/home/dm_arch/arch' UNTIL TIME'2018-11-16 10:56:40';
--使用 RECOVER DATABASE...UNTIL LSN 命令恢复到指定的 LSN
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH ARCHIVEDIR'/home/dm_arch/arch' UNTIL LSN 50857;
3.3 查看备份集的数据库信息
RMAN>SHOW BACKUPSET '/home/dm_bak/db_full_bak' INFO DB;
3.4 更新数据库
RMAN>RECOVER DATABASE '/dmdata/dmdb/DAMENG_FOR_RESTORE/dm.ini' UPDATE DB_MAGIC
4 表空间还原和恢复
4.1 表空间还原
使用 RESTORE 命令完成表空间的脱机还原,还原的备份集可以是联机或脱机生成的库备份集,也可以是联机生成的表空间备份集 。脱机表空间还原仅涉及表空间数据文件的重建与数据页的拷贝。不需要事先置目标表空间为 OFFLINE 状态。
4.1.1 还原表空间
RMAN>RESTORE DATABASE '/dmdata/dmdb/DAMENG_FOR_RESTORE/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/home/dm_bak/ts_full_bak_for_restore';
4.1.2 恢复表空间
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RECOVER/dm.ini' TABLESPACE MAIN WITH ARCHIVEDIR '/home/dm_bak/ts_full_bak_for_recover';
5 归档还原与恢复
使用 RESTORE 命令完成脱机还原归档操作,在还原语句中指定归档备份集。备份集可以是脱机归档备份集,也可以是联机归档备份集。
5.1 还原归档
设置 OVERWRITE 为 2,如果归档文件已存在,会报错。
指定还原的目标归档日志目录:
MAN>RESTORE ARCHIVE LOG FROM BACKUPSET '/home/dm_bak/arch_all_for_restore' TO ARCHIVEDIR'/dmdata/dmdb/DAMENG_FOR_RESTORE/arch_dest' OVERWRITE 2;
指定还原目标库的 dm.ini 文件路径:
RMAN>RESTORE ARCHIVE LOG FROM BACKUPSET '/home/dm_bak/arch_all_for_restore' TO DATABASE '/dmdata/dmdb/DAMENG_FOR_RESTORE/dm.ini' OVERWRITE 2;
5.2 归档修复
使用 REPAIR 命令完成指定数据库的归档修复,归档修复会对目标库 dmarch.ini 中配置的所有本地归档日志目录执行修复。若目标库没有配置本地归档,则不执行修复。执行修复时,目标库一定不能处于运行状态。一般建议在数据库故障后,应立即执行归档修复, 否则后续还原恢复将会导致联机日志中未刷入本地归档的 REDO 日志丢失,届时再利用本地归档恢复将无法恢复到故障前的最新状态。
1.单机环境下,确保目标库已经停止工作后,执行归档修复;
RMAN> REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/data/dm.ini';
2.DSC 环境下,需要每个节点停止工作后,每个节点独立执行修复操作;
RMAN> REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/dsc/dm01.ini';
RMAN> REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/dsc/dm02.ini';