zoukankan      html  css  js  c++  java
  • ORACLE冷备份与恢复

    ORACLE备份和恢复有三种方式:

    (1)数据泵(expdp/impdp)

    (2)冷备份

    (3)RMAN备份

    就分类而言,(1)和(2)统有称为“冷”备份,(3)称为“热”备份。

    数据泵和冷备份只能将数据库还原到某个时间点上(就是备份的时间点),而RMAN备份在归档模式下,能够实时备份,实时还原,几乎可以做到数据无丢失,但对于数据仓库而言,开归档是很可怕的事情,因为归档日志很大,当然如果有必要也是可以开启的,需要做好ARCHIVELOG的备份和清理工作。

    本文只介绍冷备份,RMAN备份暂不介绍,如有需要,可GOOGLE搜索三思笔记《一步一步学RMAN》备份文档。

    网址:http://www.itpub.net/thread-810100-1-1.html

    一 数据泵

    数据泵备份方式是采用ORACLE自带的EXPDP和IMPDP备份的方式。

    LINUX和WINDOWS系统:

         可通过“expdp -help”命令来查看expdp命令选项

    1.1 数据泵备份和还原的先决条件

    数据泵备份和还原的先决条件

              (1)备份和还原路径

              (2)拥有EXPORT FULL DATABASE 和IMPORT FULL DATABASE权限

    系统权限和角色:

    SELECT *
      FROM Dba_Sys_Privs a
    WHERE a.Privilege LIKE '%EXP%'
        OR a.Privilege LIKE '%IMP%';
    SELECT *
      FROM Dba_Role_Privs a
    WHERE a.Granted_Role LIKE '%IMP%'
        OR a.Granted_Role LIKE '%EXP%';

    1.2 实施步骤

    1.2.1 创建路径

    1)检查路径是否存在

        SELECT * FROM Dba_Directories;

    2)新建备份和还原路径

        CREATE OR REPLACE DIRECTORY directory_name AS '具体绝对路径';

    例如:CREATE OR REPLACE Directory BACKUP_PATH AS '/home/oracle/dbbackup';

    --创建备份路径

        GRANT READ,WRITE ON DIRECTORY directory_name TO &user_name;

    例如:

        Grant READ, WRITE ON Directory BACKUP_PATH TO Test;

    --将读写路径的权限给某个用户

    1.2.2 授权

    授以某个用户的备份和还原的权限:

    GRANT EXPORT FULL DATABASE,IMPORT FULL DATABASE TO test;

    1.3 执行备份和还原脚本

    数据泵备份EXPDP命令,数据库还原IMPDP命令,以下均采用并行的方式,PARALLEL参数取决于CPU与CPU的线程数,但这个值不建议太大。

    注意备份脚本应该放到同一行去执行,脚本中间不能有换行。

    1.3.1备份TEST用户整库

    注意需要补充tns_name参数,当然也可以使用system用户。

    另外,使用PARALLEL参数后,建议dumpfile使用%u选项,将一个dumpfile拆分成多个,否则,PARALLEL参数效果不明显。

    (1)对应备份脚本:

    EXPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_FULL_20140526_%u.DMP SCHEMAS=TEST PARALLEL=8 LOGFILE=EXPDP_TEST_FULL_20140526.LOG

    2)对应还原脚本:

    IMPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_FULL_20140526_%u.DMP SCHEMAS=TEST PARALLEL=8 LOGFILE=IMPDP_TEST_FULL_20140526.LOG

    1.3.2只备份TEST用户元数据

    (1)对应备份脚本

    EXPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_METADATA_ONLY_20140526.DMP CONTEXT=METADATA_ONLY PARALLEL=8 LOGFILE=EXPDP_TEST_METADATA_ONLY_20140526.LOG

    (2)对应还原脚本

    IMPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_METADATA_ONLY_20140526.DMP CONTEXT=METADATA_ONLY PARALLEL=8 LOGFILE=IMPDP_TEST_METADATA_ONLY_20140526.LOG

    (3)备份SHELL脚本:

    #!/bin/sh

    expdp_date=`date +"%Y%m%d"`

    expdp test/oracle directory=backup_path dumpfile=expdp_metadata_only_${expdp_date}.dmp schemas=test content=METADATA_ONLY logfile=expdp_metadata_only_${expdp_date}.log

    1.3.3只备份TEST用户数据

    (1)对应备份脚本

    EXPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_DATA_ONLY_20140526_%u.DMP CONTEXT=DATA_ONLY PARALLEL=8 LOGFILE=EXPDP_TEST_DATA_ONLY_20140526.LOG

    (2)对应还原脚本

    IMPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_DATA_ONLY_20140526_%u.DMP CONTEXT=DATA_ONLY PARALLEL=8 LOGFILE=IMPDP_TEST_DATA_ONLY_20140526.LOG

    (3)备份SHELL脚本

    #!/bin/sh

    expdp_date=`date +"%Y%m%d"`

    expdp test/oracle directory=backup_path dumpfile=expdp_DATA_ONLY_${expdp_date}_%u.dmp schemas=test content=DATA_ONLY logfile=expdp_DATA_ONLY_${expdp_date}.log

    1.3.4 只备份TEST表

    用expdp/impdp备份和还原表数据,可使用tables或者是include命令选项。

    UNIX下EXPDP备份是,单引号以及括号需要转义,可以使用PARFILE选项。将命令写在参数文件系统里。

    如expdp_parfile.txt

    userid=test/oracle@tns_name directory=backup_path dumpfile=test_send_tables_20140526_%u.dmp parallel=8 tables =('TEST_DATA_1,'TEST_DATA_2','TEST_DATA_3'...) logfile=test_send_tables_20140526.log

    调用方式:

    expdp parfile=expdp_parfile.txt

    二 冷备份

    冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外的位置,可以根据重要性文件克隆一份数据库。

    冷备份还原注意事项:

           两台数据库服务器的操作系统必须是同构的(即:aix->aix或者linux->linux),不能是异构的(linux->aix),否则是没有用的。如果是异构的,那么只能采用数据泵的方式。

    冷备份的优点:

              (1)冷备模式下概念易于理解,即将需要备份的文件复制到安全的位置

              (2)容易恢复到某个时间点上(只需将文件再拷贝回去)

              (3)能与归档方法相结合,做数据库“最佳状态”的恢复。

             (4)低度维护,高度安全。

    冷备份的缺点:

              (1)单独使用时,只能提供到“某一时间点上”的恢复。

              (2)再实施备份的全过程中,数据库必须处于一致性关闭状态。

             (3)若磁盘空间有限,只能拷贝到磁带等其他外部存储设备上,速度会很慢。另外备份的速度与网络带宽有关。

             (4)不能按表或按用户恢复。

    2.1 实施步骤

    冷备份中必须拷贝的文件包括:

              (1)所有数据文件

              (2)所有控制文件

              (3)所有联机REDO LOG文件

              (4)Init.ora文件(可选)

              (5).profile或者.bash_profile(可选)

    注意:冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的。

    2.1.1备份控制文件

    冷备份要关闭数据库,在关闭数据库之前,先要备份控制文件,接着记录数据文件、redo日志文件和控制文件的位置。

    (1)备份控制文件:

               ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/control.txt'

               以上操作是将控制文件的内容备份到/tmp/control.txt文本里。目的在于重建控制文件或者RENAME FILE使用。

    (2)数据文件位置

              SELECT a.File_Name, a.Tablespace_Name, a.Bytes, a.Autoextensible,a.Online_Status

              FROM Dba_Data_Files a

              UNION

             SELECT b.FILE_NAME,b.Tablespace_Name, b.Bytes, b.Autoextensible,b.STATUS

             FROM Dba_Temp_Files b;

    (3)redo日志文件

             SELECT * from v$logfile;

    (4)控制文件

             SELECT * from v$controlfile;

    2.1.2 关闭数据库

    (1)停监听

              1)ps -ef |grep pmon

              2)lsnrctl stop

    (2)关闭数据库

            SQL>shutdown immediate

    2.1.3 复制文件

           将控制文件、数据文件、redo日志文件复制到另一块存储上。可以使用SCP命令进行复制。使用SCP命令需要安装SSH软件包,一般来说,LINUX系统默认是安装的;AiX需要安装SSH软件包。如果没有SSH软件包,可以到网上搜索进行下载安装。

    LINUX上SCP命令:

        usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i i dentity_file][-l limit] [-o ssh_option] [-P port] [-S program][[user@]host1:]file1 ... [[user@]host2:]file2

        例如:将一台机器上expdp_20140521.log传输到另外一台机器的/home/oracle/backup目录下,命令如下:

                  scp expdp_20140521.log oracle@192.168.56.88:/home/oracle/backup

    SCP命令还可以复制文件夹,-r选项,标识递归的复制子文件夹。

    SCP命令支持正则表达式,如:*等模糊查询操作。具体参考:man scp 帮助

    SCP复制的速度与网络带宽有关,可以说绝大程度上取决于网络带宽。

    建议:

    在复制之前最好统计一下数据文件和redo文件的个数,并与数据库中的数据进行比较。

    脚本:

    (1) ls *.dbf |wc –l

        与dba_data_files和dba_temp_files比较

    (2) ls *.log |wc –l

        与v$logfile比较

    (3) ls *.ctl |wc-l

        与v$controlfile比较

    三 冷备份还原

    如果目标库与源库的数据库安装路径都相同的话,相对来说就简单一些,可省略rename file操作,否则,可能需要rename file操作。

    当然,如果你手工创建控制文件的话,就不需要rename file操作。因为controlfile里记录了数据文件和redo日志文件的位置。

    3.1 数据库安装路径一致

    此操作的前提条件是:

         (1)数据文件路径一致

         (2)数据库的实例名称一致

        (3)控制文件的位置一致

    操作步骤:

           (1)复制完成后,即可拉启数据库

               SQL>STARTUP MOUNT;

              SQL>ALTER DATABASE OPEN RESETLOGS;

    如果以上操作顺利结束,表明数据库还原没有问题,可以启动数据库监听,连接数据库即可。

    启动监听:

               1)ps -ef |grep pmon

               2)lsnrctl start

    3.2 数据文件位置不一致

    如果数据文件位置不一致,那么就需要手工创建controlfile文件和rename数据文件。

    原因:

    原控制文件里记录的数据文件的位置与目标库数据文件的位置不同,数据库在mount阶段开始读controlfile里的内容。mount阶段找不到相应的数据文件,在数据库启动过程中就会报错,数据库无法启动。

    3.2.1 解决方法

    3.2.1.1将数据库开启到nomount状态

          SQL>STARTUP NOMOUNT

    3.2.1.2重建控制文件

          重建控制文件,相对来说比较简单。主要问题在于控制文件的格式不要出错就可以。

    手工创建控制文件内容可以从我们之前备份的control.txt里查看具体信息,手工创建控制文件只需要初始化数据库实例名,redo日终和数据文件以及数据库的字符集即可。具体可参考以下样例脚本。

    控制文件的主要内容(来自control.txt)大体如下:

    STARTUP NOMOUNT

    CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS NOARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 54288

    LOGFILE

    GROUP 1 '/home/oracle/app/oradata/testdb/redo01.log' SIZE 128M BLOCKSIZE 512,

    GROUP 2 '/home/oracle/app/oradata/testdb/redo02.log' SIZE 128M BLOCKSIZE 512,

    GROUP 3 '/home/oracle/app/oradata/testdb/redo03.log' SIZE 128M BLOCKSIZE 512,

    GROUP 4 '/home/oracle/app/oradata/testdb/redo04.log' SIZE 128M BLOCKSIZE 512

    -- STANDBY LOGFILE

    DATAFILE

    '/home/oracle/app/oradata/testdb/system01.dbf',

    '/home/oracle/app/oradata/testdb/sysaux01.dbf',

    '/home/oracle/app/oradata/testdb/undotbs01.dbf',

    '/home/oracle/app/oradata/testdb/users01.dbf',

    '/home/oracle/app/oradata/testdb/testdb01.dbf',

    '/home/oracle/app/oradata/testdb/testdb02.dbf',

    '/home/oracle/app/oradata/testdb/testdb03.dbf',

    '/home/oracle/app/oradata/testdb/testdbindex.dbf',

    '/home/oracle/app/oradata/testdb/undotbs02.dbf',

    '/home/oracle/app/oradata/testdb/testdb04.dbf',

    '/home/oracle/app/oradata/testdb/testdb05.dbf',

    '/home/oracle/app/oradata/testdb/testdb06.dbf',

    '/home/oracle/app/oradata/testdb/testdb07.dbf',

    '/home/oracle/app/oradata/testdb/testdb08.dbf',

    '/home/oracle/app/oradata/testdb/testdb09.dbf',

    '/home/oracle/app/oradata/testdb/testdb10.dbf',

    '/home/oracle/app/oradata/testdb/testdb11.dbf',

    '/home/oracle/app/oradata/testdb/testdb12.dbf',

    '/home/oracle/app/oradata/testdb/testdb13.dbf',

    '/home/oracle/app/oradata/testdb/testdb14.dbf',

    '/home/oracle/app/oradata/testdb/testdb15.dbf'

    CHARACTER SET AL32UTF8;

    注意手工创建控制文件常见问题就是文件格式问题。

    (1)去掉-- STANDBY LOGFILE

    (2)DATAFILE与LOGFILE之间不要有空行

    (3)另外,控制文件里是不包含临时表空间的数据文件的。

    3.2.1.3 rename file操作

    rename file操作是为了在数据库MOUNT时能够找到具体数据文件。rename操作是数据库处于mount状态时的操作命令。

    SQL>ALTER DATABASE MOUNT;

    SQL>@renamefile.sql

    执行renamefile.sql脚本,脚本内容参考如下:

    ALTER DATABASE RENAME FILE '/home/oracle/app/oradata/testdb/test01.dbf' TO '/u01/app/oradata/test01.dbf';

    将原数据库test01.dbf文件指定到目标数据库的新的位置上。可以将源数据库controlfile里的数据文件,形成一个rename脚本,然后调度执行即可。

    3.2.1.4打开数据库

    如果重建控制文件成功并且renamefile操作也没有问题,那么就可以拉启数据库了。

    SQL>ALTER DATABASE RESETLOGS;

    如果数据库正常启动,表明数据库还原没有问题,接下来启动监听即可。

    1)ps -ef|grep pmon

    2)lsnrctl start

    3.2.1.5 初始化临时表空间

    原因:

    控制文件里是不包含临时表空间的,因此,在数据库启动之后,有可能需要重新重建一下临时表空间。

    create temporary tablespace TESTTEMP tempfile '/home/oracle/app/oradata/test/testtemp.dbf' size 20G autoextend off;

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/oracle-dba/p/3754202.html
Copyright © 2011-2022 走看看