目录
1.1 物理备份还原基础概念
表空间与数据文件
DM8的表空间类型分为:
SYSTEM
ROLL
TEMP
MAIN
HMAIN(不支持对HMAIN表空间备份还原)
用户自定义表空间
重做日志
REDO 日志,记录了所有物理页的修改,基本信息包括操作类型、表空间号、文件号、页号、页内偏移、实际数据等。
数据库中INSERT、DELETE、UPDATE 等DML操作以及CREATE TABLE等DDL操作最终都会转化为对某些数据文件、某些数据页的修改。
DM8默认的两个联机重做日志:DAMENG01.log,DAMENG02.log
归档日志
在归档模式下,联机REDO 日志被连续拷贝到归档日志后就生成了归档日志文件。
归档日志文件以归档时间命名。例如: ARCHIVE_LOCAL1_20160217171507968.log
开启归档模式会对系统性能产生一定影响,但更安全
PWR记录
REDO 日志中包含有一种特殊的记录,称为PWR(Page Written Record)日志。
PWR 日志包含表空间ID、文件ID、数据在文件中的页号和页的当前LSN信息。
每次数据页刷盘时,系统都会生成一条对应的PWR日志。
可用来提升系统故障恢复速度。在引入PWR记录之前,数据库故障重启时需要重做所有有效的REDO 日志记录。根据PWR记录可以快速判断数据页是否已刷盘,有效避免无用IO。
检查点与日志序列号
检查点的功能是按照数据页第一次被修改的顺序,依次将BUFFER缓冲区中的脏页写入磁盘,并在这个过程中动态调整CKPT_LSN值,释放日志空间。
LSN (LOG SEQUENCE NUMBER),即日志序列号,表示REDO 日志产生的顺序,系统为每个REDO 日志分配一个LSN值。
备份集
一个备份集对应一次完整备份,为一个目录,由一个或多个备份片和一个元数据文件组成。
备份片
备份片(后缀为.bak)是用来存储备份数据的文件。备份时,目标数据文件内容或归档日志内容经过处理后,都会存放到这些备份片文件中。
元数据
元数据文件(后缀为.meta)用来存储备份信息。包括:
备份集本身相关的信息
备份源库的建库参数信息
备份集中备份数据文件信息
备份集中备份片的信息
备份
将待备份的数据经过处理如加密、压缩等后,写到备份片文件中,并将相关备份信息写到元数据文件中的过程。
DM8中对备份的划分标准有如下几种:
备份组织形式:物理备份和逻辑备份
备份时,数据库是否运行:联机备份和脱机备份
备份的粒度大小:库备份、表空间备份、归档备份和表备份
归档备份支持联机和脱机;
归档备份会把收集到的归档文件,备份到备份集中的每一个备份片。必要的时候可以使用归档备份集,还原归档。
4. 备份数据的一致性:一致性备份和非一致性备份
5. 备份数据的完整性:完全备份和增量备份
数据库处于运行状态、并正常提供数据库服务情况下进行的备份操作,我们称为联机备
份。数据库处于关闭状态时进行的备份操作,被称为脱机备份。
使用 DMRMAN 工具进行脱机备份,并且支持对异常关闭的数据库进行脱机库备份。备份异常关闭的数据库,要求配置了本地归档,如果本地归档不完整,则需要先修复本地归档,再进行备份。
联机备份则使用客户端工具连接到数据库实例后,通过执行 SQL 语句进行;也可以通
过配置作业,定时完成自动备份。联机备份不影响数据库正常提供服务,是最常用的备份手
段之一。联机备份时,可能存在一些处于活动状态的事务正在执行,为确保备份数据的一致性,需要将备份期间产生的 REDO 日志一起备份。因此,只能在配置本地归档、并开启本地归档的数据库上执行联机备份。
按照备份内容不同,可以分为数据备份和归档日志备份。数据备份主要针对数据文件内
容,包括库备份、表空间备份和表备份。
库备份,顾名思义就是对整个数据库执行的备份,又称为库级备份。库备份会拷贝数据
库中所有数据文件的有效数据页,如果是联机备份,则还会拷贝备份过程中产生的归档日志,
写入到备份集中。
表空间备份是针对特定表空间执行的备份,又称为表空间级备份。表空间备份只能在联
机状态下执行。 表备份则拷贝指定表的所有数据页到备份集中,并会记录各个数据页之间的逻辑关系用 以恢复。表备份只能在联机状态下执行,一次表备份操作只能备份一张用户表,并且不支持增量表备份。
归档日志备份,是专门针对归档日志文件进行操作,不涉及任何数据文件内容。归档日
志备份扫描归档目录收集归档日志文件,并将归档日志写入到备份集中。既可以在数据库运
行状态下,执行联机归档日志备份;也可以在数据库关闭状态下执行脱机归档日志备份。
按照备份集中的数据是否满足一致性,可以将备份划分为一致性备份和非一致性备份。
一致性备份的备份集包含了完整的数据文件内容和归档日志信息;利用一个单独的备份
集可以将数据库恢复到备份时状态。不指定 WITHOUT LOG 选项的联机备份生成的备份集
就是一致性备份。脱机数据库备份会强制将检查点之后的有效 REDO 日志拷贝到备份集中,
因此,脱机备份一定是一致性备份。数据库正常关闭时,会生成完全检查点,脱机备份生成的备份集中,不包含任何 REDO 日志。非一致性备份的备份集只包含数据文件相关内容,没有归档日志信息,利用非一致性备 份还原的数据库,无法直接启动,必须借助归档日志来恢复。表空间备份、指定 WITHOUT LOG 选项的联机备份生成的备份集都是非一致性备份集。
按照备份数据完整性,可将备份分为完全备份和
增量备份。库备份和表空间备份支持增
量备份,表备份不支持增量备份。
完全备份生成的备份集包含了指定库(或者表空间)的全部有效数据页。当数据规模比
较大的情况下,生成的完全备份集通常会比较大,而且备份时间也会比较长。
增量备份是在某个特定备份集基础上,收集数据库新修改的数据页进行备份,可以有效
减少备份集的空间占用、提高备份速度。这个特定的、已经存在的备份集称为增量备份的基
备份,根据对基备份的要求不同,DM 的增量备份分为以下两种:
1. 差异增量备份
差异增量备份的基备份既可以是一个完全备份集,也可以是一个增量备份集。利用增量备份进行还原操作时,要求其基备份必须是完整的;如果差异增量备份的基备 份本身也是一个增量备份,那么同样要求其基备份是完整的;任何一个增量备份,最终都是以一个完全备份作为其基备份。因此,完全备份是增量备份的基础。
2. 累积增量备份
累积增量备份的基备份只能是完全备份集,而不能是增量备份集。增量备份的基备份集既可以是脱机备份生成的,也可以是联机备份生成的,脱机增量备份的基备份集可以是联机备份生成的,联机增量备份的基备份集也可以是脱机备份生成的。
还原
把备份集中的备份数据经过处理后,写回到还原目标库中相应的数据文件中的过程。
还原回来的数据通常是处于非一致性状态,需要执行恢复操作,使得目标数据库数据一致,才能对外提供服务。
与备份的分类类似,还原也可按照以下标准进行划分:
1.还原组织形式:物理还原和逻辑还原
2.还原时,数据库是否运行:联机还原和脱机还原
3.还原的粒度大小:库还原、表空间还原、归档还原和表还原
4.还原数据的完整性:完全备份还原和增量备份还原
数据还原过程(库还原)
库还原就是根据库备份集中记录的文件信息重新创建数据库文件,并将数据页重新拷贝
到目标数据库的过程。DM 既可以将一个已存在的数据库作为还原目标库,也可以指定一个 路径作为还原目标库的目录。库还原的主要步骤包括:清理目标库环境;重建数据库文件;拷贝数据页;重建联机日志文件;修改配置参数等
- 清理目标库环境
如果指定已存在的数据库作为还原目标库,还原操作首先解析 dm.ini 配置文件,获
取 dm.ctl 控制文件路径,删除控制文件中的数据文件,然后根据 OVERWRITE 选项,如果 指定 OVERWRITE 选项,若待还原文件存在,则删除;如果未指定 OVERWRITE 选项,若待 还原文件存在,则报错,但保留目标库的日志文件、控制文件等。
如果指定还原到一个目录,则根据 OVERWRITE 参数选择策略,检查目标目录内的
dm.ini 文件、dm.ctl 文件、默认的日志文件 DBNAME01.log 和 DBNAME02.log(其中
DBNAME 为数据库名称)、待还原的数据文件等。如果用户指定 OVERWRITE 参数,并且存在相关文件情况下,还原过程中会自动删除这些已经存在的文件;如果没有指定OVERWRITE 参数,并且存在相关文件,则会报错。
- 重建数据文件
如果将一个已存在数据库作为还原目标,则需要将目标数据库的 dm.ini 路径作为还
原参数。还原过程中,会重新创建数据文件,并将相关信息写入 dm.ctl 控制文件中。
如果将数据库还原到指定目录,则会在这个目录创建一个 dm.ini 配置文件,设置 CTL_PATH、SYSTEM_PATH 配置项指向这个目录,并在这个目录下创建 dm.ctl 控制文件。
DMDSC 不支持指定目录还原数据库。
数据文件重建策略:
1)目标库和备份集中的 SYSTEM_PATH 路径相同,则按照备份集中记录的原始路径创建文件;
2)目标库和备份集中的 SYSTEM_PATH 路径不相同,默认在目标库的 SYSTEM_PATH目录下创建文件;
3)使用 mapped file 指定源文件与目标文件的映射关系,定制数据库文件的物理分布情况,可以很好的满足用户关于数据文件分布的需求。
- 重建联机日志文件
指定目录还原,系统目录使用指定还原目录,所有库配置文件均认为在指定还原目录下。
联机日志文件命名规则,单机环境为 db_name+文件编号.log,其中 db_name 取自备份
集备份库的名称,文件编号从 1 开始,如 DAMENG01.log、DAMENG02.log。联机日志文
件至少 2 个。
- 拷贝数据页
拷贝数据页是从备份集中读取数据页,并将数据页写入数据文件指定位置的过程。由于
备份过程中,只将有效的数据页写入备份集中,因此,还原过程也只涉及这些被分配使用的
数据页。
- 重置目标库
具体包括:
1) 更新日志信息,设置当前 CKPT_LSN 为备份集中 BEGIN_LSN,并设置日志文件状态为 INACTIVE;
2) 更新 DB_MAGIC,还原后,库中 PERMANENT_MAGIC 仍与备份集中相同;
3) 设置还原标志,标识当前库为指定库要还原的库,不允许使用;
4) 更新目标库的控制文件 dm.ctl,把当前库中的数据文件信息都记录到控制文件中,
使用备份集中的服务器秘钥文件,重新生成新的秘钥文件。
- 修改配置参数
还原到指定库时,默认会保留目标库的配置参数不变,也可以在还原时指定 REUSE
DMINI 子句,使用备份集中的配置参数替换目标库 dm.ini 中的配置参数。还原到指定目录时,会重新建立一个 dm.ini 配置文件,并用备份集中的参数值来设置这些配置项。需要注意的是,一般与路径相关的配置参数,比如 SYSTEM_PATH 等并不会被替换,而是保留目标库 dm.ini 的原始值不变。
服务器秘钥文件(dm_service.prikey或者 dm_external.config)仅在备份集中备份库非 usbkey 加密的情况下重建,并使用备份集中备份的秘钥内容进行还原。
注意事项:
1)指定的 dm.ini 必须存在且各项配置信息有效,其中 CTL_PATH 必须配置且路径必
须有效;
2)若指定目录还原,则指定目录作为数据库系统目录处理;
3)由于还原是要确保数据库数据的完整性,因此,对于增量备份的还原,需要搜集完整的备份集链表,然后从前到后,逐个还原备份集中数据。鉴于增量备份 BEGIN_LSN 确定 规则,增量备份的还原过程中,不需要重做任何归档日志。
恢复
恢复是重做本地归档日志或者备份集中备份的归档日志的过程。
没有经过恢复的还原数据库是不允许启动的。
表空间和表还原均为联机执行,都不需要再执行恢复操作。此处恢复是指数据库恢复操作。
分类
根据恢复过程中是否重做归档,及重做归档日志的来源,可将恢复分三类:
(1)更新DB_MAGIC
DB_MAGIC记录数据库的变化,当数据库经过备份还原并恢复后,DB_MAGIC就会改变(SELECT DB_MAGIC FROM V$RLOG;)
在不需要重做归档日志恢复数据的情况下,可以直接更新DB_MAGIC来完成最后的恢复工作。
(2)从备份集恢复
利用备份集中备份日志的恢复过程。
(3)从归档恢复
利用重做本地归档日志来恢复数据的过程。
从归档恢复可恢复到最新状态,或指定的时间点、指定的LSN值
1.2 逻辑备份基础概念
逻辑备份是指利用 dexp 导出工具,将指定对象(库级、模式级、表级)的数据导出到
文件的备份方式。逻辑备份针对的是数据内容,并不关心这些数据物理存储在什么位置。
物理备份则直接扫描数据库文件,找出那些已经分配、使用的数据页,拷贝并保存到备
份集中。物理备份过程中,不关心数据页的具体内容是什么,也不关心数据页属于哪一张表,
只是简单的根据数据库文件系统的描述,来挑选有效的数据页。
1.3 逻辑备份和物理备份区别
逻辑备份:利用导出工具,将用户的表、数据记录导出到.dmp文件中。
物理备份:直接扫描数据库文件,找出那些已经分配、使用的数据页,拷贝并保存到备份集中。
2.1备份过程
2..1.1 库级和表空间级备份
属于物理备份
联机库级和表空间备份要求配置归档
都可进行完全备份和增量备份
备份对象:数据文件和归档日志
2.1.2 归档备份
是把归档目录下,符合条件的归档文件都备份下来
归档备份对象:包含了元数据信息和REDO 日志的归档文件
2.1.3 表级备份
过程包含数据备份和元信息备份
表数据通过表上的聚集索引排序,表级数据备份针对表的聚集索引进行
表级备份元信息包括建表语句、重建约束语句、重建索引语句等
表级备份均为完全备份和一致性备份,不需要配置归档
实现过程采用表的内存逻辑存储结构,所访问的页均为有效页,故无需进行智能抽取
2.1.4智能抽取
仅限备份数据文件过程中使用
在遍历各文件中数据页时,根据描述页的标记判断数据页是否被分配、使用,将未使用的数据页剔除,仅保留有效数据页进行备份。
相对于直接拷贝数据文件方式,物理备份产生的备份集更小,有效减少IO数量,提升备份还原的效率
2.1.5加密与压缩
压缩和加密均由用户显式指定;
压缩级别支持1~9级,级别越高压缩比越高,但同时压缩速度越慢。默认采用压缩级别1;
加密:加密密码、加密类型(简单加密or完全加密)和加密算法;
若同时指定加密和压缩,则先压缩后加密;
增量备份,若指定加密,且基备份也存在加密,则使用的加密算法和加密密码必须与其基备份中一致
2.1.6 PWR优化
PWR (Page Written Record)日志会记录每次刷盘时数据在数据页中的编号及所属数据页的LSN信息等。
增量备份的常规实现:需要扫描所有的数据文件页,再依次取出LSN >=基备份START_LSN的数据页。采用PWR优化:通过扫描归档日志中PWR 日志,直接比较日志LSN值与基备份的START_LSN,就可确定需备份的数据页。
在备份语句中指定USE PWR来启动增量备份的PWR优化,默认不使
2.1.7并行备份
DM8支持对库级、归档备份和表空间级的并行备份
可通过关键字PARALLEL指定是否执行并行备份,以及并行数.默认并行数为4,指定值为0或1则按非并行处理。
并行备份以数据文件为单位,实际可使用的最大并行数就是目标备份数据文件的个数。
增量备份是否并行及并行数取决于其基备份
并行备份的结果包括一个主备份集目录和几个子备份集目录
2.2还原过程
2.2.1 归档还原
1) 读取元数据文件,获取备份信息,校验备份集是否有效;
2) 从用户指定的备份集中,收集归档文件,根据用户指定的过滤条件,过滤需要还原哪些归档;
3) 根据用户指定的OVERWRITE参数,确定如果目标归档文件已经存在的处理策略:
添加一条日志继续还原其他归档文件;
直接终止还原,报错范围;
强制覆盖处理。
4) 执行归档还原,从备份片中把数据去除,必要时经过解压缩&解密处理后回写到新的归档文件中,还原结束。
2.2.2 库还原和表空间还原
库还原需要用户准备目标库,目标库建库参数需与备份库匹配(可通过DMRMAN的show功能查看备份信息)
表空间还原则不允许跨库还原,只能在源库上执行还原
2.2.3表还原
1)表结构还原
目标表存在,清除数据、二级索引和约束;
目标表不存在,利用备份集中记录的建表语句重建
2)表数据还原
3)索引和约束的重建
2.2.4 解密和解压缩
DM8 还原恢复时的解密过程如下:
首先,通过比对用户输入与从元数据文件得到备份集加密信息来检验加密密码和算法是否正确;
然后,从备份片文件中读取备份数据之后,写到目标文件(包括目标数据文件和临时归档文件)之前执行解密操作。
解压缩是自动进行的,不需要用户手动指定什么
若备份集同时存在加密和压缩,那么与备份过程处理相反,会先解密再解压缩,然后将处理的最终数据写入到目标文件中。
2.2.5 并行还原
对应并行备份集的还原,非并行备份集不能执行并行还原;
并行数使用目标并行备份集并行数;
并行备份集还支持非并行还原(指定关键字NOT PARALLEL)
2.3备份还原场景选择
库级
理论上无论出现哪种损坏都可以采用库级备份还原修复,建议物理损坏情况下使用;
逻辑损坏导致库数据丢失比较严重或者表空间已经被删除,也可采用库级备份还原;
要求还原的目标库脱机且正常退出。需借助DMRMAN工具完成。
表空间级
若逻辑损坏导致某个表空间中多个表数据丢失时,可以考虑采用表空间级备份还原。
DM8支持从库级备份中还原表空间。
归档
归档还原仅能恢复归档文件。
很多时候可以利用归档文件修复数据,若条件允许,最好保留尽量多的归档文件。
表级
因逻辑损坏导致个别表数据丢失, 可以采用表级备份还原。建议对数据库中频繁操作的重要表进行表级备份。
将指定表数据从一个表迁移到另外一个表中,也可使用表级备份还原。
表级备份还原过程中,其他表可以正常工作。
完全,还是增量
当库或表空间的基础数据量很大而数据修改操作不太频繁时,强烈建议使用增量备份(前提是至少有一个完全备份)建议当进行一定次数的增量备份后,应重新做一个完全备份。
表空间还原后的恢复操作由DM8自动执行;表还原后已经是一致性状态,不需要进行恢复操作。
提供三种库级恢复方式:
- 若还原时指定备份集为脱机库备份集(LEVEL=1)或者联机库备份集(LEVEL=0), 但过程中无日志(START_LSN = END_LSN+1),且仅需将库恢复到备份时状态,建议选择更新DB_MAGIC恢复方式;
(2)若还原时指定的备份集为联机备份集(LEVEL=0)且备份了日志(备份时不指定 WITHOUT LOG 参数),且仅需要库恢复到备份时状态,可以选择从备份集恢复;
(3)除以上情况外,均可以采用从本地归档恢复。可指定想要恢复到的 LSN(大于备份结束END_LSN)和时间点(大于备份时间BACKUP_TIME)。不指定则恢复到最新状态。
3.1备份还原工具
Disql 工具:联机数据备份与还原,包括库备份、表空间备份与还原、表备份与还原;
DMRMAN 工具:脱机数据库备份还原与恢复;
客户端工具 MANAGER和CONSOLE:对应命令行工具DIsql和DMRMAN的功能,分别用于联机和脱机备份还原数据。
3.2 归档配置:
使用SQL语句联机配置归档:
1)修改数据库为MOUNT状态:
SQL>ALTER DATABASE MOUNT;
2)配置本地归档。
SQL>ALTER DATABASE ADD ARCHIVELOG 'DEST=/dm8/dmarch,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT =2048';
3)开启归档模式。
SQL>ALTER DATABASE ARCHIVELOG;
4)修改数据库为OPEN状态。
SOL>ALTER DATABASE OPEN;
手动配置归档,编辑amarch.ini:
[ARCHIVE LOCAL1]
ARCH TYPE LOCAL
ARCH DEST /dm8/dmarch
ARCH FILE SIZE 1024
ARCH SPACE LIMIT 2048
3.3 执行SQL语句进行联机备份
进行联机备份,数据库必须保持在联机状态
3.3.1 数据库备份:
最简单的数据库备份语句,备份路径默认在数据库路径的bak目录:
SQL> BACKUP DATABASE BACKUPSET 'db_bak_01';
指定备份集路径、设置备份名、指定介质类型、添加备份描述、限制备份片大小、备份压缩、并行备份:
SQL> BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET ‘/dm8/dmbak/db_bak_3_02’ DEVICE TYPE DISK BACKUPINFO ‘完全备份’ MAXPIECESIZE 300 COMPRESSED LEVEL 5 PARALLEL 8;
完全备份:
SQL> BACKUP DATABASE FULL BACKUPSET '/dm8/dmbakdb_full_bak_01';
增量备份
SQL> BACKUP DATABASE INCREMENT WITH BACKUPDIR '/home/dm_bak' BACKUPSET '/dm8/dmbakdb_increment_bak_02';
指定基备份目录(不指定则搜索最近一次完全/增量备份作基备份)
SQL>BACKUP TABLESPACE MAIN INCREMENT BASE ON BACKUPSET'ts_full_bak_01' BACKUPSET 'ts_increment_bak_02';
3.3.2 表空间备份:
SQL> BACKUP TABLESPACE MAIN BACKUPSET 'ts_bak_01';
注:备机状态/MOUNT状态/MPP和RAC环境均不允许表空间备份。
指定基备份目录(不指定则搜索最近一次完全/增量备份作基备份)
SQL>BACKUP TABLESPACE MAIN INCREMENT BASE ON BACKUPSET'ts_full_bak_01' BACKUPSET 'ts_increment_bak_02';
3.3.3 归档备份:
归档备份拷贝指定归档目录下的所有的归档文件到备份集中。
备份归档需要服务器配置归档。
SQL>BACKUP ARCHIVE LOG ALL BACKUPSET 'arch_bak_01';
3.3.4 表备份:
表备份均为联机完全备份,不需要备份归档日志,不存在增量备份之说。
SQL> BACKUP TABLE TAB_01 BACKUPSET 'tab_bak_01';
3.3.5 备份加密
例:数据库完全备份,创建加密密码为“cdb546”,加密算法为“rc4”,复杂数据库加密备份:
SQL>BACKUP DATABASE BACKUPSET '/dm8/dmbakdb_bak_for_encrypt_01' IDENTIFIED BY "cdb546" WITH ENCRYPTION 2 ENCRYPT WITH RC4;
其中, 参数WITH ENCRYPTION(默认值为 1 ,简单加密) 和 ENCRYPT WITH(默认加密算法AES256_CFB)可不指定。
3.3.6 设置追踪日志文件:
SQL>BACKUP DATABASE BACKUPSET '/dm8/dmbakdb_bak_for_trac_01' TRACE FILE'/home/dm_log/db_bak_trace.log‘ TRACE LEVEL 2;
参数TRACE FILE 用于指定生成的跟踪日志文件路径;
TRACE LEVEL 表示是否启用TRACE,有效值1和2。1表示不启用TRACE功能,2表示启用,系统默认值为1。
3.3.7 管理备份
备份管理相关动态视图总结如下:
V$BACKUPSET:显示备份集基本信息。
V$BACKUPSET_DBINFO:显示备份集的数据库相关信息。
V$BACKUPSET_DBF:显示备份集中数据文件的相关信息。
V$BACKUPSET_ARCH:显示备份集的归档信息。
V$BACKUPSET_RLOG:显示备份集的日志信息。
V$BACKUPSET_BKP:显示备份集的备份片信息。
V$BACKUPSET_SEARCH_DIRS:显示备份集搜索目录。
V$BACKUPSET_TABLE:显示表备份集中备份表信息。
V$BACKUPSET_INDEX:显示表备份集中备份索引信息。
V$BACKUPSET_SUBS:显示并行备份中生成的子备份集信息。
3.4 执行SQL语句进行联机还原恢复
Disql只能进行表空间和表还原,用于联机恢复,库还原需要使用DMRMAN进行脱机恢复。
3.4.1 表空间还原
DM7支持表空间在线还原,DM8仅支持脱机使用dmrman恢复表空间
DM7:
系统处于OPEN状态下
表空间还原、恢复操作一次性完成,还原后不需单独执行恢复
可使用表空间完全备份、表空间增量备份、数据库备份文件还原表空间
SQL> ALTER TABLESPACE MAIN OFFLINE;
SQL> RESTORE TABLESPACE MAIN FROM BACKUPSET 'ts_bak_01';
SQL> ALTER TABLESPACE MAIN ONLINE;
3.4.2 表还原
不需配置归档
系统处于OPEN状态下
表还原是联机完全备份还原,因此还原后不需要恢复
示例:
SQL> create table liu.test(a int); 操作已执行 已用时间: 4.390(毫秒). 执行号:508. SQL> create index idx_test_a on liu.test(a); 操作已执行 已用时间: 9.493(毫秒). 执行号:509. SQL> backup table liu.test backupset '/dm8/dmbak/tab_bak_test'; 操作已执行 已用时间: 00:00:02.879. 执行号:510. SQL> SQL> SQL> SQL> insert into liu.test values (1); 影响行数 1 已用时间: 0.784(毫秒). 执行号:511. SQL> / 影响行数 1 已用时间: 0.541(毫秒). 执行号:512. SQL> / 影响行数 1 已用时间: 0.285(毫秒). 执行号:513. SQL> / 影响行数 1 已用时间: 0.304(毫秒). 执行号:514. SQL> commit; 操作已执行 已用时间: 1.107(毫秒). 执行号:515. SQL> select * from liu.test; 行号 A ---------- ----------- 1 1 2 1 3 1 4 1 已用时间: 0.884(毫秒). 执行号:516. SQL> select sf_bakset_check('DISK','/dm8/dmbak/tab_bak_test'); 行号 SF_BAKSET_CHECK('DISK','/dm8/dmbak/tab_bak_test') ---------- ------------------------------------------------- 1 1 已用时间: 41.064(毫秒). 执行号:517. SQL> restore table liu.test from backupset '/dm8/dmbak/tab_bak_test'; restore table liu.test from backupset '/dm8/dmbak/tab_bak_test'; [-8327]:还原表中存在二级索引或冗余约束. 已用时间: 5.383(毫秒). 执行号:0. SQL> restore table STRUCT liu.test from backupset '/dm8/dmbak/tab_bak_test'; restore table STRUCT liu.test from backupset '/dm8/dmbak/tab_bak_test'; SQL> RESTORE TABLE liu.test STRUCT FROM BACKUPSET '/dm8/dmbak/tab_bak_test'; 操作已执行 已用时间: 18.069(毫秒). 执行号:519. SQL> select * from liu.test; 未选定行 SQL> select owner,object_name,object_type from dba_objects where owner='LIU'; 行号 OWNER OBJECT_NAME OBJECT_TYPE ---------- ----- ------------- ----------- 1 LIU LIU SCH 2 LIU TEST TABLE 3 LIU INDEX33555464 INDEX 此时看到数据已经恢复成功,但是索引和没有恢复完成,存在索引的冗余 已用时间: 9.997(毫秒). 执行号:602. SQL> restore table liu.test from backupset '/dm8/dmbak/tab_bak_test'; 操作已执行 已用时间: 35.289(毫秒). 执行号:521. 行号 OWNER OBJECT_NAME OBJECT_TYPE ---------- ----- ------------- ----------- 1 LIU LIU SCH 2 LIU TEST TABLE 3 LIU IDX_TEST_A INDEX 4 LIU INDEX33555464 INDEX 此时索引已恢复正常 已用时间: 3.278(毫秒). 执行号:603. |
创建一个备份表和表索引:
批量生成备份表的DDL语句:
--使用要进行备份的用户登录数据库,执行以下SQL
SELECT 'BACKUP TABLE "'||TABLE_NAME||'" BACKUPSET ''/home/dmdba/dmbak/TAB_BAK_'||TABLE_NAME ||''';' FROM USER_TABLES;
3.5 DMRMAN进行脱机备份恢复
3.5.1 数据库全库备份恢复
实例:
SQL> BACKUP DATABASE BACKUPSET '/dm8/dmbak'; 操作已执行 已用时间: 00:00:03.110. 执行号:606. 2)关闭数据库,进行备份恢复 SQL>shutdown immediate; [dmdba@localhost dm8]$ dmrman dmrman V8 3)校验待还原备份集的合法性(如果确定合法该步可省略) RMAN> check backupset '/dm8/dmbak'; check backupset '/dm8/dmbak'; [Percent:100.00%][Speed:0.00M/s][Cost:00:00:00][Remaining:00:00:00] check backupset successfully. time used: 151.223(ms) 4) 还原数据库 RMAN> RESTORE DATABASE '/dm8/dmdata/DMDB/dm.ini' from backupset '/dm8/dmbak'; RESTORE DATABASE '/dm8/dmdata/DMDB/dm.ini' from backupset '/dm8/dmbak'; Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL [Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00] restore successfully. time used: 00:00:02.542
RMAN> RECOVER DATABASE '/dm8/dmdata/DMDB/dm.ini' from backupset '/dm8/dmbak'; RECOVER DATABASE '/dm8/dmdata/DMDB/dm.ini' from backupset '/dm8/dmbak'; Database mode = 2, oguid = 0 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL EP[0]'s cur_lsn[40419], file_lsn[40419] [Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00] recover successfully! time used: 00:00:02.491 6)更新DM_MAGIC恢复: 当备份集为脱机备份即备份过程中无日志生成,可以直接更新DB_MAGIC 完成数据库恢复。 RMAN> RECOVER DATABASE '/dm8/dmdata/DMDB/dm.ini' UPDATE DB_MAGIC; RECOVER DATABASE '/dm8/dmdata/DMDB/dm.ini' UPDATE DB_MAGIC; Database mode = 2, oguid = 0 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL EP[0]'s cur_lsn[40718], file_lsn[40718] recover successfully! time used: 00:00:01.095 |
3.5.2 增量备份恢复
- 增量备份测试
SQL> backup database backupset '/bak/bak_03'; 操作已执行 已用时间: 00:00:02.944. 执行号:605. 将归档日志全部移走 [dmdba@DM3 arch]$ ll 总用量 1049484 -rw-r--r--. 1 dmdba dinstall 232960 11月 15 14:10 ARCHIVE_LOCAL1_0x4B9B00D7_EP0_2022-11-15_13-50-38.log -rw-r--r--. 1 dmdba dinstall 694784 11月 15 14:41 ARCHIVE_LOCAL1_0x4B9B00D7_EP0_2022-11-15_14-10-56.log -rw-r--r--. 1 dmdba dinstall 1073741824 11月 15 15:43 ARCHIVE_LOCAL1_0x4B9B00D7_EP0_2022-11-15_14-56-02.log [dmdba@DM3 arch]$ mv * /home/dmdba/ [dmdba@DM3 arch]$ ll 总用量 0 进行差异增量备份 SQL> backup database increment base on backupset '/bak/bak_03' backupset '/bak/bak_03_01'; backup database increment base on backupset '/bak/bak_03' backupset '/bak/bak_03_01'; [-8117]:等待归档刷盘,请稍后重试. 已用时间: 24.152(毫秒). 执行号:0. 手动落盘 SQL> select checkpoint(100); 行号 CHECKPOINT(100) ---------- --------------- 1 0 已用时间: 2.092(毫秒). 执行号:609. SQL> alter system switch logfile; 操作已执行 已用时间: 2.823(毫秒). 执行号:0. SQL> backup database increment base on backupset '/bak/bak_03' backupset '/bak/bak_03_01'; backup database increment base on backupset '/bak/bak_03' backupset '/bak/bak_03_01'; [-718]:收集到的归档日志不连续. 已用时间: 15.915(毫秒). 执行号:0. |
2.增量备份还原测试
SQL> backup database backupset '/bak/bak_03'; 操作已执行 已用时间: 00:00:02.921. 执行号:611. SQL> create table T1 (c1 int); 操作已执行 已用时间: 4.079(毫秒). 执行号:612. SQL> insert into T1 values(1); 影响行数 1 已用时间: 0.994(毫秒). 执行号:613. SQL> commit; 操作已执行 已用时间: 0.670(毫秒). 执行号:614. ---------第一次差异增量备份 SQL> backup database increment base on backupset '/bak/bak_03' backupset '/bak/bak_03_01'; 操作已执行 已用时间: 00:00:06.707. 执行号:615. SQL> insert into T1 values(2); 影响行数 1 已用时间: 0.585(毫秒). 执行号:616. SQL> commit; 操作已执行 已用时间: 0.881(毫秒). 执行号:617. -------第二次差异增量备份 SQL> backup database increment base on backupset '/bak/bak_03_01' backupset '/bak/bak_03_02'; 操作已执行 已用时间: 00:00:06.708. 执行号:618. |
[dmdba@DM3 bin]$ ./dmrman use_ap=2 CTLSTMT="RESTORE DATABASE '/dm8/db/dm.ini' FROM BACKUPSET '/bak/bak_03_02' WITH BACKUPDIR '/bak'" dmrman V8 RESTORE DATABASE '/dm8/db/dm.ini' FROM BACKUPSET '/bak/bak_03_02' WITH BACKUPDIR '/bak' file dm.key not found, use default license! Read ini warning, default backup path [/dm8/db/bak] does not exist. Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL [Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00] restore successfully. time used: 00:00:02.485 [dmdba@DM3 bin]$ ./dmrman use_ap=2 CTLSTMT="RECOVER DATABASE '/dm8/db/dm.ini' FROM BACKUPSET '/bak/bak_03_02'" dmrman V8 RECOVER DATABASE '/dm8/db/dm.ini' FROM BACKUPSET '/bak/bak_03_02' file dm.key not found, use default license! Read ini warning, default backup path [/dm8/db/bak] does not exist. Database mode = 0, oguid = 0 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL EP[0]'s cur_lsn[55853], file_lsn[55853] [Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00] recover successfully! time used: 00:00:02.379 [dmdba@DM3 bin]$ ./dmrman use_ap=2 CTLSTMT="RECOVER DATABASE '/dm8/db/dm.ini' UPDATE DB_MAGIC" dmrman V8 RECOVER DATABASE '/dm8/db/dm.ini' UPDATE DB_MAGIC file dm.key not found, use default license! Read ini warning, default backup path [/dm8/db/bak] does not exist. Database mode = 0, oguid = 0 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL EP[0]'s cur_lsn[55854], file_lsn[55854] recover successfully! time used: 00:00:01.002 [dmdba@DM3 bin]$ 仅使用最后的累计增量备份集可完成全部数据还原 SQL> select * from T1; 行号 C1 ---------- ----------- 1 1 2 2 已用时间: 1.934(毫秒). 执行号:500. ----------------新插入数据并基于第二个差异增量备份集进行差异备份 SQL> insert into t1 values(3); 影响行数 1 已用时间: 1.054(毫秒). 执行号:501. SQL> commit; 操作已执行 已用时间: 1.038(毫秒). 执行号:502. SQL> backup database increment base on backupset '/bak/bak_03_02' backupset '/bak/bak_03_03'; 操作已执行 已用时间: 00:00:02.915. 执行号:503. ------------------只使用最新生成差异增量备份集进行还原恢复 [dmdba@DM3 bin]$ ./dmrman use_ap=2 CTLSTMT="RESTORE DATABASE '/dm8/db/dm.ini' FROM BACKUPSET '/bak/bak_03_03' WITH BACKUPDIR '/bak'" dmrman V8 RESTORE DATABASE '/dm8/db/dm.ini' FROM BACKUPSET '/bak/bak_03_03' WITH BACKUPDIR '/bak' file dm.key not found, use default license! Read ini warning, default backup path [/dm8/db/bak] does not exist. Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL [Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00] restore successfully. time used: 00:00:02.535 [dmdba@DM3 bin]$ ./dmrman use_ap=2 CTLSTMT="RECOVER DATABASE '/dm8/db/dm.ini' FROM BACKUPSET '/bak/bak_03_03'"; dmrman V8 RECOVER DATABASE '/dm8/db/dm.ini' FROM BACKUPSET '/bak/bak_03_03' file dm.key not found, use default license! Read ini warning, default backup path [/dm8/db/bak] does not exist. Database mode = 0, oguid = 0 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL EP[0]'s cur_lsn[56257], file_lsn[56257] [Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00] recover successfully! time used: 00:00:02.424 [dmdba@DM3 bin]$ ./dmrman use_ap=2 CTLSTMT="RECOVER DATABASE '/dm8/db/dm.ini' UPDATE DB_MAGIC" dmrman V8 RECOVER DATABASE '/dm8/db/dm.ini' UPDATE DB_MAGIC file dm.key not found, use default license! Read ini warning, default backup path [/dm8/db/bak] does not exist. Database mode = 0, oguid = 0 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL EP[0]'s cur_lsn[58627], file_lsn[58627] recover successfully! time used: 00:00:01.003 [dmdba@DM3 bin]$ SQL> select * from t1; 行号 C1 ---------- ----------- 1 1 2 2 3 3 已用时间: 1.967(毫秒). 执行号:500. |
3.5.3 恢复至指定时间点/LSN(从归档恢复)
SQL> BACKUP DATABASE BACKUPSET '/dm8/dmbak/db_full_backup'; 操作已执行 已用时间: 00:00:03.270. 执行号:500 2) 修改一些数据,产生归档; SELECT FILE_LSN FROM V$RLOG 行号 FILE_LSN ---------- -------------------- 1 41310 命令查询此时的LSN: 41326)。 SQL> select * from liu.test; 未选定行 已用时间: 7.415(毫秒). 执行号:600. SQL> insert into liu.test values(1); 影响行数 1 已用时间: 0.829(毫秒). 执行号:601. SQL> insert into liu.test values(2); 影响行数 1 已用时间: 1.159(毫秒). 执行号:602. SQL> insert into liu.test values(3); 影响行数 1 已用时间: 3.606(毫秒). 执行号:603. SQL> commit; 操作已执行 已用时间: 2.554(毫秒). 执行号:604. SQL> select * from liu.test; 行号 A ---------- ----------- 1 1 2 2 3 3 已用时间: 0.329(毫秒). 执行号:605. SQL> SELECT FILE_LSN FROM V$RLOG; 行号 FILE_LSN ---------- -------------------- 1 41326 已用时间: 0.863(毫秒). 执行号:606. 3)误删除表数据(时间点t2;LSN: 41396) SQL> Delete from liu.test; 影响行数 3 已用时间: 1.284(毫秒). 执行号:503. SQL> commit; 操作已执行 已用时间: 1.437(毫秒). 执行号:504. SQL> Select * from liu.test; 未选定行 SQL> SELECT FILE_LSN FROM V$RLOG; 行号 FILE_LSN ---------- -------------------- 1 41396 SQL> select sysdate; 行号 SYSDATE ---------- ------------------- 1 2023-05-08 16:46:37 查看备份集信息: SQL> SELECT BACKUP_NAME,BACKUP_TIME,BEGIN_LSN,END_LSN FROM V$BACKUPSET; 行号 BACKUP_NAME BACKUP_TIME ---------- ------------------------------ -------------------------- BEGIN_LSN END_LSN -------------------- -------------------- 1 DB_FULL_20230508_134411_801440 2023-05-08 13:44:14.749958 37205 37436
RMAN> RESTORE DATABASE '/dm8/dmdata/DMDB/dm.ini' from backupset '/dm8/dmbak/db_full_backup'; RESTORE DATABASE '/dm8/dmdata/DMDB/dm.ini' from backupset '/dm8/dmbak/db_full_backup'; file dm.key not found, use default license! Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL [Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00] restore successfully. time used: 00:00:02.527 5)查看备份集的数据库信息,获取源库的DB_MAGIC。 SHOW BACKUPSET '/dm8/dmbak/db_full_backup' INFO DB; <backupset [DEVICE TYPE:DISK, BACKUP_PATH: /dm8/dmbak/db_full_backup] info start ..........> <DB INFO> system path: /dm8/dmdata/DMDB pmnt_magic: 1734114500 src_db_magic: 1563391999 db_magic: 1563391999 dsc node: 1 sys mode: 0 page check: 1 rlog encrypt: 0 rlog encrypt id: 0 external cipher[id/name]: 0/ external hash[id/name]: 0/ length in char: 0 use new hash: 1 page size: 32KB extent size: 32 case sensitive: 1 log page size: 512B unicode_flag/charset: 1 data version: 0x7000C sys version: V8 pseg version: 0x7000B enable policy: 0 archive flag: 1 blank_pad_mode: 0 crc_check: TRUE page_enc_slice_size: 4096 char_fix_storage: 0 sql_log_forbid: 0 secur_flag: 2 db_enc_extend_size: 0 page_check_hash_size: 0 dpc_magic: 0 <backupset [DEVICE TYPE:DISK, BACKUP_PATH: /dm8/dmbak/db_full_backup] info end .> show backupsets successfully. time used: 17.643(ms) 6)要恢复数据库至步骤2的状态,可以指定UNTIL TIME或UNTIL LSN参数重做部分归档: RMAN>RECOVER DATABASE '/dm8/dmdata/DMDB/dm.ini' WITH ARCHIVEDIR '/dm8/dmarch' USE DB_MAGIC 1563391999 UNTIL TIME'2023-5-8-16:46:27.624931'; 或者 RMAN>RECOVER DATABASE '/dm8/dmdata/DMDB/dm.ini' WITH ARCHIVEDIR '/dm8/dmarch' USE DB_MAGIC 1563391999 UNTIL LSN 41326; RECOVER DATABASE '/dm8/dmdata/DMDB/dm.ini' WITH ARCHIVEDIR '/dm8/dmarch' USE DB_MAGIC 1563391999 UNTIL LSN 41326; Database mode = 2, oguid = 0 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL EP[0]'s cur_lsn[40758], file_lsn[40758] [Percent:59.93%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00] recover successfully! time used: 469.556(ms) 7)更新数据库db_magic: RMAN>RECOVER DATABASE '/dm8/dmdata/DMDB/dm.ini' UPDATE DB_MAGIC; 8)启动数据库服务 [dmdba@localhost db_full_backup]$ DmServiceDMSERVER start Starting DmServiceDMSERVER: [ OK ] 9)登录disql,open force打开数据库,验证数据 [dmdba@localhost db_full_backup]$ disql disql V8 用户名: 密码: 服务器[LOCALHOST:5236]:处于备库配置状态 登录使用时间 : 10.904(ms) 已用时间: 1.146(毫秒). 执行号:0. SQL> alter database open; alter database open; 第1 行附近出现错误[-516]:非NORMAL模式需要OPEN FORCE. SQL> alter database open force; 操作已执行 已用时间: 15.886(毫秒). 执行号:0. SQL> select * from liu.test; 行号 A ---------- ----------- 1 1 2 2 3 3 已用时间: 6.540(毫秒). 执行号:0. 已恢复至指定时间点 |
3.5.4 DM8表空间还原
对表空间的备份还原,DM8只能使用dmrman脱机进行恢复还原。
[dmdba@dm8dw02 bin]$ ./DmServiceTEST stop
Stopping DmServiceTEST: [ OK ]
[dmdba@dm8dw02 bin]$ ./dmrman
dmrman V8
#校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验
RMAN> CHECK BACKUPSET '/dm8/dmbak/tbs_main_bak';
CHECK BACKUPSET '/dm8/dmbak/tbs_main_bak';
CMD END.CODE:[0]
check backupset successfully.
time used: 5.922(ms)
#还原表空间。 需要注意,表空间还原的目标库只能是备份集产生的源库,否则将报错
#使用第一次备份文件还原
RMAN> RESTORE DATABASE '/dm8/data/TEST/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/dm8/dmbak/tbs_main_bak';
RESTORE DATABASE '/dm8/data/TEST/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/dm8/dmbak/tbs_main_bak';
RESTORE TABLESPACE[MAIN] IN DB[/dm8/data/TEST/dm.ini] CHECK......
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[53006]
RESTORE TABLESPACE[MAIN] IN DB[/dm8/data/TEST/dm.ini],dbf collect......
RESTORE TABLESPACE[MAIN] IN DB[/dm8/data/TEST/dm.ini],ts status and dbf refresh ......
RESTORE BACKUPSET [/dm8/dmbak/tbs_main_bak] START......
total 1 packages processed...
total 3 packages processed...
RESTORE TABLESPACE[MAIN] IN DB[/dm8/data/TEST/dm.ini],UPDATE ctl file......
total 3 packages processed...
total 3 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 423.868(ms)
#恢复表空间
RMAN> RECOVER DATABASE '/dm8/data/TEST/dm.ini' TABLESPACE MAIN;
RECOVER DATABASE '/dm8/data/TEST/dm.ini' TABLESPACE MAIN;
Database mode = 0, oguid = 0
[WARN]tablespace MAIN is corrupted(state: 2), restore or drop please.
EP[0]'s cur_lsn[53006]
RECOVER TABLESPACE[MAIN] IN DB[/dm8/data/TEST/dm.ini] CHECK......
EP[0]'s cur_lsn[53006]
EP:0 total 3 pkgs applied, percent: 10%
EP:0 total 6 pkgs applied, percent: 20%
EP:0 total 9 pkgs applied, percent: 31%
EP:0 total 12 pkgs applied, percent: 41%
EP:0 total 15 pkgs applied, percent: 51%
EP:0 total 18 pkgs applied, percent: 62%
EP:0 total 21 pkgs applied, percent: 72%
EP:0 total 24 pkgs applied, percent: 82%
EP:0 total 27 pkgs applied, percent: 93%
EP:0 total 29 pkgs applied, percent: 100%
Recover from archive log finished, time used:0.086s.
CMD END.CODE:[0]
recover successfully.
time used: 546.781(ms)
定时备份命令: