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
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
最新文章
- Python json.dumps 特殊数据类型的自定义序列化操作
- 【MySql】存储过程添加事务
- python处理ajax请求
- HD1285(拓扑排序)
- 14.8.2 Role of the .frm File for InnoDB Tables InnoDB 表得到 .frm文件的作用
- 关于winform主题IrisSkin2的编写
- Qt编程之实现属性窗口编辑器
- JavaScript深入浅出补充——(二)语句和严格模式,对象
- [HNOI2015]菜肴制作 拓扑序
- 实时监听input输入框value的变化:
- Python教学课程分享
- SpringMVC Web项目升级为Springboot项目(二)
- yarn 常用命令
- Mysql实现树形递归查询
- Linux Rsyslog日志集中管理
- 干货 | Elasticsearch 集群健康值红色终极解决方案【转】
- 记一次在.NET成长之路上的下午茶
- 【转】XP系统远程桌面连接2012R2提示:远程计算机需要网络级别身份验证,而您的计算机不支持该验证
- dns 域名地址
- Mac电脑Dock栏开启放大特效
热门文章
- 关于System.out.println()与System.out.print(";\n";)的区别
- 安卓使用Dialog创建普通对话框
- IDF 实验室部分题目WriteUp
- 手机控制电脑,在WIFI局域网下(关机,重启,遥控)
- 【HDOJ】1244 Max Sum Plus Plus Plus
- dnat,snat
- 反汇编动态追踪工具Ollydbg. ALD,ddd,dbg,edb...
- -_-#【Angular】定义服务
- Children’s Queue HDU 1297 递推+大数
- 深入JS系列学习2