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

 

转载于:https://www.cnblogs.com/yaoweber/p/4018414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
复制,顾名思义就是将数据库中的数据拷贝到不同物理地点的数据库中。 在很多生产环境中,经常遇到一些大量得数据,这些数据只用作查询统计功能。例如:历史告警,历史性能指标,历史事件,等等。这种数据的特点是:只读不写,数据量相当大,一旦查询大结果集的数据时,对数据库的IO,内存缓存占用相当大,会严重影响同一个数据库的其他会话的操作,表现为整个数据库反应迟缓,业务功能不可用。采用复制技术后,将这些大型数据复制到另外一个数据库中,对这些大数据的查询统计操作放在另外的一台数据库服务器上进行,即使受影响,也只是影响局部的查询统计功能,其他正常的业务处理不受影响。 但是,使用复制技术的话,意味着一个系统中,至少存在两个数据库(集群的数据库也当成一个数据库),对应的应用程序也需要建立多个数据库连接,能够根据业务需要,访问不同的数据库ORACLE数据库自身提供有复制功能,只需要进行配置即可实现。 ORACLE提供有三种复制技术: 高级复制(Advanced Replication) 流复制(Streams Replication) 备库(Dataguard) 备库的方式,就是数据库数据库的备份方式,主要是解决容灾的,不讨论此话题。 流复制主要是利用ORACLE的归档日志,进行增量备份来实现的,不仅可以配置只复制某些表,还可以配置仅复制某些表上的ddl或dml。可以复制到表,用户,数据库级别。 高级复制主要是基于触发器的原理来触发数据同步的,因此,高级复制无法实现用户,数据库级别的对象复制,只能做些表、索引和存储过程的复制。 如果出于容灾整个数据库的考虑,高级复制相当复杂,而且并不一定能做好,流复制的配置相对简单。流复制是后来产生的复制技术,是基于日志挖掘技术实现的,对数据库的影响较低。但在稳定性方面较差,实时性没有高级复制强(因为高级复制是基于触发器的)。如果系统意外的话,流复制的恢复将会需要较长时间,特别是意外时间越长,恢复时间成倍增长。 下面使用相同的环境,分别对两种复制功能进行配置介绍,并进行性能压力测试比较。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值