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

简介:       Oracle 同机数据库复制或克隆经常用于提供测试或开发环境。对于生成的克隆数据库有多种方式,如使用冷备方式进行数据库克隆(需要使用nid修改db_name),热备方式克隆数据库,rman方式克隆数据库等等。

      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

 

Oracle&nbsp;牛鹏社

 

相关参考
    Oracle 冷备份

    Oracle 热备份

    Oracle 备份恢复概念

    Oracle 实例恢复

    Oracle 基于用户管理恢复的处理

    SYSTEM 表空间管理及备份恢复

    SYSAUX表空间管理及恢复

    Oracle 基于备份控制文件的恢复(unsing backup controlfile)

    RMAN 概述及其体系结构

    RMAN 配置、监控与管理

    RMAN 备份详解

    RMAN 还原与恢复

    RMAN catalog 的创建和使用

    基于catalog 创建RMAN存储脚本

    基于catalog 的RMAN 备份与恢复

    RMAN 备份路径困惑

    自定义 RMAN 显示的日期时间格式

    只读表空间的备份与恢复

    Oracle 基于用户管理的不完全恢复

    理解 using backup controlfile

    使用RMAN实现异机备份恢复(WIN平台)

    使用RMAN迁移文件系统数据库到ASM

    基于Linux下 Oracle 备份策略(RMAN)

    Linux 下RMAN备份shell脚本

    使用RMAN迁移数据库到异机

    RMAN 提示符下执行SQL语句

    Oracle 基于 RMAN 的不完全恢复(incomplete recovery by RMAN)

目录
相关文章
|
关系型数据库 中间件 数据库
Mariadb数据库基本操作之用户管理
Mariadb数据库基本操作之用户管理
256 1
|
SQL 存储 Java
SQL用户权限总结 - sql server 2012数据库基础-用户管理及权限管理-实验报告
SQL用户权限总结 - sql server 2012数据库基础-用户管理及权限管理-实验报告
260 0
|
Java 关系型数据库 MySQL
MySQL初级之【3.数据库用户管理、备份与设计】
MySQL初级之【3.数据库用户管理、备份与设计】
|
SQL 存储 测试技术
SQL Server2014 SP2新增的数据库克隆功能
原文:SQL Server2014 SP2新增的数据库克隆功能 SQL Server2014 SP2新增的数据库克隆功能   创建测试库 --创建测试数据库 create database testtest use testtest go --创建表 create ta...
892 0
|
SQL 测试技术 数据库
[20180529]克隆数据库与dblinks注意.txt
[20180529]克隆数据库与dblinks注意.txt --//在做数据库克隆,一般情况下给开发做测试,要注意一个细节问题,就是数据库内建立的dblink. --//有可能导致一些异常情况,特别是国内环境生产数据库与测试数据库没有分开的情况下,很有可能导致 --//无意中窜改生产系统的数据.
1161 0
|
Oracle 网络协议 关系型数据库