zoukankan      html  css  js  c++  java
  • Oracle 数据库备份实战

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

    备份模式

    物理备份与逻辑备份

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

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

    高效性:

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

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

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

    逻辑备份模式下,文件即使一个很小的改变,也需将整个文件备份。这样如果一个文件很大的情况下,就会大幅度的降低备份效率,增加磁盘开销和备份时间。

    实时性:

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

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

    支持度:

    物理备份是在文件系统之下对数据进行复制,所以它不受文件系统限制,可以支持各种文件系统包括RAW分区。

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

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

    备份方式

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

    数据泵备份

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

    1、表模式:导出用户所有表或者指定的表。

    2、用户模式:导出用户所有对象以及对象中的数据。

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

    4、整个数据库:导出数据库中所有对象。

    我们以用户模式为例:

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

    SQL> sqlplus root/root@orcl

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

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

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

    SQL>select * from dba_directories;

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

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

    4、导出数据

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

    5、导入数据

    在另一台主机需要建相同的文件夹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文件里面记录的每一笔花销就是数据了。

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

    数据文件有三个特性:

    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=/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')); --根据闪回表恢复指定表的数据到指定时间点
    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

    永葆一颗纯洁、仁慈和意气风发的心!
  • 相关阅读:
    SSL证书安装指引
    SSL证书绑定成功
    我是如何将网站全站启用Https的?记录博客安装配置SSL证书全过程
    _INT_SIZEOF 规格严格
    Java: Multidimensional array vs. Onedimensional 规格严格
    Fix JDK TImer 规格严格
    Ecpilse debug视图 规格严格
    PE 分析 规格严格
    VC Unicode 规格严格
    Object Pool 规格严格
  • 原文地址:https://www.cnblogs.com/little-sheep/p/9871873.html
Copyright © 2011-2022 走看看