基于用户管理的同机数据库克隆

      Oracle 同机数据库复制或克隆经常用于提供测试或开发环境。对于生成的克隆数据库有多种方式,如使用冷备方式进行数据库克隆(需要使用nid修改db_name),热备方式克隆数据库,rman方式克隆数据库等等。由于是同机克隆,因此目标数据库与原数据库必须位于不同的目录,其次,使用不用的数据库名称(db_name)。本文主要列出使用基于用户管理的热备方式来进行数据库克隆的步骤并给出演示。

1、热备克隆步骤     a、创建目标数据库目录     b、创建目标数据库密码文件(orapwd)     c、创建目标数据库参数文件(pfile/spfile)     d、备份原数据库并复制备份文件到目标数据库     e、启动目标数据库到nomount状态并创建控制文件     f、恢复目标数据库(recover)     g、打开目标数据库(open with resetlogs)     h、校验数据库及添加临时数据文件

2、演示热备克隆数据库

-->演示环境
SQL> ho cat /etc/issue
Enterprise Linux Enterprise Linux Server release 5.5 (Carthage)
Kernel \r on an \m

SQL> select * from v$version where rownum<2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
SQL> select name,log_mode,open_mode from v$database;

NAME                        LOG_MODE     OPEN_MODE
--------------------------- ------------ --------------------
SYBO3                       ARCHIVELOG   READ WRITE

--原数据库名  : sybo3
--目标数据库名: sybo4
--原数据库目录:/u01/database/sybo3
--目标数据库目录:/u01/database/sybo4


--a、创建目标数据库目录
[oracle@linux3 database]$ more sybo4.sh
#!/bin/sh

mkdir -p /u01/database
mkdir -p /u01/database/sybo4/adump
mkdir -p /u01/database/sybo4/controlf
mkdir -p /u01/database/sybo4/flash_recovery_area
mkdir -p /u01/database/sybo4/oradata
mkdir -p /u01/database/sybo4/redo
mkdir -p /u01/database/sybo4/dpdump
mkdir -p /u01/database/sybo4/pfile
mkdir -p /u01/database/sybo4/db_broker
[oracle@linux3 database]$ ./sybo4.sh 


--b、创建目标数据库密码文件
$ orapwd file=$ORACLE_HOME/dbs/orapwsybo4 password=oracle entries=10


--c、创建目标数据库参数文件
--从原数据库生成目标数据库的初始化参数文件
SQL> create pfile='/u01/oracle/db_1/dbs/initsybo4.ora' from spfile;

--修改目标数据库参数文件
$ sed -i 's/sybo3/sybo4/g' $ORACLE_HOME/dbs/initsybo4.ora
$ grep sybo3 $ORACLE_HOME/dbs/initsybo4.ora    -->校验是否还存在sybo3相关字符

--最终的目标数据库参数文件
$ more $ORACLE_HOME/dbs/initsybo4.ora
sybo4.__db_cache_size=117440512
sybo4.__java_pool_size=4194304
sybo4.__large_pool_size=4194304
sybo4.__oracle_base='/u01/oracle'#ORACLE_BASE set from environment
sybo4.__pga_aggregate_target=150994944
sybo4.__sga_target=226492416
sybo4.__shared_io_pool_size=0
sybo4.__shared_pool_size=92274688
sybo4.__streams_pool_size=0
*.audit_file_dest='/u01/database/sybo4/adump/'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/database/sybo4/controlf/control01.ctl','/u01/database/sybo4/controlf/control02.ctl'
*.db_block_size=8192
*.db_domain='orasrv.com'
*.db_name='sybo4'
*.db_recovery_file_dest='/u01/database/sybo4/flash_recovery_area/'
*.db_recovery_file_dest_size=4039114752
*.dg_broker_config_file1='/u01/database/sybo4/db_broker/dr1sybo4.dat'
*.dg_broker_config_file2='/u01/database/sybo4/db_broker/dr2sybo4.dat'
*.dg_broker_start=FALSE
*.diagnostic_dest='/u01/database/sybo4'
*.log_archive_dest_1=''
*.memory_target=374341632
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'


--d、备份原数据库并复制备份文件到目标数据库
--创建一个临时表t用户验证克隆是否成功
SQL> create table t(name varchar2(10),action varchar2(20));

SQL> insert into t select 'Robinson','Transfer DB' from dual;

SQL> commit;

SQL> alter system archive log current;

--准备目标数据库创建控制文件脚本,此trace file位于参数user_dump_dest目录下
SQL> alter database backup controlfile to trace resetlogs;

--备份原数据库,如果数据库文件较多,使用热备脚本来完成
SQL> alter database begin backup;

--复制数据库文件到目标数据库目录
SQL> host cp /u01/database/sybo3/oradata/* /u01/database/sybo4/oradata

SQL> alter database end backup;


--e、启动目标数据库到nomount状态并创建控制文件
$ export ORACLE_SID=sybo4
$ sqlplus / as sysdba
SQL> startup nomount pfile=/u01/oracle/db_1/dbs/initsybo4.ora;
ORACLE instance started.

SQL> get sybo4ctl.sql
  1  CREATE CONTROLFILE SET DATABASE "sybo4" RESETLOGS  ARCHIVELOG
  2      MAXLOGFILES 16
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 100
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 '/u01/database/sybo4/redo/redo01.log'  SIZE 50M BLOCKSIZE 512,
  9    GROUP 2 '/u01/database/sybo4/redo/redo02.log'  SIZE 50M BLOCKSIZE 512,
 10    GROUP 3 '/u01/database/sybo4/redo/redo03.log'  SIZE 50M BLOCKSIZE 512
 11  DATAFILE
 12    '/u01/database/sybo4/oradata/system01.dbf',
 13    '/u01/database/sybo4/oradata/sysaux01.dbf',
 14    '/u01/database/sybo4/oradata/undotbs01.dbf',
 15    '/u01/database/sybo4/oradata/users01.dbf',
 16    '/u01/database/sybo4/oradata/example01.dbf'
 17  CHARACTER SET AL32UTF8
 18* ;
SQL> @sybo4ctl.sql

Control file created.

SQL> alter database mount;      -->注意创建控制文件之后,数据库已经被mount,如下我们收到了错误提示
alter database mount
*
ERROR at line 1:
ORA-01100: database already mounted

--上面我们修改了控制文件脚本,使用了set database以及resetlogs方式来创建数据库


--f、恢复目标数据库
SQL> set logsource '/u01/database/sybo3/flash_recovery_area/SYBO3/archivelog/2013_07_24';
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 847086 generated at 07/24/2013 14:42:06 needed for thread 1
ORA-00289: suggestion :
/u01/database/sybo3/flash_recovery_area/SYBO3/archivelog/2013_07_24/o1_mf_1_7_8216
17241.dbf
ORA-00280: change 847086 for thread 1 is in sequence #7

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/database/sybo3/redo/redo01.log
Log applied.
Media recovery complete.


--g、打开目标数据库
SQL> alter database open resetlogs;

Database altered.


--h、校验数据库及添加临时数据文件
SQL> select * from t;

NAME       ACTION
---------- --------------------
Robinson   Transfer DB

SQL> select name from v$datafile;

NAME
------------------------------------------------------------
/u01/database/sybo4/oradata/system01.dbf
/u01/database/sybo4/oradata/sysaux01.dbf
/u01/database/sybo4/oradata/undotbs01.dbf
/u01/database/sybo4/oradata/users01.dbf
/u01/database/sybo4/oradata/example01.dbf

SQL> col member format a60
SQL> select member from v$logfile;

MEMBER
------------------------------------------------------------
/u01/database/sybo4/redo/redo03.log
/u01/database/sybo4/redo/redo02.log
/u01/database/sybo4/redo/redo01.log

SQL> select name from v$controlfile;

NAME
------------------------------------------------------------
/u01/database/sybo4/controlf/control01.ctl
/u01/database/sybo4/controlf/control02.ctl

--Author : Robinson
--Blog   : http://blog.csdn.net/robinson_0612

SQL> select * from v$tempfile;

no rows selected

SQL> select property_name,property_value from database_properties where property_name like '%DEFAULT%';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP
DEFAULT_PERMANENT_TABLESPACE   USERS
DEFAULT_EDITION                ORA$BASE
DEFAULT_TBS_TYPE               SMALLFILE

SQL> select tablespace_name from dba_tablespaces where tablespace_name='TEMP';

TABLESPACE_NAME
------------------------------
TEMP

SQL> alter tablespace temp add tempfile '/u01/database/sybo4/oradata/tempfile.dbf' size 50m autoextend on;

--建立服务器参数文件,之后建议一致性关闭数据库,备份数据库,添加数据库到/etc/oratab,配置监听器等
SQL> create spfile from pfile;

3、小结      a、对于基于用户管理热备数据库的克隆有点类似于创建一个新的数据库,因为我们需要准备创建整个数据库所需的全部过程      b、注意理解Oracle数据库启动步骤(nomount,mount,open)及每一步骤所需要的相关文件与在不同阶段所完成的动作,见Oracle数据库实例启动关闭过程      c、注意理解几类不同文件的作用,即:Oracle 参数文件Oracle 密码文件Oracle 控制文件以及最终打开的数据库文件      d、对于数据库热备复制到目标数据库目录后等同于还原操作,也就是相当于 rman 的 restore 操作      e、数据库恢复操作使用了using backup controlfile方式,因为控制文件与数据文件不一致。可参考,理解 using backup controlfile      f、由于归档日志位于原数据库归档位置,因此在恢复期间使用了set logsource子句用于指定归档日志所在的位置      g、创建控制文件时,由于是一个新的db,因此必须使用resetlog方式,否则收到ORA-01223: RESETLOGS must be specified to set a new database name

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

外部表简单总结(r3笔记第51天)

对于外部表的使用而言,可能是既陌生又熟悉的感觉,说陌生可能自己真正的使用机会要少一些,而熟悉可能是大家比较常用的通过外部表来查看数据库日志,其实外部表还有更丰富...

28811
来自专栏乐沙弥的世界

MySQL 二进制日志(Binary Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日...

1302

在CentOS 6上使用Postfix,Dovecot和MySQL发送电子邮件

Postfix 邮件传输代理(MTA)是一种高性能的开源电子邮件服务器系统。本指南将帮助你在CentOS 6 Linode上运行 Postfix,使用 Dove...

3405
来自专栏数据和云

深入原理:Consistent Reads 与 buffer cache

黄玮(Fuyuncat) 资深Oracle DBA,个人网www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价. 编辑手记...

3677
来自专栏乐沙弥的世界

Oracle 参数文件

主要用来记录数据库的配置文件,在数据库启动时,Oracle读取参数文件,并根据参数文件中的参数设置来配置数据库。

841
来自专栏左瞅瞅,右瞅瞅

centos7.x之yum安装zabbix_proxy以及自动注册

zabbix proxy就是所谓的分布式监控,主要是代理zabbix server进行采集数据,zabbix proxy端也需要搭建另外一个mysql数据库,并...

6285
来自专栏淡定的博客

php之laravel学习常见错误4(连载中)

下面是我们整理的php的laravel学习的常见的错误以及解决的办法,我还会持续更新,请关注

3661
来自专栏我的博客

TP入门第八天

[小型留言板-增删查改] 1、先建立数据库lyb,然后建立表lyb_notes 建表代码如下: CREATE TABLE `lyb_notes` ( `id` ...

3568
来自专栏Albert陈凯

2018-07-12 Oracle for update和for update nowait的区别Oracle for update和for update nowait的区别

原版排版太难看了看着闹眼睛。 https://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.htm...

1042
来自专栏乐沙弥的世界

MongoDB 索引创建

七、更多参考 MongoDB 单键(列)索引 MongoDB 复合索引 MongoDB 多键索引 MongoDB 执行计划获取(db.colle...

2800

扫码关注云+社区

领取腾讯云代金券