我们使用RMAN来实现热备份。RMAN可以用来备份和还原数据库文件、归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。但RMAN不能用于备份初始化参数文件和口令文件。RMAN备份和还原的实质是去启动oracle中的进程,使用驱动进程去备份和还原数据。
在进行热备份时我们会同时备份控制文件、数据文件、重做日志。
数据文件:
每一个Oracle数据库都要有一个或者多个物理的数据文件,这些数据文件里存储的就是Oracle数据库里的数据。就好比你有一个文件夹,里面有几个txt的文本文件,文本文件里记录的你这个月的每一笔花销。如果把文件夹看做是数据库,那么txt文件就是数据文件,而txt文件里面记录的每一笔花销就是数据了。
然而表、索引等等其实都是数据库的逻辑结构,这些表、索引都被物理的存储在了数据文件里面。
数据文件有三个特性:
1、一个数据文件只能属于一个数据库。
2、数据库中的数据文件可以被设置成自动的增长。
3、一个或者多个数据文件就组成了数据库的一个逻辑单元叫做---表空间。
数据文件里的数据,在需要的时候就会被读取到内容Oracle的缓冲区中,比如当我们想查看一天数据时,而这条数据恰好又不在Oracle的缓冲区中,那么Oracle就会把这条数据从数据文件中读取到Oracle的缓冲区中来。
当更改或者新增一天数据时,也不是马上就写到数据文件里面,这么做是为了减少对磁盘的访问,提高效率,数据先存储在缓冲区,然后在一次都写入数据文件,这个过程有一个dbwn后台进程来控制。
控制文件:
每一个数据库都拥有控制文件,它和数据文件一样重要。控制文件里记录的是对数据库物理结构的详细信息,例如它包括如下三个信息:
1、数据库的名称
2、数据文件的名字和存在位置,重做日志文件的名字和存储位置
3、数据库创建的时间标识
Oracle可以使用多重的控制文件,也就是说它可以同时维护多个完全一样的控制文件,这么做就是为了防止数据文件损坏而造成的数据库故障。比如Oracle同时维护3个控制文件,当其中有1个控制文件出问题了,就比较好解决,把出问题的删了,在复制一份没有问题的就可以了。
每当Oracle数据库的实例启动的时候,它就会通过控制文件来识别,要想执行数据库的一些操作,必须需要哪些数据文件和重做日志文件,以及这些数据文件和重做日志文件都存在在什么位置。当数据库的物理构成发生改变的时候,比如新增加了一个数据文件或者重做日志文件,那么控制文件就会自动的更新来记录这些变化。另外在数据库恢复的时候也会用到控制文件。
重做日志文件:
每个Oracle数据库都拥有一组文件,其中包括2个或者多个重做日志文件(其实也可以拥有多组,用途跟多个控制文件一样)。这组文件整体被称为数据库的重做日志,而重做日志又是由一条一条的重做记录组成的,所有也被称为重做记录。
重做日志的主要作用就是记录所有的数据变化,当一个故障导致被修改过的数据没有从内存中永久的写到数据文件里,那么数据的变化是可以从重做日志中获得的,从而保证了对数据修改的不丢失。
为了防止重做日志自身的问题导致故障,所以Oracle拥有多重重做日志功能,也就是可以同时保存多组完全相同的重做日志在不同的磁盘上。
重做日志里的信息只是用于恢复由于系统或者介质故障所引起的数据没法写入数据文件的数据。比如突然断电导致数据库的关闭,那么内存中的数据就不能写入到数据文件中,内存中的数据就会丢失。但当数据库重新启动时丢失的数据是可以被恢复的,可以从最近的重做日志中读取丢失信息然后应用到数据文件中,这样就把数据库恢复到断电前的状态。
在恢复操作中恢复重做日志信息的过程叫做回滚。
热备步骤
--show parameter db_name;
--sqlplus以sysdba身份连接orcl
conn /@orcl as sysdba;
--重启监听:lsnrctl stop/lsnrctl start
--1、开启归档模式(sqlplus工具,sys用户)
--查看闪回恢复区的信息。
show parameter db_recover
--增大闪回恢复区
alter system set db_recovery_file_dest_size=3G;
--修改归档日志的存放路径
alter system set log_archive_dest_1='location=http://www.likecs.com/data/oracleArchive';
--查看当前日志操作模式
SELECT log_mode from v$database;
--启用归档日志前要先停止数据库
shutdown immediate;
--数据库以mount方式启动
startup mount;
--启用数据库归档
alter database archivelog;
--打开数据库
alter database open;
--查看归档日志信息
archive log list;
--2、开启补充日志
--查看当前数据库中补充日志状态
select SUPPLEMENTAL_LOG_DATA_MIN min,
SUPPLEMENTAL_LOG_DATA_PK pk,
SUPPLEMENTAL_LOG_DATA_UI ui,
SUPPLEMENTAL_LOG_DATA_FK fk,
SUPPLEMENTAL_LOG_DATA_ALL "all"
from v$database;
--最小补充日志是最基本的一种数据库级补充日志,
--启用最小补充日志
alter database add supplemental log data ;
--关闭最小补充日志
--alter database drop supplemental log data ;
--主键补充日志
alter database add supplemental log data (primary key) columns ;
--唯一索引补充日志
alter database add supplemental log data (unique) columns ;
--外键补充日志
alter database add supplemental log data (foreign key) columns ;
--全体字段补充日志
alter database add supplemental log data (all) columns;
--3、数据库备份,方式为全库方式
--文件结构:
/data/oracleArchive
/data/rmanbak/rman_ts
/data/rmanbak/log
/data/oracleBackup
/data/oracleBackup/backup1
/data/oracleBackup/backup2
--a.开启归档模式
--b.创建恢复目录的表空间rman_ts(sys用户):
create tablespace rman_ts datafile '/data/rmanbak/rman_ts.dbf' size 20G;
--c.创建rman用户并授权
create user rman identified by root default tablespace rman_ts temporary tablespace temp;
grant connect, recovery_catalog_owner, resource to rman;
--d.创建恢复目录
rman catalog rman/root target orcl
create catalog tablespace rman_ts
--e.注册目标数据库
register database;
--f.使用rman进行完全数据库备份:
--自动备份需要写脚本且定时执行,参见文件oracle_rman_backup.sh:
--g.使用rman进行恢复
--归档日志:
run{
allocate channel dev1 type disk;
restore archivelog all;
release channel dev1;
}
--恢复数据库,需要将数据库mount或将数据文件offline
--rman target sys/root@orcl
--rman> shutdown immediate
--rman> startup mount
--RMAN> restore database; --恢复到某一备份
--RMAN> recover database; --从某一备份根据重做日志恢复到指定时间点
--RMAN> alter database open;
run{
allocate channel dev1 type disk;
set until time "to_date('2018-09-21 14:45:50','yyyy-mm-dd hh24:mi:ss')";--可以设置恢复到某一时间点
restore database;
recover database;
release channel dev1;
}
--select * from equ as of timestamp to_timestamp('2018-09-21 14:45:50','yyyy-mm-dd hh24:mi:ss');
--flashback table equ to timestamp(to_date('2018-09-26 14:45:50','yyyy-mm-dd hh24:mi:ss')); --根据闪回表恢复指定表的数据到指定时间点