通过使用数据库备份,DBA可以在同一服务器或其他服务器上建立副本数据库,这个副本数据库可以和主数据库有相同的名称(数据库拷贝)或者与数据库名称不同(数据库克隆),Oracle在数据库备份和数据库克隆之间唯一不同的是拷贝的数据库不能更改原名称。使用RMAN的复制数据库特性,可以从RMAN备份创建一个新的数据库,并为这个副本数据库保留已有的数据库名称或赋予新的名称。在练习9已经介绍了复制数据库的概念,在练习20-23和练习27-29中,讲述了如何使用恢复管理器(RMAN)进行备份与恢复,本练习将讲解如何综合这几个练习的知识,用RMAN创建副本数据库。
RMAN如何从备份创建一个副本数据库?在复制期间,RMAN连接主数据库和副本的实例,复制进程包括在副本服务器上还原并恢复主数据库的备份文件。首先在副本数据库服务器上恢复RMAN创建的主数据库备份基准;在恢复期间,所需的主数据库的增量备份和归档重做日志将应用到副本数据库中,副本数据库不能进行完全恢复,因为联机重做日志不能还原(由于没有用RMAN进行备份),因此不完全恢复将执行到一个指定的停止点或者直到RMAN所知的最新归档日志文件,此时RMAN将不会应用任何来自联机日志的重做。
副本数据库相比主数据库而言已经过时了,在复制期间,会生成一个新的控制文件和联机重做日志文件。RMAN也将赋予这个数据库一个新的数据库标识(DBID)。
就向其他介绍RMAN其他练习一样,在本练习中将定义属于本章内容的新RMAN术语或命令,本章将介绍一下RMAN术语和命令:
- 辅助数据库(Auxiliary database): RMAN将目标(主)数据库复制到该数据库实例,要创建该数据库的参数文件、路径和口令文件。必须在RMAN数据库复制之前以非加载(NOMOUNT)模式启动辅助数据库实例;
- 复制(Duplicate) :从其他数据库的RMAN备份创建一个新的数据库,要在RMAN执行复制操作的位置配置辅助数据库并启动Oracle的实例,从RMAN的角度来看,目标数据库被复制到副本数据库;
- 设置新名称(Set newname) :在一个RMAN运行块内为数据设置新的名称,提供给该参数名将覆盖任何该数据文件的辅助数据库名(用SET_AUXNAME)或者辅助数据库参数(DB_FILE_NAME_CONVERT),这个新名称的值只在数据块内有效);
- 设置辅助名称(Set auxname) :为数据文件设置辅助名称。这个辅助名称将在RMAN会话之间存在,如果不希望以后的RMAN使用这个设置的名称,则必须要将该名称设置为null;
- 日志文件(Log fiel):可以在duplicate命令中使用这个关键字,以指定副本数据库创建的联机重做日志。如果没有特别指定这个关键字,则RMAN将在辅助参数文件中的LOG_FILE_NAME_CONVERT参数决定路径中生成日志文件。如果没有这个RMAN关键字,而且没有设置辅助参数,则RMAN将在目标数据库同样的位置创建日志文件(假设已经指定了NOCHECKFILENAME选项);
- 不检查文件名(NoCheckfilename) :默认情况下,RMAN将检查在副本主机上被恢复到主机目标数据文件路径下的数据文件,以确保不会被错误地覆盖。使用该选项可以覆盖这个默认的操作。这样就需要手工确保RMAN没有覆盖任何已经存在的数据文件。应当谨慎使用这个命令,防止覆盖数据文件。
在Duplication命令中执行的过程中,RMAN执行了一系列工作。当连接到目标、辅助和可选的目录数据库后,RMAN将执行如下操作:
- 根据最近发生的或者是提供的恢复停止点来决定复制操作将使用哪个基本的备份;
- 根据辅助数据库参数或RMAN设置的命令和选项来决定将数据文件保存在辅助数据库实例的什么位置;
- 为辅助数据库读出备份片或映像拷贝并恢复数据文件,这个RMAN的功能与执行正常的数据库还原是一样的;
- 根据恢复停止点将任何增量备份应用于还原数据文件,这个增量方式应用与应用RMAN发布恢复数据库命令的任务是一样的;
- 根据恢复停止点从磁盘或备份将所有归档日志文件应用于还原数据文件
- 为辅助数据库创建新的控制文件
- 当重新设置联机重做日志文件时,打开副本数据库。新的联机重做日志文件将根据RMAN复制数据库命令中指定的或者根据转换的辅助参数文件来创建。
为什么要使用RMAN来创建副本数据库呢?如果备份知识RMAN备份则必须使用RMAN进行操作。如果既有RMAN备份也有用户管理的备份,则RMAN进行复制会比较容易,RMAN将创建新的控制文件并处理数据文件的还原与恢复。
当用RMAN进行数据库复制时,应该考虑以下注意是事项:
- 不是必须要使用RMAN目录。RMAN信息被存储在目标数据库的控制文件中,必须确保创建副本数据库的备份仍然在目标控制文件中。例如,如果将init.ora文件的CONTROLFILE_RECORD_KEEP_FOR_TIME参数设置为21天,则不能从2个月以前开始还原;
- 如果当数据库打开时进行备份,则应包括随后的日志切换以确保当备份进行时任何重做的更改都被归档;
- 确保选取的备份包含了必要的归档日志,RMAN必须清楚应用的归档日志;
- 不能在复制期间进行完全恢复,恢复必须有停止点。该停止点可以是一个指定的停止点也可以是归档重做日志所知的最后一个点可以基于时间、日志序列或者SCN来指定一个停止点;
- 为了在复制期间创建数据库的拷贝,应使用与辅助数据库参数文件中的目标文件一样的数据库名称;
- 如果副本数据库驻留在其他服务器上,而且服务器拥有与主数据库服务器同样的路径结构,则在复制期间不需要重新命名任何文件。默认情况下,DUPLICATE命令将告知RMAN还原的辅助文件的位置与目标数据库文件备份时的主数据库文件位置相同;
- 新的副本数据库的数据库名称可以和主数据库的相同,也可以不同。当数据库的名称必须与任何共享ORACLE_HOME路径的数据库的名称不同。因此,如果主数据库和副本数据库驻留在同一服务器上,而且共享相同的ORACLE_HOME,则副本数据库必须重新命名。虽然在同一服务器上,但是拥有独立的ORACLE_HOME路径或在不同的服务器上则它们可以具有相同的数据库名称。
在本练习中,将用RMAN创建一个副本数据库。可以通过辅助初始化参数文件以及RMAN命令更改数据库文件的名称和位置。
创建副本数据库涉及一系列相互协调的步骤,在下列描述的步骤中,主数据库为目标数据库,而副本数据库为辅助数据库。
- 使RMAN备份可以被将要存储副本数据库的服务器访问 如果备份生在磁盘上,可以用ftp的二进制模式传送或用NFS这样的磁盘共享机制进行访问;
- 准备副本数据库参数文件 在副本数据库被创建以前,RMAN需要连接到一个辅助实例上,这类似于练习12-14中要执行的表空间时间点恢复时需要连接的辅助实例。RMAN连接到辅助实例后,则从备份开始还原数据文件以生成副本数据库。为了启动辅助实例,必须创建一个包含许多特殊参数的初始化参数文件,当在与主数据库同样的服务器上创建副本数据库时,必须确保控制文件、数据文件和联机重做日志文件没有覆盖已经存在的文件。为了达到这个目的,可以告知RMAN在执行DUPLICATE命令时在新的位置重新命名这些文件,或者可以指定某些特殊的初始化参数自动完成这个工作。
- 生成副本数据库口令文件 为了进行DBA验证,副本数据库需要一个口令文件,可以按照练习9步骤一生成这个文件;
- 创建NET8连接文件 RMAN需要同时连接到主数据库(目标实例)以及副本数据库(辅助实例),如果这两个数据库驻留在不同的服务器上,则需要配置副本服务器上的lister监听器,而且需要配置运行RMAN服务器上的tnsnames文件;
- 启动辅助实例 在RMAN创建副本数据库之前,辅助实例需要以非加载模式启动,启动时将要读取步骤二创建的参数文件;
- 加载或打开主数据库 RMAN需要主数据库加载或打开以便创建副本数据库;
- 创建副本数据库 当要求RMAN创建副本数据库时,它会自动还原所需的基准备份,并应用增量备份和归档重做日志文件,恢复完成后副本数据库会以RESETLOGS选项打开。
练习30:用RMAN复制PRACTICE数据库
本练习中将要克隆生成的数据库名为CLNE,因此在本练习中PRACTICE数据库就是主/目标数据库,副本数据库是一个克隆。因为该数据库被赋予了一个新的名称,如果在其他服务器上执行该练习,则创建的数据库可以具有相同的名称(PRACTICE),只需要将本练习中的CLNE用PRACTICE代替就可以了。
步骤一:准备克隆数据库
为CLNE数据库开始创建数据库路径、参数文件、口令文件(及Window服务),如果已经执行了练习9,这些步骤就都已经完成了。
-
路径 为将要生成的CLNE数据库创建所有相关路径:
1 set ORACLE_SID = CLNE
2 set ORACLE_BASE = D:\oracle
3 set ORACLE_HOME = D:\oracle\product\ 10.1 . 0
4 set ORACLE_DATA = D:\oracle\ % ORACLE_SID %
5 set ORACLE_ADMIN =% ORACLE_HOME % \admin\ % ORACLE_SID %
6 md % ORACLE_ADMIN %
7 md % ORACLE_ADMIN % \pfile
8 md % ORACLE_ADMIN % \bdump
9 md % ORACLE_ADMIN % \cdump
10 md % ORACLE_ADMIN % \udump
11 md % ORACLE_ADMIN % \create
12 md % ORACLE_DATA % \
13 md % ORACLE_DATA % \ARCHIVE(图2)
(图4)
-
参数文件 接下来,进入D:\oracle\product\10.1.0\admin\PRACTICE\pfile文件夹,复制PRACTICE参数文件init.ora.1016201010059并命名为initCLNE.ORA,使用写字板打开,将文件中出现”PRACTICE”替换为”CLNE”。当执行这个全文搜索和替换时,就为参数更改了数据库名、服务名、控制文件的位置以及许多路径。修改完毕后应确认一下参数:DB_NAME、CONTROL_FILES以及目标路径。在CLNE数据库参数文件中增加三个参数:
1 log_archive_dest = ' D:\oracle\CLNE\ARCHIVE '
2 db_file_name_convert = ( " PRACTICE " , " CLNE " )
3 log_file_name_convert = ( " PRACTICE " , " CLNE " )(图6)
在复制期间,这三个参数将把文件名和位置名从旧值转换为新值。在这个示例中任何数据文件全名称中的PRACTICE都将改为CLNE。因此,PRACTICE数据库文件 D:\oracle\PRACTICE\system01.dbf将在CLNE中创为D:\oracle\CLNE\system01.dbf。日志文件D:\oracle\PRACTICE\redo01.log将在CLNE数据库中创建为D:\oracle\CLNE\redo01.log;
- 口令文件 在RMAN复制期间,需要以SYSDBA角色的身份连接到CLNE数据库,创建口令文件,这个口令文件将用于远程身份认证安全;
1 WIN > orapwd file = D:\oracle\product\ 10.1 . 0 \Db_1\database\PWDCLNE.ORA password = CLNE entries = 10
(图8)
-
Window服务 在Window中,用oradmin工具为CLNE数据库创建一个名称OracleServiceCLNE数据库服务;
1 WIN > oradim - NEW - SID CLNE - SYSPWD CLNE
(图10)
-
Net8连接 最后为CLNE数据库配置NET8连接,这个步骤对于练习9中复制数据库是没有必要的,因为在连接到PRACTICE数据库的同时不需要连接到CLNE实例。应用NET8 Assistant来更新NET8的配置;
(图12)
配置Lisenter服务:打开D:\oracle\product\10.1.0\Db_1\NETWORK\ADMIN\ listener.ora,添加目标数据库服务
(图14)
特别注意:配置完毕后,重启监听,把CLNE数据库以非加载模式启动。
(图16)
(图18)
如果已经创建一个在练习9描述的克隆数据库,则没有必要执行所有这些步骤。数据库文件已经存在D:\oracle\CLNE目录下,可以保留这些以前创建的数据库文件(数据文件、日志文件和控制文件),也可以删除。
步骤二:备份PRACTICE数据库
现在已经有足够多的PRACTICE数据库的备份可以用来复制到CLNE数据库,为了确保成功,连续创建两个用于复制PRACTICE数据库备份。
第一个备份是用练习24的b_whole_0.rcv命令脚本创建的基准备份(增量级别为0),数据库文件和控制文件的基准备份也是数据库所有数据文件和控制文件的完全数据库备份或映像拷贝。
第二个备份在基本数据文件和控制文件备份之后进行一个归档日志文件备份。可以运行练习24名为b_archive_2days.rcv的RMAN命令文件来生成这个备份。该文件中包含的命令将强迫进行一次日志切换,并备份所有最近两天以来含有重做信息的归档日志文件:
2 WIN > connect target system / system@practice
3 WIN > connect catalog rman1010 / rman@rcat
4 RMAN > @D:\oracle\CODE\chap12\b_whole_inc0.rcv
5 RMAN > @D:\oracle\CODE\chap12\b_archive_2days.rcv
(图20)
标记PRACTICE数据库当前的日志文件,在复制期间将使用这个日志文件作为停止点。
2 SQL > SELECT sequence#, thread# FROM v$log WHERE status = ' CURRENT ' ;
(图22)
步骤三:复制PRACTICE数据库
在这个任务中,RMAN将对几个命令相应并执行一些列操作,所有需要命令如下所示:
2 connect catalog rman1010 / rman@rcat
3 connect auxiliary sys / clne@clne
4 #Dulicate the PRACTICE database to the CLNE database
5 run{
6 set until logseq 9 thread 1 ;
7 allocate auxiliary channel d1 type disk;
8 duplicate target database to CLNE;
9 }
这个RMAN脚本文件包含连接目标、目录和辅助数据库的命令,在复制期间,需要目标数据库和辅助数据库的连接,而目录的连接则是可选的:
- Connect target 要被复制的数据库是目标数据库连接,这个数据库应该被加载或打开;
- Connect catalog 如果需要目录,则应该包含所有目标数据库备份的历史,RMAN可以使用合适的备份来还原副本数据库,则这个数据库必须被打开;
- Connect auxiliary 副本数据库是辅助数据库连接,这个数据必须以非加载模式启动;
- Set until 因为在目标数据库被打开的情况下复制数据库一定是不完全的,所以可以使用一个比最终归档的重做日志文件的序列号大的日志序列停止点。如果目标数据库上的当前日志文件是9,则恢复到辅助数据库将包括日志序列号8而不是9。必须包括trhead的值,但该值并不属于一个Oracle并行服务器的配置,选择的停止点必须在时间点上要大于RMAN能从其中恢复的最早备份时间;
- Allocate auxiliary channel 在辅助数据库上的操作都是通过辅助通道执行的,目标数据库的备份片将通过这个通道读取,并还原到CLNE数据库中,CLNE数据库的恢复也是通过这个通道进行的;
- Duplicate target 目标数据库将被复制到名为CLNE的辅助数据库,复制命令从目标数据库备份还原数据文件到辅助数据库的新位置。还原之后,RMAN将生成新控制文件,然后恢复数据库。最后,在重新设置日志文件时辅助数据库将被打开。
DUPLICATE命令的输出比较长,所以这里并没有全部显示这些输出,这里指出一些重要的地方加以说明:
在复制期间,辅助通道连接到CLNE实例上,当复制过程进行时,可以使用会话标识在SQL*Plus中连接到CLNE实例,并查看RMAN连接。
这个RMAN脚本文件包含连接目标、目录和辅助数据库的命令,在复制期间,需要目标数据库和辅助数据库的连接,而目录的连接则是可选的:
(图26)
复制命令将使RMAN脚本执行,RMAN可以选择使用在内存中动态生成的脚本,因为这些脚本没有在什么地方静态存储,这就是说复制有没有目录也是可以工作。在第一个内存脚本中,RMAN确定PRACTICE数据库的日志序列9是从SCN708359开始,并将用增量备份和归档重做恢复到这SCN值。类似于正常的RMAN恢复,RMAN首先在辅助数据库的databas_archive_log_dest路径下查找所需要的归档日志文件是否已经存在。如果不存在,则必须从一个备份中应用并还原,其次RMAN基于CLNE数据库的initCLNE.ora参数文件中的DB_FILE_NAME_CONVERT参数决定数据文件新的名称。所遇到的PRACTICE都将被替换成CLNE,当还原数据文件时,有效地为每个数据文件改变路径;最后向克隆数据库发出restore命令,RMAN生成的脚本中的关键字clone将被写到CLNE辅助数据库。如果已经连接到一个名为TST1的辅助数据库,则这个命令仍然是RESTORE CLONE DATABASE。
(图28)
还原命令将发现在步骤二中生成的备份,并使用这个备份从目标数据库PRACTICE为辅助数据库CLNE还原数据文件,数据文件是从备份中还原的,而不是从目标数据库拷贝因此将很少影响目标数据库的性能。
(图30)
当还原完成之后,RMAN创建一个新的控制文件,在控制文件的创建命令中,数据名称被设置为CLNE,而不是PRACTICE。因为在步骤一中设置了CLNE数据库init.ora的LOG_FILE_NAME_CONVERT参数,所以这个日志文件的位置将从D:\oracle\PRACTICE更改为D:\oracle\CLNE
(图32)
所有克隆数据库(CLNE)中的非系统数据文件必须从目标数据库的位置切换到新的数据库的相应位置。
(图34)
数据文件已经被还原到CLNE数据库的位置中而且已经创建了新的CLNE控制文件,接下来RMAN使用首次增量备份和归档日志文件恢复在克隆数据库上的已经还原的数据库文件。因为在本练习中没有增量备份,所以不会看到任何增量备份被还原和应用,应该在RMAN恢复阶段使用数据库的归档文件进行介质恢复。
(图36)
(图38)
在介质恢复后,用resetlogs选项将CLNE数据库打开。
(图40)
如果在整个复制命令脚本的输出中,没有遇到错误信息,而且看到消息RMAN:database opened message,则RMAN数据库复制操作就成功了!
步骤四:验证克隆数据库
为了检查CLNE数据库是否已经创建成功,通过SQL*Plus连接并运行一些查询语句。SYS口令(没有SYSDBA角色)将与PRACTICE数据库上的SYSTEM口令一样,因为CLNE数据库就是PRACTICE数据库的副本。
2 SQL > SELECT sequence#, first_change#, status FROM v$log ORDER BY status;
(图42)
当前联机重做日志文件的序列号是1!当CLNE数据库以resetlogs打开时,日志序列号被重置为1。这个日志序列号的首先改变为708360,当数据库被打开并且重置重做日志,则当前重做日志SCN的第一个改变是比恢复结束SCN改变的值大1。在恢复期间,所有数据库文件都向前回退到SCN708359,数据库打开的重置日志操作发生在SCN708360。
2 SQL > SELECT name FROM v$database;
3 SQL > SELECT name FROM v$datafile;
4 SQL > SELECT member FROM v$logfile;
5 SQL > SELECT name FROM v$controlfile;
6 SQL > SELECT max(create_date) FROM tina.date_log;
(图44)
可以通过查询看到数据文件的位置,也可以检查一个数据库表的数据。可以随意在D:\oracle\CLNE目录下查看由RMAN复制操作创建的数据文件。因为RMAN自动赋予副本数据库一个新的DBID,所以可以将这个新的数据库在恢复目录中注册并开始备份,即使副本数据库与主数据库拥有相同的名称,只要DBID不同也可以在恢复目录中注册。
步骤五:再次复制PRACTICE数据库
最后的这个任务将再次复制数据库,但是却使用RMAN的关键字和命令来控制数据库文件和日志文件的名称和位置(控制文件的位置是由辅助数据库文件参数文件control_file设置的)。可以按照下面的做法控制数据文件位置并设置新名称或设置辅助名称:
2 SET auxname for datafile 4 TO ' D:\oracle\CLNE\auxname04.dbf ' ;
3 SET auxname for datafile 6 TO ' D:\oracle\CLNE\auxname06.dbf ' ;
4 SET auxname for datafile 1 TO ' D:\oracle\CLNE\auxname01.dbf ' ;
5 SET auxname for datafile 3 TO ' D:\oracle\CLNE\auxname03.dbf ' ;
6 SET auxname for datafile 5 TO ' D:\oracle\CLNE\auxname05.dbf ' ;
7 SET auxname for datafile 7 TO ' D:\oracle\CLNE\auxname07.dbf ' ;
8 run{
9 allocate auxiliary channel d1 type disk;
10 set until logseq 9 thread 1 ;
11 duplicate target database to CLNE logfile
12 group 1 ( ' D:\oracle\CLNE\redo01_1.log ' ,
13 ' D:\oracle\CLNE\redo01_2.log ' ) size 10000K reuse,
14 group 2 ( ' D:\oracle\CLNE\redo02_1.log ' ,
15 ' D:\oracle\CLNE\redo02_2.log ' ) size 10000K reuse,
16 group 3 ( ' D:\oracle\CLNE\redo03_1.log ' ,
17 ' D:\oracle\CLNE\redo03_2.log ' ) size 10000K reuse;
18 }
19 set auxname for datafile 1 to null ;
20 set auxname for datafile 2 to null ;
21 set auxname for datafile 3 to null ;
20 set auxname for datafile 5 to null;
21 set auxname for datafile 6 to null;
以上显示如何在复制期间为CLNE数据库的每个数据文件指定一个新的文件名(或者位置)。这样当PRACTICE备份还原CLNE的位置时,每个文件都可以重新命名,日志文件可以指定为附加到DUPLICATE TARGET DATABASE命令。在以上的示例中,每个数据文件都重命名并且日志文件也被重新定义大小、重命名和镜像。为了说明问题,对单数的数据文件重命名而对偶数的数据文件辅助命名。同时对不完全恢复增加了一个set until语句,这个复制将使用基准复制,并应用直到日志序列9的重做,但不包括日志序列号9。
可以用以上的脚本创建备份,确保关闭了CLNE数据库并在运行这个复制脚本之前以非加载方式打开实例(在Window中在启动CLNE实例之前先关闭Window服务,如果没有这样做,则控制文件仍然保持加载状态)。尽管在步骤一的initCLNE.ora文件后面增加了数据文件和日志文件的转换参数,但通过RMAN SET命令的数据文件和日志文件名将覆盖这个initCLNE.ora中的参数。
设置数据文件名称
(图48)
运行克隆脚本
(图50)
拷贝数据文件
(图52)
还原数据文件和联机日志文件
切换数据库路径
(图56)
恢复数据库
(图58)
重启CLNE数据库
(图60)
以重置方式打开CLNE数据库
(图64)
一旦通过运行这个脚本的一个(或者两者都运行)来进行数据库复制工作,请查看步骤四中描述的数据文件和日志文件的位置。在D:\oracle\CLNE将会看到不同的文件名,就可以证实可以通过RMAN命令和关键字控制副本数据库的文件名和位置。
技巧:将每个auxname重置为null以便以后的RMAN命令不会错误地使用同样的名称。例如,在本章中创建D:\oracle\CLNE\auxname1.dbf作为数据库文件1。而在下一个练习中,数据文件1将仍然是D:\oracle\CLNE\auxname1.dbf,除非为这个文件重置辅助名称更或者用set newname进行覆盖。
在不同的服务器上进行复制数据库
很多情况下,复制操作将发生在与主数据库服务器不同的其他服务器上那么如何处理?
- 如果目标数据库的RMAN备份已经保存在磁盘上,那么备份片必须拷贝到复制的服务器上。例如,如果在主机hostA有一个RMAN备份的备份文件D:\oracle\CLNE\db_100_12455_1,则这个文件必须被拷贝到主机hostB上相同位置。这样RMAN才能够将这个备份的片段用于还原任务;
- 如果目标的RMAN备份已经保存在磁带上,则磁带供应商的软件和磁带的运行库必须对拥有辅助数据库的服务器可用;
- 如果克隆的数据需要与主数据库同样的目录路径结构时,应该增加NOCHECKFILENAME选项。这样可以阻止RMAN检查还原数据文件的存在,并覆盖任何已经存在的具有相同名称的文件。