开发者社区> leshami> 正文

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

简介:       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)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一个关于操作数据库的建议—用户密码
我们在创建用户的时候,如果往数据库里直接写账号密码,那么就会产生一个问题:密码直接暴露了。 如果是这样,那么将会很危险,因为一旦别人看见之后,自己的数据库将会非常的危险!
21 0
03.创建与删除数据库,数据库账号管理|学习笔记
快速学习 03.创建与删除数据库,数据库账号管理
34 0
无法删除数据库,因为该数据库当前正在使用
今天在SQL Server中删除数据库的时候,报的这个错误,在网上找到一段代码,可以解决这个问题: 新建查询,执行下面的代码,完美解决!(PS:记得把下面的“databasename”改成要删除的数据库名)
154 0
创建与删除数据库,数据库账号管理|学习笔记
快速学习创建与删除数据库,数据库账号管理
73 0
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色_21.1. 数据库角色
21.1. 数据库角色 数据库角色在概念上已经完全与操作系统用户独立开来。事实上可能维护一个对应关系会比较方便,但是这并非必需。数据库角色在一个数据库集簇安装范围内是全局的(而不是独立数据库内)。
1193 0
+关注
leshami
传播知识,分享快乐!十年以上数据库,系统运维与管理,性能优化经验。全部文章,欢迎扩散,转载请注明出处!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
数据库2025 V3
立即下载
高可用数据库的搭建与备份恢复策略验证实战
立即下载
阿里云数据库案例集下载
立即下载