中国网管论坛's Archiver

iamlargelove 发表于 2007-8-18 20:53

再发一个rman 复制数据库功能

RMAN数据库复制功能
此次学习RMAN的数据库复制功能可谓比较辛苦,首先比较难于理解的是RMAN的复制原理为何,
二者是RMAN 9I备份和恢复讲的实在是不清楚。算下来 实验--停止---实验 也有将近5天时间,
今天终于算是完成了。记录下来,以备将来。
在开始前先介绍相关原理:
1。首先,RMAN的辅助instance找到相关的备份,推测出利用哪个备份来还原数据库(其实复制也是个还原的过程)
2。为辅助数据库还原数据文件,这个过程和resotre database完全一样。
3。找相关的增量备份,继续还原数据文件,这个过程和RMAN的增量还原方式也完全一样。
4。应用相关的归档继续还原数据。
5。为辅助数据库创建新的控制文件
6。重新设置辅助数据库的redo,利用resetlogs打开数据库(redo是根据在复制时指定的参数,或者是写入了pfile)
全部过程如上,大部分过程和一般的restore database ,recover database 实在是没太大区别,或许你会认为
我手动复制不也一样嘛。 总的来说RMAN替我们做了大部分工作,所以还是比较方便。

注意:1。由于在还原过程需要执行大量的内部PL/SQL,所以share_pool_size 需要设置大一点,否者将出现ORA-04031错误。
   
      2。远程复制时,克隆的数据库名称,instance和目标数据库可以完全一样,也可以完全不一样。
      3。可以使用恢复目录,也可以不使用恢复目录
      4。由于为了不使目标数据库在复制时性能降低,RMAN使用辅助instance在克隆机器本地查找备份集和归档日志,
         所以在复制前,一定要把目标的备份集和归档COPY一份到克隆的数据库硬盘上去,而且路径必须与目标数据库的
         路径要完全一样。(因为RMAN的辅助instance是通过目标数据库的恢复目录或者控制文件来查找备份集和归档,
         所以路径当然要与目标数据库要完全一样罗。)

      5。由于辅助instance是不会去利用目标数据库的online log,所以克隆的数据库会比目标数据库过时一段时间,其实也就
         是相差复制的时间 的数据。 因为你会在复制前 alter system switch logfile,所以从这个时候开始,后面的数据就不
         能复制了)
执行过程
        假设克隆数据库完全是空的,也就是只装了oracle软件,并未创建任何数据库(其实创建和不创建没任何影响)
1。首先拷贝一份pfile到克隆数据库(自己去建一个也可以罗). 然后做相关的修改,只需保留极少的参数:大致如下:
*.audit_file_dest='/oracle/u01/app/oracle/admin/sms/adump'
*.background_dump_dest='/oracle/u01/app/oracle/admin/sms/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/oracle/u02/oradata/sms/control01.ctl','/oracle/u02/oradata/sms/control02.ctl','/oracle/u02/oradata/sms/control03.ctl'
*.core_dump_dest='/oracle/u01/app/oracle/admin/sms/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_name='sms'
*.remote_login_passwordfile='EXCLUSIVE'
*.user_dump_dest='/oracle/u01/app/oracle/admin/sms/udump'
instance_name='sms'
db_recovery_file_dest='/oracle/u01/app/oracle/flash_recovery_area'
db_recovery_file_dest_size=2147483648
db_file_name_convert=('ora10','sms')
log_file_name_convert=('ora10','sms')
shared_pool_size=200000000(设置稍微大点,以免报错)
由于你只装了oracle软件,所以有很多目录是本身没有的,这个需要你手动去创建。比如adump,bdump等.
2。以nomount启动克隆数据库,然后启动lsnrctl,以便辅助instance可以从目标数据库来连接。
3。在目标数据库做备份(如果有备份就可以直接做了,这里假设你没有),我习惯把原来的备份删光,以便脑袋不会晕。
  rman >
        change backupset xxx delete;
        sql 'alter system switch logfile';(既说某些错误是没做这个工作导致的)
        backup database plus archivelog delete all input;
4。利用scp 把备份集和controlfile的autobackup 全部 传到克隆数据库(必须和目标数据库路径完全一致),这里没有归档,
    因为全部在备份集了。
5。基本上,工作已经做完,接下来就是开始复制了,一切交给RMAN吧!
6. 在目标数据库执行:
   rman target / catalog=rman/password auxiliary [email=sys/password@sms]sys/password@sms[/email] (辅助数据库的)
  
rman> run {
            set until logseq xxx thread 1;
            allocate auxiliary channel d1 type disk;
            duplicate target database to sms
            nofilenamecheck                            (如果你复制的所以路径完全和目标数据库一样,需要nofilenamecheck)
            logfile
            GROUP 1 ('/oracle/u02/oradata/redo1.dbf') size 100m,
            GROUP 2 ('/oracle/u02/oradata/redo2.dbf') size 100m,
            GROUP 3 ('/oracle/u02/oradata/redo3.dbf') size 100m;}  (日志的路径可以在pfile指定,不过我在实验过程虽然指定了
                                                                    但是仍然出错,奇怪的时出现smsg,本来我指定的路径是sms
                                                                    真不明白这个smsg是怎么出现的。所以我这里还是再指定一次)
到这里,你就慢慢等吧! 应该需要一段时间。我600M等了5分钟。
看看执行的具体过程是什么:(这是我复制的完整过程)
RMAN> run {
2> set until logseq 156 thread 1; (由于不能完全复制,也就是不完全恢复,所以指定一下你要恢复到哪里?我这里恢复到最后一个日志)
3> allocate auxiliary channel d1 type disk;
4> duplicate target database to sms
5> nofilenamecheck
6> logfile
7> GROUP 1 ('/oracle/u02/oradata/sms/redo1.dbf') size 100m,
8> GROUP 2 ('/oracle/u02/oradata/sms/redo2.dbf') size 100m,
9> GROUP 3 ('/oracle/u02/oradata/sms/redo3.dbf') size 100m;}
executing command: SET until clause
allocated channel: d1
channel d1: sid=35 devtype=DISK
Starting Duplicate Db at 12-JUL-07
contents of Memory Script:
{
   set until scn  1766185;
   set newname for datafile  1 to
"/oracle/u02/oradata/sms/system01.dbf";
   set newname for datafile  2 to
"/oracle/u02/oradata/sms/undotbs01.dbf";
   set newname for datafile  3 to
"/oracle/u02/oradata/sms/sysaux01.dbf";
   set newname for datafile  4 to
"/oracle/u02/oradata/sms/users01.dbf";
   set newname for datafile  5 to
"/oracle/u02/oradata/sms/rman_tbs.dbf";
   restore
   check readonly
   clone database
   ;
}
executing Memory Script
executing command: SET until clause
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting restore at 12-JUL-07
channel d1: starting datafile backupset restore
channel d1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /oracle/u02/oradata/sms/system01.dbf
restoring datafile 00002 to /oracle/u02/oradata/sms/undotbs01.dbf
restoring datafile 00003 to /oracle/u02/oradata/sms/sysaux01.dbf
restoring datafile 00004 to /oracle/u02/oradata/sms/users01.dbf
restoring datafile 00005 to /oracle/u02/oradata/sms/rman_tbs.dbf
channel d1: reading from backup piece /oracle/u01/app/oracle/flash_recovery_area/ORA10/backupset/2007_07_12/o1_mf_nnndf_TAG20070712T130247_39dqoqdt_.bkp
channel d1: restored backup piece 1
piece handle=/oracle/u01/app/oracle/flash_recovery_area/ORA10/backupset/2007_07_12/o1_mf_nnndf_TAG20070712T130247_39dqoqdt_.bkp tag=TAG20070712T130247
channel d1: restore complete, elapsed time: 00:00:36
Finished restore at 12-JUL-07
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "SMS" RESETLOGS ARCHIVELOG
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
LOGFILE
  GROUP  1 ( '/oracle/u02/oradata/sms/redo1.dbf' ) SIZE 100 M ,
  GROUP  2 ( '/oracle/u02/oradata/sms/redo2.dbf' ) SIZE 100 M ,
  GROUP  3 ( '/oracle/u02/oradata/sms/redo3.dbf' ) SIZE 100 M
DATAFILE
  '/oracle/u02/oradata/sms/system01.dbf'
CHARACTER SET WE8ISO8859P1

contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script
datafile 2 switched to datafile copy
input datafile copy recid=1 stamp=627788590 filename=/oracle/u02/oradata/sms/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=2 stamp=627788590 filename=/oracle/u02/oradata/sms/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=3 stamp=627788590 filename=/oracle/u02/oradata/sms/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=4 stamp=627788590 filename=/oracle/u02/oradata/sms/rman_tbs.dbf
contents of Memory Script:
{
   set until scn  1766185;
   recover
   clone database
    delete archivelog
   ;
}
executing Memory Script
executing command: SET until clause
Starting recover at 12-JUL-07
starting media recovery
channel d1: starting archive log restore to default destination
channel d1: restoring archive log
archive log thread=1 sequence=155
channel d1: reading from backup piece /oracle/u01/app/oracle/flash_recovery_area/ORA10/backupset/2007_07_12/o1_mf_annnn_TAG20070712T130533_39dqty5l_.bkp
channel d1: restored backup piece 1
piece handle=/oracle/u01/app/oracle/flash_recovery_area/ORA10/backupset/2007_07_12/o1_mf_annnn_TAG20070712T130533_39dqty5l_.bkp tag=TAG20070712T130533
channel d1: restore complete, elapsed time: 00:00:02
archive log filename=/oracle/u01/app/oracle/flash_recovery_area/SMS/archivelog/2007_07_13/o1_mf_1_155_39dt1llm_.arc thread=1 sequence=155
channel clone_default: deleting archive log(s)
archive log filename=/oracle/u01/app/oracle/flash_recovery_area/SMS/archivelog/2007_07_13/o1_mf_1_155_39dt1llm_.arc recid=1 stamp=627788594
media recovery complete, elapsed time: 00:00:04
Finished recover at 12-JUL-07
contents of Memory Script:
{
   shutdown clone;
   startup clone nomount ;
}
executing Memory Script
database dismounted
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area     285212672 bytes
Fixed Size                     1218968 bytes
Variable Size                226494056 bytes
Database Buffers              50331648 bytes
Redo Buffers                   7168000 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "SMS" RESETLOGS ARCHIVELOG
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
LOGFILE
  GROUP  1 ( '/oracle/u02/oradata/sms/redo1.dbf' ) SIZE 100 M ,
  GROUP  2 ( '/oracle/u02/oradata/sms/redo2.dbf' ) SIZE 100 M ,
  GROUP  3 ( '/oracle/u02/oradata/sms/redo3.dbf' ) SIZE 100 M
DATAFILE
  '/oracle/u02/oradata/sms/system01.dbf'
CHARACTER SET WE8ISO8859P1

contents of Memory Script:
{
   set newname for tempfile  1 to
"/oracle/u02/oradata/sms/temp01.dbf";
   switch clone tempfile all;
   catalog clone datafilecopy  "/oracle/u02/oradata/sms/undotbs01.dbf";
   catalog clone datafilecopy  "/oracle/u02/oradata/sms/sysaux01.dbf";
   catalog clone datafilecopy  "/oracle/u02/oradata/sms/users01.dbf";
   catalog clone datafilecopy  "/oracle/u02/oradata/sms/rman_tbs.dbf";
   switch clone datafile all;
}
executing Memory Script
executing command: SET NEWNAME
renamed temporary file 1 to /oracle/u02/oradata/sms/temp01.dbf in control file
cataloged datafile copy
datafile copy filename=/oracle/u02/oradata/sms/undotbs01.dbf recid=1 stamp=627788706
cataloged datafile copy
datafile copy filename=/oracle/u02/oradata/sms/sysaux01.dbf recid=2 stamp=627788706
cataloged datafile copy
datafile copy filename=/oracle/u02/oradata/sms/users01.dbf recid=3 stamp=627788706
cataloged datafile copy
datafile copy filename=/oracle/u02/oradata/sms/rman_tbs.dbf recid=4 stamp=627788706
datafile 2 switched to datafile copy
input datafile copy recid=1 stamp=627788706 filename=/oracle/u02/oradata/sms/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=2 stamp=627788706 filename=/oracle/u02/oradata/sms/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=3 stamp=627788706 filename=/oracle/u02/oradata/sms/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=4 stamp=627788706 filename=/oracle/u02/oradata/sms/rman_tbs.dbf
contents of Memory Script:
{
   Alter clone database open resetlogs;
}
executing Memory Script
database opened
Finished Duplicate Db at 12-JUL-07
结束!
再注意:1.如果你会出现no backupset 之类的,是因为在克隆数据库找不到备份集。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 1999-2008 bbs.bitsCN.com