• ORACLE复制数据库【weber出品】


    一、概述

      在公司中,我们会经常面临着一种情况。我们制定了对数据库的操作方案后,还不可以在真正的数据库上执行,需要在备用数据库进行测试,这个时候就需要备用数据上的数据和真正数据库的数据是一模一样的。我们这里说的数据库不是指RAID1这样的镜像备份。而是指克隆这个数据库然后将数据放到另一个数据库中而已。在备份数据库中我们完成对方案的执行确保万无一失后即可在真机上部署。

    二、分类

      目前用的比较多的复制数据库的方法有:

      1.手工复制数据库

      2.RMAN复制数据库

    三、环境

      VMware:8.0

      Linux:RHEL5

      Oracle:Release 10.2.0.5.0

      ORACLE_SID:orcl

      环境描述:我开了一台的虚拟机,其实可以开两台虚拟机来模拟最好了,可是本本的配置有限,只有在开这一台虚拟机的情况下进行数据库复制模拟。但是基本上都是一个样的。

    四、手工复制数据库

    1.首先先创建备份的脚本:backup.sh

     sqlplus / as sysdba<<eof
            alter database begin backup;
            !cp -v /u01/app/oracle/oradata/orcl/*dbf /u01/backup/hotbk
            alter database end backup;
            alter database backup controlfile to trace as  '/u01/backup/hotbk/control.trace' reuse;
            alter database backup controlfile to '/u01/backup/hotbk/control.bak' reuse;
            create pfile='/u01/backup/hotbk/initorcl.ora' from spfile;
    
            alter system switch logfile;
            alter system switch logfile;
            alter system switch logfile;
    
            exit
            eof
            echo "backup is complete!!!"

    2.给脚本赋权限

    chmod +x backup.sh

    3.执行脚本

    ./backup.sh

    4.等待备份成功后

    cp /u01/backup/hotbk/initorcl.ora  $ORACLE_HOME/dbs/initcddx.ora

    5.我们要做的就是修改我们的参数文件

    vi $ORACLE_HOME/dbs/initcddx.ora

    6.为什么要修改参数文件呢?因为数据库启动到mount状态就需要用到参数文件,参数文件里面包含着数据库的实例名等内容。具体还有什么可以自己百度。

    执行:%s/orcl/cddx
    这里将参数文件的orcl实例名换成了cddx 执行创建目录:mkdir
    -p /u01/app/oracle/admin/cddx/{a,b,c,u}dump mkdir -p /u01/app/oracle/oradata/cddx/

    7.修改完参数文件后我们就可以登入数据库了,在登入数据库之前我们需要修改环境变量,因为之前的环境变量为orcl,要是不修改立马启动到orcl这个数据库上去。

    export ORACLE_SID=cddx

    8.登入数据库,创建参数文件

    SQL>sqlplus / as sysdba
    SQL>create spfile from pfile;

    9.startup nomount后即可查看到整个数据库的实例和状态,这个时候运用到了参数文件后数据库启动到了nomount状态。

    10.之前我们已经将控制文件trace了以后,现在要对控制文件进行修改:

    修改/u01/backup/hotbk/control.trace:

    11.删除55行以上的内容,保留以下内容:其实我们要做的就是重建控制文件;变化地方:第一行SET DATABASE cddx RESETLOGS,将全部的orcl替换成cddx

    CREATE CONTROLFILE SET DATABASE cddx RESETLOGS  ARCHIVELOG
        MAXLOGFILES 16
        MAXLOGMEMBERS 3
        MAXDATAFILES 100
        MAXINSTANCES 8
        MAXLOGHISTORY 292
    LOGFILE
      GROUP 1 '/u01/app/oracle/oradata/cddx/redo01.log'  SIZE 50M,
      GROUP 2 '/u01/app/oracle/oradata/cddx/redo02.log'  SIZE 50M,
      GROUP 3 '/u01/app/oracle/oradata/cddx/redo03.log'  SIZE 50M
    -- STANDBY LOGFILE
    
    DATAFILE
      '/u01/app/oracle/oradata/cddx/system01.dbf',
      '/u01/app/oracle/oradata/cddx/undotbs01.dbf',
      '/u01/app/oracle/oradata/cddx/sysaux01.dbf',
      '/u01/app/oracle/oradata/cddx/users01.dbf',
      '/u01/app/oracle/oradata/cddx/example01.dbf'
    CHARACTER SET AL32UTF8 

    然后将之前备份的数据文件拷贝到/u01/app/oracle/oradata/weber/

    cp  /u01/backup/hotbk/    /u01/app/oracle/oradata/weber/

    12.接下来到sql中执行:

    SQL> get /u01/backup/hotbk/control.trace
      1  CREATE CONTROLFILE SET DATABASE cddx RESETLOGS  ARCHIVELOG
      2     MAXLOGFILES 16
      3     MAXLOGMEMBERS 3
      4     MAXDATAFILES 100
      5     MAXINSTANCES 8
      6     MAXLOGHISTORY 292
      7  LOGFILE
      8    GROUP 1 '/u01/app/oracle/oradata/cddx/redo01.log'  SIZE 50M,
      9    GROUP 2 '/u01/app/oracle/oradata/cddx/redo02.log'  SIZE 50M,
     10    GROUP 3 '/u01/app/oracle/oradata/cddx/redo03.log'  SIZE 50M
     11  -- STANDBY LOGFILE
     12  DATAFILE
     13    '/u01/app/oracle/oradata/cddx/system01.dbf',
     14    '/u01/app/oracle/oradata/cddx/undotbs01.dbf',
     15    '/u01/app/oracle/oradata/cddx/sysaux01.dbf',
     16    '/u01/app/oracle/oradata/cddx/users01.dbf',
     17    '/u01/app/oracle/oradata/cddx/example01.dbf'
     18* CHARACTER SET AL32UTF8
     19  /
    
    Control file created.
    
    创建控制文件后实例的状态自动会变成mounted

    13.现在我们进行对数据库的恢复:

    SQL>recover database until cancel

    14.恢复的时候可能会有报错,如果报错则使用REDO1这个日志文件来进行恢复

      recover database using backup controlfile

      然后输入之前redo文件所放的位置,还可能会日志的序列比较低,然后就不断是用redo01.log 和redo02.log 和redo03.log这3个日志文件来进行恢复。

    15.这个时候打开数据库

    SQL>alter database open resetlogs;

    16.查询数据库的状态和数据库的ID

    SQL> alter database open resetlogs;
    
    Database altered.
    
    SQL> select status from v$instance;
    
    STATUS
    ------------
    OPEN
    
    SQL> select dbid from v$database;
    
          DBID
    ----------
    1387955536
    SQL> select dbid from v$database;
    
          DBID
    ----------
    1387955536

    17.这个时候两个数据库的DBID是一样的,这个时候需要更改DBID更改dbid,这个时候需要将数据库处于mounted状态,然后在操作系统中执行.

    nid target=sys/rootroot
    输入y
    然后重启数据库即可更改dbid
    打开数据库的时候会出现一个错误:
    Database mounted.
    ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
    要求我们必须要重置归档日志的序号。

    18.查看数据库ID

    SQL> select dbid from v$database;
    
          DBID
    ----------
    2725151620
    
    原先是:1387955536

    五、RMAN复制数据库

       现在我们进行RMAN对数据库进行复制。首先备份源库

    rman target /
     
    backup database format='/u01/backup/rmanbk/%d_%s.dbf';

      获得源库当前scn,目标库只需要恢复到该scn即可

    sqlplus / as sysdba
    
    set serveroutput on
     
    DECLARE
      until_scn NUMBER;
    BEGIN
      until_scn:= DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
      DBMS_OUTPUT.PUT_LINE('Until SCN: '|| until_scn);
    END;
    /
    
    Until SCN: 628787

    然后源库归档当前日志

    SQL> alter system archive log current;

    将备份和归档日志复制到目标主机的相应位置,本实验在同一台主机上进行,故不需要这一步

    手工创建目标库的instance并启动到nomount状态

    1. 创建备份的参数文,取名为spfiledb.ora

    cp $ORACLE_HOME/dbs/spfileorcl.ora $ORACLE_HOME/dbs/spfilehndx.ora

    修改环境变量创建参数文件

    export ORACLE_SID=hndx
    sqlplus / as sysdba
    create pfile from spfile;

    vi inithndx.ora 修改如下:

    :%s/orcl/hndx/g

    然后再创建spfile参数文件:

    sqlplus / as sysdba
    create spfile from pfile;

    2. 创建相应的目录,启动辅助实例

    mkdir -p $ORACLE_BASE/admin/hndx/{a,b,c,u}dump
    mkdir -p /u01/app/oracle/oradata/hndx

    3. 在备库配置监听,服务名采用静态注册,启动监听

    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
          (PROGRAM = extproc)
        )
       (SID_DESC =
          (SID_NAME = hndx)
          (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
          (GLOBAL_DBNAME=hndx)
        )
      )

    再次将监听器stop 然后start.

    如果不进行静态注册的话实例会出现:blocked阻塞状态。

    Service "weber" has 2 instance(s).
      Instance "weber", status BLOCKED, has 1 handler(s) for this service...
    Service "weber_XPT" has 1 instance(s).
      Instance "weber", status BLOCKED, has 1 handler(s) for this service...
    The command completed successfully

    然后还要给备份数据库创建口令文件:

    orapwd file=$ORACLE_HOME/dbs/orapwhndx password=a

    接着连接源库和目标数据库:

    rman target sys/a@orcl auxiliary sys/a@hndx
    执行duplicate
    run
      {
      set until scn 451137;
      duplicate target database to 'weber'  open restricted
      db_file_name_convert=('/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/weber/')
      logfile 
      group 1('/u01/app/oracle/oradata/weber/redo01.log') size 50M,
      group 2('/u01/app/oracle/oradata/weber/redo02.log') size 50M,
      group 3('/u01/app/oracle/oradata/weber/redo03.log') size 50M;
      }

    数据库恢复完成后,目标数据库会被打卡。这个时候的dbid和源库是一样的。所以要修改dbid,具体请看前面的内容。

    SQL> select status from v$instance;
    
    STATUS
    ------------
    OPEN
  • 相关阅读:
    sslforfree的证书合并成类似于certbot的ssl证书文件
    190129 胡思乱想
    Android deprecated apache module (HttpClient, HttpResponse, etc.)
    黑阀 adb 命令
    windows10 vs2019 + opencv 3.4.7环境搭建
    ASP.NET MVC 微信公众号支付,微信公众平台配置
    jQuery 滚动条 滚动到底部(下拉到底部) 加载数据(触发事件、处理逻辑)、分页加载数据
    js显示yyyy年mm日dd天 星期几 的格式日期
    jQuery对 动态添加 的元素 绑定事件(on()的用法)
    Jquery判断页面图片是否加载失败,加载失败则显示默认图片
  • 原文地址:https://www.cnblogs.com/yaoweber/p/4018414.html
Copyright © 2020-2023  润新知