一、备份数据库
1.完全备份
执行数据库备份,数据库必须处于 OPEN 状态,MOUNT 和 SUSPEND 状态下不允许执行 数据库备份。
./disql
alter database mount;
alter database add archivelog ‘dest=/dm8/dmarch,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=1024’;
alter database archivelog;
alter database open;
DIsql 中输入备份数据库语句,最简单的不设置其他参数的完全备份语句如下:
SQL>BACKUP DATABASE FULL BACKUPSET ‘/dm8/dm_bak/db_full_bak_01’;
备份语句中的参数 FULL 可以省略,不指定备份类型会默认指定备份类型为完全备份。
2.增量备份
增量备份指基于指定的库(或者表空间)的某个备份(完全备份或者增量备份),备份
自该备份以来所有发生修改的数据页。执行增量备份的主要目的是快速备份数据库中的修改,
减少备份时间和避免重复的备份。
备份策略要根据可接受的最小恢复时间进行制定。例如,每周执行一次完全备份,每天
执行一次增量备份,那么恢复时要重做的归档就不会超过一天。
DIsql 中输入备份数据库语句,最简单的不设置其他参数的增量备份语句如下:
SQL>BACKUP DATABASE INCREMENT WITH BACKUPDIR ‘/dm8/dm_bak’ BACKUPSET ‘/dm8/dm_bak/db_increment_bak_02’;
备份语句中的 INCREMENT 参数不可省略,该参数用来指定执行的备份类型为增量备份。
若要创建累积增量备份,还需要指定 CUMULATIVE 参数,否则缺省为差异增量备份。WITH
BACKUPDIR 参数用来指定基备份集的搜索目录,如果基备份集不在默认备份目录或当前备份目录则该参数不可省略。
二、表空间备份
1.完全备份
SQL>BACKUP TABLESPACE MAIN BACKUPSET ‘ts_bak_01’;
备份集“ts_bak_01”会生成到默认的备份路径下。如要设置其他备份选项需参考下文的联机备份表空间语法。
SQL>BACKUP TABLESPACE MAIN FULL BACKUPSET ‘/dm8/dm_bak/ts_full_bak_01’;
备份语句中的 FULL 参数可以省略,不指定备份类型会默认指定备份类型为完全备份。
增量备份指定基备份集路径
以增量备份用户 MAIN 表空间为例,指定 BASE ON BACKUPSET 参数
2.增量备份
SQL>BACKUP TABLESPACE MAIN BACKUPSET ‘ts_full_bak_01’;
SQL>BACKUP TABLESPACE MAIN INCREMENT BACKUPSET ‘ts_increment_bak_01’;
SQL>BACKUP TABLESPACE MAIN INCREMENT BASE ON BACKUPSET ‘ts_full_bak_01’ BACKUPSET ‘ts_increment_bak_02’;
DIsql 中输入备份表空间语句,最简单的不设置其他参数的增量备份
语句如下:
SQL>BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR ‘/dm8/dm_bak’ BACKUPSET ‘/dm8/dm_bak/ts_increment_bak_02’;
三、表备份
DIsql 中输入备份表语句,简单的备份语句如下:
SQL>BACKUP TABLE TAB_01 BACKUPSET ‘/dm8/dm_bak/tab_bak_01’;
四、归档备份
SQL>BACKUP ARCHIVE LOG ALL BACKUPSET ‘arch_bak_01’;
备份集“arch_bak_01”会生成到默认的备份路径下。
五、加密备份
SQL>BACKUP DATABASE BACKUPSET ‘/dm8/dm_bak/db_bak_for_encrypt’ IDENTIFIED BY
"cdb546789";
SQL>BACKUP DATABASE BACKUPSET ‘/dm8/dm_bak/db_bak_for_encrypt’ IDENTIFIED BY
"cdb546789" ENCRYPT WITH RC4;
若指定了加密密码,但加密类型 WITH ENCRYPTION 指定为 0,则为非加密备份,如下所示:
SQL>BACKUP DATABASE BACKUPSET ‘/dm8/dm_bak/db_bak_for_encrypt’ IDENTIFIED BY
"cdb546789" WITH ENCRYPTION 0;
备份数据库,输入以下语句:
SQL>BACKUP DATABASE BACKUPSET ‘/dm8/dm_bak/db_bak_for_encrypt_01’ IDENTIFIED BY "cdb546789" WITH ENCRYPTION 2 ENCRYPT WITH RC4;
六、表还原
1) 保证数据库为 OPEN 状态;
2) 创建待备份的表;
SQL>CREATE TABLE TAB_FOR_RES_01(C1 INT);
3) 备份表数据;
SQL>BACKUP TABLE TAB_FOR_RES_01 BACKUPSET ‘/dm8/dm_bak/tab_bak_for_res_01’;
4) 校验备份,此步骤为可选;
SQL>SELECT SF_BAKSET_CHECK(‘DISK’,’/dm8/dm_bak/tab_bak_for_res_01’);
5) 还原表数据。
SQL>RESTORE TABLE TAB_FOR_RES_01 FROM BACKUPSET
‘/dm8/dm_bak/tab_bak_for_res_01’;
表还原实质是表内数据的还原,以及索引和约束等的重建。如果备份文件与目标表中都包含索引或约束该如何还原呢?下面以表中包含索引为例说明如何还原表,具体步骤如下:
1) 保证数据库为 OPEN 状态;
2) 创建待备份的表;
SQL>CREATE TABLE TAB_FOR_RES_02(C1 INT);
3) 创建索引;
SQL>CREATE INDEX I_TAB_FOR_RES_02 ON TAB_FOR_RES_02(C1);
4) 备份表;
SQL>BACKUP TABLE TAB_FOR_RES_02 BACKUPSET ‘/dm8/dm_bak/tab_bak_for_res_02’;
5) 校验备份,此步骤为可选;
SQL>SELECT SF_BAKSET_CHECK(‘DISK’,’/dm8/dm_bak/tab_bak_for_res_02’);
6) 执行表结构还原,表备份和目标表中都包含索引,如果直接执行表数据还原会报错:
还原表中存在二级索引或冗余约束;
SQL>RESTORE TABLE TAB_FOR_RES_02 STRUCT FROM BACKUPSET
‘/dm8/dm_bak/tab_bak_for_res_02’;
7) 执行表数据还原。
SQL>RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET
‘/dm8/dm_bak/tab_bak_for_res_02’;
指定还原时不重建索引
表备份时会默认备份表中的索引,还原时使用RESTORE TABLE...WITHOUT INDEX...
语句可选择不还原索引。完整示例如下:
1) 保证数据库为 OPEN 状态;
2) 准备数据,创建待备份的表及索引;
SQL>CREATE TABLE TAB_FOR_IDX_01(C1 INT);
SQL>CREATE INDEX I_TAB_FOR_IDX_01 ON TAB_FOR_IDX_01 (C1);
3) 备份表数据;
SQL>BACKUP TABLE TAB_FOR_IDX_01 BACKUPSET ‘/dm8/dm_bak/tab_bak_for_res_01’;
4) 校验备份,此步骤为可选;
SQL>SELECT SF_BAKSET_CHECK(‘DISK’,’/dm8/dm_bak/tab_bak_for_res_01’);
5) 还原表数据,但不重建索引。
SQL>RESTORE TABLE TAB_FOR_RES WITHOUT INDEX FROM BACKUPSET ‘/dm8/dm_bak/tab_bak_for_res_01’;
指定还原时不重建约束
表备份时会默认备份表中的索引定义,还原时使用 RESTORE TABLE...WITHOUT CONSTRAINT...语句可选择还原时不重建约束。完整示例如下:
1) 保证数据库为 OPEN 状态;
2) 准备数据,创建待备份的表及索引;
SQL>CREATE TABLE TAB_FOR_CONS_01(C1 INT);
SQL>CREATE INDEX I_TAB_FOR_CONS_01 ON TAB_FOR_CONS_01 (C1);
3) 备份表数据;
SQL>BACKUP TABLE TAB_FOR_CONS_01 BACKUPSET ‘/dm8/dm_bak/tab_bak_for_res_01’;
4) 校验备份,此步骤为可选;
SQL>SELECT SF_BAKSET_CHECK(‘DISK’,’/dm8/dm_bak/tab_bak_for_res_01’);
5) 还原表数据,但不还原约束。
SQL>RESTORE TABLE TAB_FOR_RES WITHOUT CONSTRAINT FROM BACKUPSET ‘/dm8/dm_bak/tab_bak_for_res_01’;
七、使用DMRMAN 进行备份
1.备份数据库
完全备份
1) 保证数据库处于脱机状态;
2) 启动 DMRMAN 命令行工具;
3) DMRMAN 中输入以下命令:
RMAN>BACKUP DATABASE ‘/dm8/data/DAMENG/dm.ini’ FULL BACKUPSET ‘/dm8/dm_bak/db_full_bak_01’;
命令中的 FULL 参数表示执行的备份为完全备份,也可以不指定该参数,DMRMAN 默认执行的备份类型为完全备份。
创建增量备份
1) 保证数据库处于脱机状态;
2) 启动 DMRMAN 命令行工具;
3) DMRMAN 中输入以下命令:
RMAN>BACKUP DATABASE ‘/dm8/data/DAMENG/dm.ini’ INCREMENT WITH BACKUPDIR ‘/dm8/dm_bak’ BACKUPSET ‘/dm8/dm_bak/db_increment_bak_02’;
命令中的 INCREMENT 参数表示执行的备份为增量备份,增量备份时该参数不可省略。
如果增量备份的基备份不在默认备份目录中,则必须指定 WITH BACKUPDIR 参数用于搜索基备份集,或者使用 CONFIGURE DEFAULT BACKUPDIR 命令配置默认的基备份集搜索目录。
2.备份归档
创建归档备份
1) 配置归档;
2) 保证数据库处于脱机状态;
3) 启动 DMRMAN 命令行工具;
4) DMRMAN 中输入以下命令:
RMAN>BACKUP ARCHIVE LOG ALL DATABASE ‘/dm8/data/DAMENG/dm.ini’ BACKUPSET
‘/dm8/dm_bak/arch_all_bak_01’;
命令中的 ALL 参数表示执行的备份为备份所有的归档,也可以不指定该参数,DMRMAN默认执行的备份类型为 ALL 类型归档备份。
创建设置条件的归档备份
1) 配置归档;
2) 保证数据库处于脱机状态;
3) 启动 DMRMAN 命令行工具;
4) DMRMAN 中输入以下命令:
RMAN>BACKUP ARCHIVE LOG LSN BETWEEN 5000 AND 12000 DATABASE ‘/dm8/data/DAMENG/dm.ini’ BACKUPSET ‘/dm8/dm_bak/arch_lsn_bak_02’;
命令中的 LSN BETEEWN start AND end 表示备份 LSN 值在 start 与 end 之间的归档,也可以设置 FROM LSN(TIME)或 UNTIL LSN(TIME)。
3.加密备份
加密备份过程中参数 IDENTIFIED BY 必须指定,参数 WITH ENCRYPTION 和参数ENCRYPT WITH 可不指定。加密备份时若不指定 WITH ENCRYPTION 参数,则该参数默认为 1,若不指定 ENCRYPT WITH 参数,则该参数默认值为 AES256_CFB。
例如,以下两种加密备份命令都是合法的:
RMAN>BACKUP DATABASE ‘/dm8/data/DAMENG/dm.ini’ BACKUPSET ‘/dm8/dm_bak/db_bak_for_encrypt_01’ IDENTIFIED BY "cdb546789";
RMAN>BACKUP DATABASE ‘/dm8/data/DAMENG/dm.ini’ BACKUPSET ‘/dm8/dm_bak/db_bak_for_encrypt_02’ IDENTIFIED BY "cdb546789" ENCRYPT WITH RC4;
若指定了加密密码,但加密类型 WITH ENCRYPTION 参数指定为 0,则为非加密备份,如下所示:
RMAN>BACKUP DATABASE ‘/dm8/data/DAMENG/dm.ini’ BACKUPSET ‘/dm8/dm_bak/db_bak_for_encrypt_03’ IDENTIFIED BY "cdb546789" WITH ENCRYPTION 0;
下面以数据库完全备份为例,创建加密密码为“cdb546789”,加密算法为“rc4”的
复杂加密类型的数据库加密备份,完整步骤如下:
1) 保证数据库处于关闭状态;
2) 备份数据库。启动 DMRMAN 工具并输入以下命令:
RMAN>BACKUP DATABASE ‘/dm8/data/DAMENG/dm.ini’ BACKUPSET ‘/dm8/dm_bak/db_bak_for_encrypt_04’ IDENTIFIED BY "cdb546789" WITH ENCRYPTION 2 ENCRYPT WITH RC4;
对于增量备份加密,如果基备份存在加密,则增量备份使用的加密密码、加密类型和加密算法必须与基备份保持一致;如果基备份未进行加密处理,则对增量备份使用的加密密码、
加密类型和加密算法没有特殊要求。
八、还原数据
数据库备份集分为联机和脱机两种类型。通常情况下,用户会在联机状态下备份数据库,
因此下面以联机数据库备份为例说明使用 DMRMAN 如何执行数据库还原操作。
1) 联机备份数据库,保证数据库运行在归档模式及 OPEN 状态;
SQL>BACKUP DATABASE BACKUPSET ‘/dm8/dm_bak/db_full_bak’;
2) 准备目标库。还原目标库可以是已经存在的数据库,也可使用 dminit 工具初始
化一个新库。如下所示:
./dminit path=/dm8/data db_name=DAMENG
3) 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验;
RMAN>CHECK BACKUPSET ‘/dm8/dm_bak/db_full_bak’;
4) 还原数据库。启动 DMRMAN,输入以下命令:
RMAN>RESTORE DATABASE ‘/dm8/data/DAMENG/dm.ini’ FROM
BACKUPSET ‘/dm8/dm_bak/db_full_bak’;
从备份集恢复
如果备份集在备份过程中生成了日志,且这些日志在备份集中有完整备份(如联机数据库备份),在执行数据库还原后,可以重做备份集中备份的日志,将数据库恢复到备份时的
状态,即从备份集恢复。完整的示例如下:
- 启动 DIsql 联机备份数据库;
SQL>BACKUP DATABASE BACKUPSET
‘/dm8/dm_bak/db_full_bak_backupset’;
2) 准备目标库,可以使用备份库,也可以重新生成库;
重新生成库操作如下:
./dminit path=/dm8/data db_name=DAMENG auto_overwrite=1
3) 启动 RMAN,校验备份;
RMAN>CHECK BACKUPSET ‘/dm8/dm_bak/db_full_bak_backupset’;
4) 还原数据库;
RMAN>RESTORE DATABASE ‘/dm8/data/DAMENG/dm.ini’ FROM
BACKUPSET ‘/dm8/dm_bak/db_full_bak_backupset’;
5) 恢复数据库。
RMAN>RECOVER DATABASE ‘/dm8/data/DAMENG/dm.ini’ FROM
BACKUPSET ‘/dm8/dm_bak/db_full_bak_backupset’;
从归档恢复
利用归档恢复数据库至最新状态的完整示例如下:
- 启动 DIsql 联机备份数据库,以及备份从检查点开始的本地归档日志;
SQL>BACKUP ARCHIVELOG FROM LSN 421401 BACKUPSET
‘/dm8/dm_bak/arch_bak_lsn_421401’;
SQL>BACKUP DATABASE BACKUPSET ‘/dm8/dm_bak/db_full_bak_arch’;
2) 准备目标库,可以使用备份库,也可以重新生成库;
如果使用原备份库,且备份库故障,需要先执行目标库归档修复;
RMAN>REPAIR ARCHIVELOG DATABASE ‘/dm8/data/dm.ini’;
如果使用新生成的库,生成之后需要先重启一下数据库实例,才可以被还原。重新生成
的库不需要执行归档修复(REPAIR)操作。重新生成库操作如下:
./dminit path=/dm8/data db_name=DAMENG auto_overwrite=1
3) 启动 RMAN,校验备份;
RMAN>CHECK BACKUPSET ‘/dm8/dm_bak/db_full_bak_arch’;
4) 还原数据库;
RMAN>RESTORE DATABASE ‘/dm8/data/DAMENG/dm.ini’ FROM
BACKUPSET ‘/dm8/dm_bak/db_full_bak_arch’;
5) 查看备份集的数据库信息,获取源库的 DB_MAGIC;
数据库更新
以使用正常退出数据库的脱机备份的备份集还原为完整示例,进行说明如下:
1) 启动 DMRMAN 备份数据库,保证数据库处于正常退出的脱机状态;
RMAN>BACKUP DATABASE ‘/dm8/data/DAMENG/dm.ini’ BACKUPSET
‘/dm8/dm_bak/db_full_bak_dbmagic’;
2) 准备目标库,可以使用备份库,也可以重新生成库或者直接指定目录还原;
重新生成库操作如下:
./dminit path=/dm8/data db_name=DAMENG auto_overwrite=1
3) 校验备份;
RMAN>CHECK BACKUPSET ‘/dm8/dm_bak/db_full_bak_dbmagic’;
4) 还原数据库;
RMAN>RESTORE DATABASE ‘/dm8/data/DAMENG/dm.ini’ FROM
BACKUPSET ‘/dm8/dm_bak/db_full_bak_dbmagic’;
5) 恢复数据库;
RMAN>RECOVER DATABASE ‘/dm8/data/DAMENG/dm.ini’ FROM
BACKUPSET ‘/dm8/dm_bak/db_full_bak_dbmagic’;
6) 更新数据库。
RMAN>RECOVER DATABASE ‘/dm8/data/DAMENG/dm.ini’ UPDATE
DB_MAGIC;
恢复数据库到指定时间点/LSN
例如,用户在下午 5 点做了一个误操作,删除了某些重要数据;我们可以指定恢复时
间点到下午 4:59 分,恢复被误删除的数据。
下面以联机数据库备份为例说明如何恢复数据库到指定的时间点/LSN。
1) 准备数据;
SQL>CREATE TABLE TAB_01(C1 INT);
SQL>INSERT INTO TAB_01 VALUES(1);
SQL>COMMIT;
2) 备份数据库;
SQL>BACKUP DATABASE BACKUPSET '/dm8/dm_bak/db_full_bak_for_time_lsn';
3) 正确操作数据库,产生一些归档;
SQL>CREATE TABLE TAB_02(C1 INT);
SQL>INSERT INTO TAB_02 VALUES(1);
SQL>COMMIT;
使用 SELECT SYSDATE 命令查询此时的时间为:2018-11-16 10:56:40。
使用 SELECT FILE_LSN FROM V$RLOG 命令查询此时的 LSN 为:50857。
4) 误操作数据库。此步骤误删除了表 TAB_01 中数据;
SQL>DELETE FROM TAB_01;
SQL>COMMIT;
操作步骤同步骤 3),此时的时间和 LSN 分别为:2018-11-16 10:57:20、50861。
5) 还原数据库。步骤 4)为误操作,因此我们需要将数据库恢复到步骤 3)的状态。
首先需要关闭数据库实例,然后利用 DMRMAN 工具还原数据库:
RMAN> RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/dm_bak/db_full_bak_for_time_lsn';
6) 恢复数据库到指定时间点/LSN。还原后数据库的数据与备份时一致,如果要恢复数据库至步骤 3)的状态可以指定 UNTIL TIME 或 UNTIL LSN 参数重做部分归档。
使用 RECOVER DATABASE...UNTIL TIME 命令恢复到指定的时间:
RMAN>RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' WITH
ARCHIVEDIR'/dm8/dm_arch/arch' UNTIL TIME'2018-11-16 10:56:40';
或者使用 RECOVER DATABASE...UNTIL TIME 命令恢复到指定的 LSN:
RMAN>RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' WITH
ARCHIVEDIR'/dm8/dm_arch/arch' UNTIL LSN 50857;
表空间还原
以联机表空间备份集为例,展示 DMRMAN 如何完成表空间的还原:
1) 联机备份表空间,保证数据库运行在归档模式及 OPEN 状态;
SQL>BACKUP TABLESPACE MAIN BACKUPSET '/dm8/dm_bak/ts_full_bak_for_restore';
2) 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此
处使用脱机校验;
RMAN>CHECK BACKUPSET '/dm8/dm_bak/ts_full_bak_for_restore';
3) 还原表空间。需要注意,表空间还原的目标库只能是备份集产生的源库,否则将
报错。启动 DMRMAN,输入以下命令:
RMAN>RESTORE DATABASE '/dm8/data/DAMENG_FOR_RESTORE/dm.ini' TABLESPACE
MAIN FROM BACKUPSET '/dm8/dm_bak/ts_full_bak_for_restore';
表空间恢复
以联机表空间备份为例,展示 DMRMAN 如何完成表空间的恢复:
1) 联机备份表空间,保证数据库运行在归档模式及 OPEN 状态;
SQL>BACKUP TABLESPACE MAIN BACKUPSET '/dm8/dm_bak/ts_full_bak';
2) 校验备份,校验待还原备份集的合法性,此处使用脱机校验;
RMAN>CHECK BACKUPSET '/dm8/dm_bak/ts_full_bak';
3) 还原表空间。启动 DMRMAN,输入以下命令:
RMAN>RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/dm8/dm_bak/ts_full_bak';
4) 恢复表空间。启动 DMRMAN,输入以下命令:
RMAN>RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' TABLESPACE MAIN;