一、概述

  在公司中,我们会经常面临着一种情况。我们制定了对数据库的操作方案后,还不可以在真正的数据库上执行,需要在备用数据库进行测试,这个时候就需要备用数据上的数据和真正数据库的数据是一模一样的。我们这里说的数据库不是指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
MAXLOGMEMBERS
MAXDATAFILES
MAXINSTANCES
MAXLOGHISTORY
LOGFILE
GROUP '/u01/app/oracle/oradata/cddx/redo01.log' SIZE 50M,
GROUP '/u01/app/oracle/oradata/cddx/redo02.log' SIZE 50M,
GROUP '/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
CREATE CONTROLFILE SET DATABASE cddx RESETLOGS ARCHIVELOG
MAXLOGFILES
MAXLOGMEMBERS
MAXDATAFILES
MAXINSTANCES
MAXLOGHISTORY
LOGFILE
GROUP '/u01/app/oracle/oradata/cddx/redo01.log' SIZE 50M,
GROUP '/u01/app/oracle/oradata/cddx/redo02.log' SIZE 50M,
GROUP '/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
/ 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
---------- SQL> select dbid from v$database; DBID
----------

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

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

18.查看数据库ID

SQL> select dbid from v$database;

      DBID
---------- 原先是:

五、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:

然后源库归档当前日志

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./db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = hndx)
(ORACLE_HOME = /u01/app/oracle/product/10.2./db_1)
(GLOBAL_DBNAME=hndx)
)
)

再次将监听器stop 然后start.

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

Service "weber" has  instance(s).
Instance "weber", status BLOCKED, has handler(s) for this service...
Service "weber_XPT" has instance(s).
Instance "weber", status BLOCKED, has 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 ;
duplicate target database to 'weber' open restricted
db_file_name_convert=('/u01/app/oracle/oradata/orcl/','/u01/app/oracle/oradata/weber/')
logfile
group ('/u01/app/oracle/oradata/weber/redo01.log') size 50M,
group ('/u01/app/oracle/oradata/weber/redo02.log') size 50M,
group ('/u01/app/oracle/oradata/weber/redo03.log') size 50M;
}

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

SQL> select status from v$instance;

STATUS
------------
OPEN

ORACLE复制数据库【weber出品】的更多相关文章

  1. ORACLE调度之基于事件的调度(二)【weber出品】

    一.回顾 调度分基于时间的调度和基于事件的调度. 稍微复习一下前面的只是请浏览:<ORACLE调度之基于时间的调度(一)[weber出品]> 二.知识补充 1.队列:一种数据结构,就像一根 ...

  2. 全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】

    <ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入D ...

  3. 全世界最详细的图形化VMware中linux环境下oracle安装(一)【weber出品必属精品】

    安装流程:前期准备工作--->安装ORACLE软件--->安装升级补丁--->安装odbc创建数据库--->安装监听器--->安装EM <前期准备工作> 安装 ...

  4. ORACLE用户管理方式下备份数据和复制数据库

    首先要明确的是,oracle数据库的备份可以分为逻辑备份和物理备份.           逻辑备份的是通过数据导出对数据进行备份,主要方式有老式的IMP/EXP和数据泵灯方式.适合变化较少的数据库,而 ...

  5. ORACLE调度之基于时间的调度(一)【weber出品】

    一.调度的概述 这里我看到一篇对调度的概述觉得描述的比我好,但仅限于概述部分,其他部分我觉得我讲的比他好,于是发生以下事情: ************************华丽的转载******** ...

  6. Oracle 11gR2使用RMAN duplicate复制数据库

    11g的RMAN duplicate 个人感觉比10g的先进了很多,10g需在rman备份的基础上进行复制,使用RMAN duplicate创建一个数据完全相同但DBID不同的数据库.而11g的RMA ...

  7. Oracle DB 复制数据库

    • 列出创建副本数据库的目的 • 选择用于复制数据库的方法 • 使用RMAN 复制数据库 • 使用RMAN 备份复制数据库 • 基于正在运行的实例复制数据库 使用副本数据库 • 使用副本数据库可执行以 ...

  8. oracle RMAN复制数据库

    列出创建副本数据库的目的 • 选择用于复制数据库的方法 • 使用RMAN 复制数据库 • 使用RMAN 备份复制数据库 • 基于正在运行的实例复制数据库   使用副本数据库 • 使用副本数据库可执行以 ...

  9. Oracle 11gR2 使用RMAN Duplicate复制数据库

    Oracle 11gR2 使用RMAN Duplicate复制数据库     前言:     上周刚做完一个项目,用户要求RAC的数据库可以自己主动备份到另外一个单节点上,单节点可以正常拿起来就能用. ...

随机推荐

  1. centos 安装 mongo3.0

    官方网站传贴,每次去翻doc,麻烦 vi  /etc/yum.repos.d/mongodb-org-3.0.repo [mongodb-org-3.0]name=MongoDB Repository ...

  2. bzoj4306: 玩具厂

    Description 在JIH考察的地图中有N个城市,被公路依次连成了一个环,JIH想在这些城市中建一个玩具厂.城市和公路都被编号为1..N,i号公路连接i-1号城市与i号城市(1号公路连接N号城市 ...

  3. 转:Hprose for php(二)——服务器

    文章来自于:http://blog.csdn.net/half1/article/details/21252879 本文将介绍Hprose for php服务器的更多细节 1.发布服务 Hprose提 ...

  4. linux wenjian

    文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件.利用这种机制能够使读写单个文件的过程变得更安全. 在这篇文章中,我们将探讨Linux中不同类型的文件锁,并通过示例程序来理解它们之 ...

  5. Linux下的库操作工具-nm、ar、ldd、ldconfig和ld.so

    Linux下的库操作工具-nm.ar.ldd.ldconfig和ld.so .nm [options] file 列出file中的所有符号 [option] -c 将符号转化为用户级的名字 -s 当用 ...

  6. pstree命令

    功能说明:以树状图显示运行的程序. 语法:pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>] 补充说明:pstree指 ...

  7. 【转】Android Activity和Intent机制学习笔记----不错

    原文网址:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html Activity Android中,Activity是所有程序的根 ...

  8. 【转】(DT系列六)devicetree中数据和 struct device有什么关系

    原文网址:http://www.cnblogs.com/biglucky/p/4057499.html devicetree中数据和structdevice有什么关系 总体来说,devicetree与 ...

  9. [C#错误] 未找到类型或命名空间名称" " (是否缺少 using 指令或程序集引用?)

    现象:编译项目时提示未找到类型或命名空间名称" " (是否缺少 using 指令或程序集引用?)解决方法:如果是未找到类型,检查是否引用了类型所在的命名空间,使用using指令.如 ...

  10. 给大家介绍款在线压缩JS的工具

    首先说下该工具的域名:http://javascriptcompressor.com/ 进入后界面如下: 具体要讲下它的功能点:在线压缩 Javascript 源码可以分不同的压缩级别:比如,一般情况 ...