Oracle 数据库备份实战

最近公司的客户但愿使用oracle数据库,因此咱们只好将数据从mysql数据库迁移到oracle数据库,并对oracle数据库制定了一个备份策略,以前虽然对oracle很熟悉,但作备份策略仍是第一次,因此详细记录下来并分享,欢迎你们指教。咱们使用rman进行热备份,并启用了闪回表。平时在操做重要数据前,还会经过数据泵(expdp/impdp)进行一次逻辑备份。node

备份模式

物理备份与逻辑备份mysql

物理备份: 物理备份是磁盘块为基本单位将数据从主机复制到备机。sql

逻辑备份: 逻辑备份是以文件为基本单位将数据从主机复制到备机,经过sql或者flatfile文件为中转进行迁移。数据库

高效性:bash

物理备份是位于文件系统之下和硬件磁盘驱动之上。增长了一个软驱动,它忽略了文件和结构,处理过程简洁,所以在执行过程当中所花费在搜索操做上的开销较少,备份的性能很高。oracle

逻辑备份是基于文件级别的备份,因为每一个文件都是由不一样的逻辑块组成。每个逻辑的文件块存储在连续的物理磁盘块上,但组成一个文件的不一样逻辑块极有可能存储在分散的磁盘块上。逻辑备份在对非连续存储磁盘上的文件进行备份时须要额外的查找操做。这些额外的操做增长了磁盘的开销,下降了磁盘的吞吐率。因此,跟物理备份相比较,备份性能较差。ide

物理备份避免了当文件出现一个小的改动的时候,就须要对整个文件作备份,只是会去作改动部分的备份,有效的提升了备份效率,节省了备份时间。工具

逻辑备份模式下,文件即便一个很小的改变,也需将整个文件备份。这样若是一个文件很大的状况下,就会大幅度的下降备份效率,增长磁盘开销和备份时间。性能

实时性:ui

物理备份能够作到高效的实时备份,由于在每次主机往磁盘写数据的时候,都须要同时将数据写入到备机,这种写入操做都是基于磁盘扇区的,因此,很快就能被识别。只有在备机完成以后,才会返回给上层的应用系统来继续下一步工做。

逻辑备份是很难作到实时备份的,由于它的每次修改都是基于文件的,而文件的哪部分被修改,系统很难实时捕获到,因此备份的时候须要把整个文件读一遍再发到备机 ,实时的效率不是很高。

支持度:

物理备份是在文件系统之下对数据进行复制,因此它不受文件系统限制,能够支持各类文件系统包括RAW分区。

逻辑备份是以单个文件为单位对数据进行复制,因此它受文件系统限制,仅能对部分支持的文件系统作备份,不支持RAW分区。

(原文摘自:https://yq.aliyun.com/articles/167057?utm_content=m_28176

 

备份方式

数据泵备份、热备份和冷备份

数据泵备份

属于逻辑备份,以文件为备份单位,expdb的导出模式有:

一、表模式:导出用户全部表或者指定的表。

二、用户模式:导出用户全部对象以及对象中的数据。

三、导出表空间:导出数据库中特定的表空间。

四、整个数据库:导出数据库中全部对象。

 

咱们以用户模式为例:

一、建立逻辑目录,该命令不会在操做系统建立真正的目录(要先建立真正的目录),最好以system等管理员建立逻辑目录。

SQL> sqlplus root/root@orcl

SQL> conn as sysdba;(输入sys用户名、密码)

SQL> create directory dump_dir as '/data/exp+imp';

二、查看管理员目录(操做系统下该目录必须存在,假如不存在,则出错)

SQL>select * from dba_directories;

三、给root用户赋予在指定目录的操做权限,最好以system等管理员赋予。

SQL>grant read,write on directory dump_dir to root;

四、导出数据

expdp root/root@orcl schemas=root dumpfile=expdp201810291556.dmp log=expdp201810291556.log directory=dump_dir;

五、导入数据

在另外一台主机须要建相同的文件夹dump_dir,从用户root导入到用户root,不一样用户使用REMAP_SCHEMA=orcldev:orcltwo。

impdp root/root@orcl directory=dump_dir dumpfile=expdp201810291556.dmp schemas=root table_exists_action=replace

 

实际在使用expdb/impdb时有不少参数能够选择,这里很少讲述,你们自行参考oracle相关资料。

(参考博客:http://lizhiyu.iteye.com/blog/2203081

 

热备份和冷备份

冷备份指在数据库系统shutdown以后,使用操做系统的命令对表空间进行拷贝进行备份。冷备份只能恢复到以前的某一备份点,而该备份点到出现问题之间这段时间的数据是没法恢复的。

热备份指在数据库系统不停机的状况下进行备份。热备份只能在归档模式下进行。热备份能够在数据库系统崩溃时根据归档日志恢复到以前的任一时间点。热备份一般用于数据的重要性较高、数据库系统为7 X 24不间歇工做模式时。

 

咱们使用RMAN来实现热备份。RMAN能够用来备份和还原数据库文件、归档日志和控制文件。它也能够用来执行彻底或不彻底的数据库恢复。但RMAN不能用于备份初始化参数文件和口令文件。RMAN备份和还原的实质是去启动oracle中的进程,使用驱动进程去备份和还原数据。

       在进行热备份时咱们会同时备份控制文件、数据文件、重作日志。

数据文件:

每个Oracle数据库都要有一个或者多个物理的数据文件,这些数据文件里存储的就是Oracle数据库里的数据。就比如你有一个文件夹,里面有几个txt的文本文件,文本文件里记录的你这个月的每一笔花销。若是把文件夹看作是数据库,那么txt文件就是数据文件,而txt文件里面记录的每一笔花销就是数据了。

然而表、索引等等其实都是数据库的逻辑结构,这些表、索引都被物理的存储在了数据文件里面。

数据文件有三个特性:

一、一个数据文件只能属于一个数据库。

二、数据库中的数据文件能够被设置成自动的增加。

三、一个或者多个数据文件就组成了数据库的一个逻辑单元叫作---表空间。

数据文件里的数据,在须要的时候就会被读取到内容Oracle的缓冲区中,好比当咱们想查看一天数据时,而这条数据刚好又不在Oracle的缓冲区中,那么Oracle就会把这条数据从数据文件中读取到Oracle的缓冲区中来。

当更改或者新增一天数据时,也不是立刻就写到数据文件里面,这么作是为了减小对磁盘的访问,提升效率,数据先存储在缓冲区,而后在一次都写入数据文件,这个过程有一个dbwn后台进程来控制。

控制文件:

每个数据库都拥有控制文件,它和数据文件同样重要。控制文件里记录的是对数据库物理结构的详细信息,例如它包括以下三个信息:

一、数据库的名称

二、数据文件的名字和存在位置,重作日志文件的名字和存储位置

三、数据库建立的时间标识

Oracle可使用多重的控制文件,也就是说它能够同时维护多个彻底同样的控制文件,这么作就是为了防止数据文件损坏而形成的数据库故障。好比Oracle同时维护3个控制文件,当其中有1个控制文件出问题了,就比较好解决,把出问题的删了,在复制一份没有问题的就能够了。

每当Oracle数据库的实例启动的时候,它就会经过控制文件来识别,要想执行数据库的一些操做,必须须要哪些数据文件和重作日志文件,以及这些数据文件和重作日志文件都存在在什么位置。当数据库的物理构成发生改变的时候,好比新增长了一个数据文件或者重作日志文件,那么控制文件就会自动的更新来记录这些变化。另外在数据库恢复的时候也会用到控制文件。

重作日志文件:

每一个Oracle数据库都拥有一组文件,其中包括2个或者多个重作日志文件(其实也能够拥有多组,用途跟多个控制文件同样)。这组文件总体被称为数据库的重作日志,而重作日志又是由一条一条的重作记录组成的,全部也被称为重作记录。

重作日志的主要做用就是记录全部的数据变化,当一个故障致使被修改过的数据没有从内存中永久的写到数据文件里,那么数据的变化是能够从重作日志中得到的,从而保证了对数据修改的不丢失。

为了防止重作日志自身的问题致使故障,因此Oracle拥有多重重作日志功能,也就是能够同时保存多组彻底相同的重作日志在不一样的磁盘上。

重作日志里的信息只是用于恢复因为系统或者介质故障所引发的数据无法写入数据文件的数据。好比忽然断电致使数据库的关闭,那么内存中的数据就不能写入到数据文件中,内存中的数据就会丢失。但当数据库从新启动时丢失的数据是能够被恢复的,能够从最近的重作日志中读取丢失信息而后应用到数据文件中,这样就把数据库恢复到断电前的状态。

在恢复操做中恢复重作日志信息的过程叫作回滚。

 

热备步骤

--show parameter db_name;
--sqlplus以sysdba身份链接orcl
conn /@orcl as sysdba;
--重启监听:lsnrctl stop/lsnrctl start 

--一、开启归档模式(sqlplus工具,sys用户)
    --查看闪回恢复区的信息。
    show parameter db_recover
    --增大闪回恢复区
    alter system set db_recovery_file_dest_size=3G;
    --修改归档日志的存放路径
    alter system set log_archive_dest_1='location=/data/oracleArchive';
    
    
    --查看当前日志操做模式
    SELECT log_mode from v$database;
    --启用归档日志前要先中止数据库
    shutdown immediate;
    --数据库以mount方式启动
    startup mount;
    --启用数据库归档
    alter database archivelog;
    --打开数据库
    alter database open;
    --查看归档日志信息
    archive log list;

--二、开启补充日志
    --查看当前数据库中补充日志状态
    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;

--三、数据库备份,方式为全库方式
  --文件结构:
  /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')); --根据闪回表恢复指定表的数据到指定时间点
oracle_rman_backup.sh
#在node1每晚进行全量备份,同时删除过时备份和归档日志文件
#!/bin/bash
ORACLE_SID=ORCL
ORACLE_HOME=/data/oracle/product/11.2.0/db_1
ORACLE_BASE=/data/oracle
export ORACLE_SID
export ORACLE_HOME
export ORACLE_BASE
backtime=`date +%Y%m%d`
echo $backtime
$ORACLE_HOME/bin/rman target sys/root@orcl log=/data/rmanbak/log/node1_backupall_$backtime.log<<EOF
run{
    configure default device type to disk;
    configure device type disk parallelism 2;
    configure channel 1 device type disk format '/data/oracleBackup/back1/backup_%U';
    configure channel 2 device type disk format '/data/oracleBackup/back2/backup_%U';
    configure controlfile autobackup on;
    configure controlfile autobackup format for device type disk to '/data/oracleBackup/back1/ctl_%F';
    configure retention policy to recovery window of 7 days;
}
run{ 
    backup database ;
    backup archivelog all  delete input;
    report obsolete; 
    delete noprompt  obsolete; 
    crosscheck backup;
    crosscheck archivelog all;
    delete noprompt expired backup;
}
EOF
echo "backup complete!"
#当有多个节点进行备份时相互copy日志
#scp /oracle/rmanbak/log/node1_backupall_$backtime.log oracle@OracleNode2:/oracle/rmanbak/log/
exit



#RAC rman backup scripts
#每晚1点开始备份
##crontab -e
##0 1 * * * /data/rmanbak/oracle_rman_backup.sh >> /data/rmanbak/log/oracle_rman_backup.log

 

 

参考:

博客:http://lizhiyu.iteye.com/blog/2203081

https://yq.aliyun.com/articles/167057?utm_content=m_28176

相关文章
相关标签/搜索