1. 启动和退出RMAN
RMAN可执行程序自动与数据库一起安装,通常如同其他数据库可执行文件一样位于相同的目录。例如,在Linux上RMAN客户端位于$ORACLE_HOME/bin目录下。
有以下基础选项来启动RMAN:
1)在操作系统的命令提示符下使用命令rman启动,RMAN显示如下的命令提示符:
% rman
RMAN>
2)启动RMAN连接到目标数据库:
% rman TARGET /
或
% rman TARGET sbu@prod NOCATALOG
使用EXIT或QUIT退出RMAN客户端:
RMAN> EXIT
或
RMAN> QUIT
2. RMAN连接到数据库
可以从RMAN客户端或操作系统命令行创建到数据库的连接。这些数据库连接可以使用密码文件或操作系统认证的方式进行身份验证。
2.1.RMAN数据库连接类型
在使用RMAN执行任何操作前,RMAN客户端必须连接到一个数据库。
下表描述了RMAN可以使用的数据库连接类型。
数据库连接的类型 | 关键字 | 描述 |
---|---|---|
目标数据库(target database) | TARGET | RMAN备份或恢复的数据库 |
恢复目录数据库(recovery catalog database) | CATALOG | 除控制文件以外,为RMAN仓库提供可选的备份存储 |
辅助实例(auxiliary instance)或辅助数据库(auxiliary database) | AUXILIARY | 一个物理备数据库,或一个为执行特定的任务如创建复制数据库,传输表空间,或执行表空间时间点恢复(TSPITR)而创建的数据库实例。对于使用一个辅助数据库的许多任务,RMAN在任务过程中创建一个自动的辅助实例来使用,连接它,执行任务,然后当任务完成后销毁它。不用指定明确的命令来连接到自动辅助实例。 |
2.2.RMAN数据库连接认证
用户使用RMAN连接到目标或辅助数据库时要求具有SYSDBA或SYSBACKUP权限,任何用户都可以被授予该权限。
当连接到恢复目录时不需要这些权限。必须授予RECOVERY_CATALOG_OWNER角色给恢复目录模式属主。用户也可以使用由恢复目录属主创建的VPC(virtual private catalog)凭据来连接恢复目录。
在SQL*Plus中可用的相同的认证选项在RMAN中也是可用的。目标和辅助数据库最常用的认证方式包含以下两种:
1)操作系统认证
2)密码文件认证
这两种方法都不需要数据库处于打开状态。操作系统认证只在本地连接时使用。密码文件认证可以在本地或远程连接时使用。
2.2.1.使用操作系统认证
RMAN可以使用操作系统认证来连接到目标或辅助数据库。
下面是使用操作系统认证连接到数据库的前提条件:
1)必须设置ORACLE_SID环境变量,指定数据库的SID(system identifier)。
例如:
% ORACLE_SID=prod; export ORACLE_SID
2)用户必须是OSDBA操作系统组的成员使用SYSDBA权限连接或OSBACKUPDBA操作系统组的成员使用SYSBACKUP权限来连接。
在UNIX和Linux上,OSDBA组一般命名为dba,OSBACKUPDBA组一般命名为backupdba。这些名字在数据库安装时分配。
2.2.2.使用密码文件认证
使用密码文件本地或远程访问。如果数据库使用密码文件来验证管理用户,那么RMAN可以使用密码来连接。
数据库必须使用密码文件来通过网络服务名称远程连接。
注意:好的安全实践要求不要在命令行中输入明文密码,而是在RMAN提示符下当请求时再输入密码。
当授予SYSDBA或SYSBACKUP权限给一个用户时,数据库在密码文件中创建一个条目。这时可以以这个用户连接到目标或辅助数据库,即使数据库不在打开的状态。
为了支持使用SYSBACKUP权限通过密码文件来连接,密码文件必须创建在或更新到Oracle数据库12c Release 1(12.1)或以后的版本的格式。
如果在连接字符串中没有指定AS SYSBACKUP或AS SYSDBA,那么缺省使用AS SYSDBA。在这个情况中,不需要封闭的引号。
使用授予SYSDBA权限的用户sdba连接示例(明确指定权限):
% rman target ‘“sdba@prod1 as sysdba”’
target database Password: password
connected to target database: PROD1 (DBID=39525561)
使用授予SYSBACKUP权限的用户sdba连接示例(明确指定权限):
% rman target ‘“sbu@prod1 as sysbackup”’
使用SYSDBA权限连接示例(默认,不明确指定权限):
% rman target sbu@prod1
2.2.3.从RMAN提示符下连接到数据库
如果在操作系统命令行下不使用连接字符串来启动RMAN,那么必须在RMAN提示符下执行CONNECT TARGET命令来连接到目标数据库。
在RMAN提示符下连接到数据库:
1) 在操作系统提示符下,不使用连接字符串来启动RMAN客户端。
% rman
RMAN>
2) 在提示符下,输入CONNECT命令。
使用操作系统认证来连接示例(不明确指定权限):
RMAN> connect target /
使用操作系统认证来连接示例(明确指定权限):
RMAN> connect target “/ as sysdba”
当包含系统权限时,需要封闭的引号标记。
连接到目标数据库和恢复目录示例:
RMAN> connect target /
RMAN> connect catalog rco@catdb
recovery catalog database Password:
connected to recovery catalog database
在这个示例中,目标数据库连接使用操作系统认证,恢复目录数据库连接使用网络服务名称和和密码文件认证。恢复目录的属主是rco。RMAN提示输入恢复目录用户的密码。
2.2.4.从操作系统命令行连接RMAN到数据库
在rman命令后跟着连接字符串来从操作系统命令行连接到目标数据库。
使用CATALOG关键字来连接恢复目录(recovery catalog)。可以在启动RMAN时不指定NOCATALOG或CATALOG。如果在命令行中不指定NOCATALOG和在RMAN启动后不指定CONNECT CATALOG,那么RMAN在第一次运行需要使用RMAN仓库的命令时缺省是NOCATALOG模式。
注:在NOCATALOG模式中执行使用RMAN仓库的命令之后,必须退出和重启RMAN才能连接到一个恢复目录。
使用操作系统认证连接到目标数据库示例,NOCATALOG选项指示在会话中不使用恢复目录:
% rman TARGET / NOCATALOG
使用网络服务名称和密码文件认证连接到目标数据库示例:
% rman TARGET sbu@prod NOCATALOG
使用网络服务名称和密码文件认证连接到目标数据库示例2,密码包含特殊字符分号:
% rman TARGET “‘sbu/rman;pwd@prod AS SYSBACKUP’”
注:为了安全,Oracle建议不要在命令行指定密码,只有提示输入时才提供密码。
使用网络服务名称和密码文件认证连接到目标数据库和恢复目录数据库示例:
% rman TARGET sbu@prod CATALOG rco@catdb
target database Password: password
connected to target database: PROD (DBID=39525561)
recovery catalog database Password: password
connected to recovery catalog database
使用SYSDBA权限和操作系统认证来连接示例(明确指定权限):
% rman target ‘“/ as sysdba”’
使用SYSBACKUP权限和操作系统认证来连接示例(明确指定权限):
% rman target ‘“/ as sysbackup”’
使用SYSDBA权限和操作系统认证来连接示例(不明确指定权限):
% rman target /
如果在连接字符串中没有指定AS SYSBACKUP或AS SYSDBA,那么缺省使用AS SYSDBA。
2.2.5.在命令文件中连接RMAN到数据库
可以通过创建包含CONNECT命令的RMAN命令文件来连接到数据库。
如果创建一个使用CONNECT命令和数据库级别凭据(用户名和密码)的RMAN命令文件,那么任何可以读取文件的用户都知道密码。不存在安全的方法来将CONNECT字符串和密码加入到命令文件中。
如果创建一个使用CONNECT命令的RMAN文件,那么当与@命令行选项一起运行命令文件时,RMAN不会输出(echo)连接字符串。这种行为阻止连接字符串出现在包含RMAN输出的任何日志文件中。例如,假设创建一个命令文件listbkup.rman如下:
cat > listbkup.rman << EOF
CONNECT TARGET /
LIST BACKUP;
EOF
运行RMAN和@命令行选项来执行脚本:
% rman @listbkup.rman
当命令行文件执行时,RMAN使用星号替换连接字符串,如下面的输出:
RMAN> CONNECT TARGET *
2> LIST BACKUP;
3>
connected to target database: RDBMS (DBID=771530996)
using target database control file instead of recovery catalog
List of Backup Sets
===================
2.2.6.连接RMAN到辅助数据库
某些任务例如数据库复制和表空间时间点恢复(TSPITR)需要连接到辅助数据库。
辅助数据库连接的格式与目标数据库连接是完全相同的,除了使用AUXILIARY关键字而不是TARGET关键字以外。
在RMAN提示符下使用操作系统认证连接到目标数据库和使用网络服务名称和密码文件认证连接到辅助数据库示例:
% rman
RMAN> CONNECT TARGET /
RMAN> CONNECT AUXILIARY sbu@aux
在系统提示符下使用操作系统认证连接到目标数据库和使用网络服务名称和密码文件认证连接到辅助数据库示例:
% rman target / auxiliary sbu@aux
3. 指定RMAN输出的位置
缺省情况下,RMAN将命令的输出写到标准输出。当启动RMAN时,在命令行使用LOG参数来重定向输出到日志文件。
以下示例将RMAN命令输出写到rman.log:
% rman LOG /tmp/rman.log
在这个示例中,RMAN显示命令输入但不显示RMAN输出。最简单的方法是使用Linux tee或等同的命令同时将RMAN输出发送到日志文件和标准输出。例如,下面的命令让输入和输出在RMAN命令行接口中同时可见:
% rman | tee rman.log
RMAN>
4. 为RMAN设置国际化支持环境
在调用RMAN之前,设置环境变量NLS_DATE_FORMAT和NLS_LANG可能是有用的。这些变量确定了在RMAN命令如RESTORE,RECOVER和REPORT中时间参数使用的格式。
下面的示例显示通常的语言和日期格式设置:
NLS_LANG=American
或 NLS_LANG=american_america.zhs16gbk
NLS_DATE_FORMAT=‘Mon DD YYYY HH24:MI:SS’
如果准备使用RMAN连接到一个未挂载的数据库,然后当RMAN在仍然连接的时候挂载数据库,那么设置NLS_LANG环境变量,这样也指定数据库使用的字符集。
5. 输入RMAN命令
可以在RMAN提示符中直接输入命令或从文本文件中读取它们。
5.1.在RMAN提示符下输入RMAN命令
当RMAN客户端准备好接收命令时,它显示命令提示符。
输入命令给RMAN执行:
RMAN> CONNECT TARGET
RMAN> BACKUP DATABASE;
大部分RMAN命令接受几个参数,必须使用分号来结束。有些命令,如STARTUP,SHUTDOWN和CONNECT,可以与分号或不与分号一起使用。
当输入一行不是完整命令的文本时,RMAN提示继续输入的行号。例如:
RMAN> BACKUP DATABASE
2> INCLUDE CURRENT
3> CONTROLFILE
4> ;
5.2.RMAN使用命令文件
对于重复执行的任务,可以创建一个包含RMAN命令的文本文件,使用参数@来启动RMAN客户端,后面跟着一个文件名。
例如,在当前目录下创建包含一行文本的文本文件cmdfile1:
BACKUP DATABASE PLUS ARCHIVELOG;
可以从命令行运行这个命令文件,包含在其中的命令就执行:
% rman TARGET / @cmdfile1
在命令完成后,RMAN退出。
也可以在RMAN会话的RMAN命令提示符下使用@执行命令文件的内容。RMAN读取文件和执行文件中的命令。例如:
RMAN> @cmdfile1
在命令文件的内容执行完成后,RMAN显示以下的信息:
RMAN> **end-of-file**
与从操作系统命令行执行命令文件的情况不同,RMAN不会退出。
5.3.在RMAN命令文件中输入注释
在RMAN中的注释符是“#”。所有从“#”开始到末尾的行都被忽略。
例如,下面命令文件的内容备份数据库和归档redo日志和包含注释:
# Command file name: mybackup.rman
# The following command backs up the database
BACKUP DATABASE;
# The following command backs up the archived redo logs
BACKUP ARCHIVELOG ALL;
下面的示例显示如何分割一条RMAN命令为多行:
RMAN> BACKUP # this is a comment
2> SPFILE;
5.4.在命令文件中使用替换变量
当运行一个命令文件,可以在USING子语句中指定一个或多个值用于命令文件中的替换变量。在这种方式中,可以让命令文件动态变化。
如同在SQL*Plus中,&1指示哪里存放第一个值,&2指示哪里存放第二个值,等等。替换变量语法是&integer,后面跟着一个可选的句号(.),例如&1.3。可选的句话是变量的一部分,它被值替换,因此可以让替换文本后面直接跟着另外一个整数。例如,如果传输值mybackup到一个包含变量&1.3的命令文件,那么替换的结果就是mybackup3。
下面的过程讲述了如何创建和使用一个调用包含替换变量的命令文件的动态shell脚本。
1)创建使用替换变量的RMAN命令文件。
以下示例显示命令文件quarterly_backup.cmd的内容,它每个季度运行一次。脚本使用替换变量来为磁带集名称,指定的FORMAT字符串和要创建的还原点名称等赋值。
# quarterly_backup.cmd
CONNECT TARGET /
RUN
{
ALLOCATE CHANNEL c1
DEVICE TYPE sbt
PARMS 'ENV=(OB_MEDIA_FAMILY=&1)';
BACKUP DATABASE
TAG &2
FORMAT '/disk2/bck/&1%U.bck'
KEEP FOREVER
RESTORE POINT &3;
}
EXIT;
2) 创建一个shell脚本来运行在前面步骤中创建的RMAN命令文件。
下面的示例创建一个shell脚本runbackup.sh。示例为格式和还原点名称等创建shell变量和从脚本的命令行参数接受这些变量的值。
#!/bin/tcsh
# name: runbackup.sh
# usage: use the tag name and number of copies as arguments
set media_family = $argv[1]
set format = $argv[2]
set restore_point = $argv[3]
rman @'/disk1/scripts/quarterly_backup.cmd' USING $media_family $format
$restore_point
3) 执行shell脚本,在命令行指定期望的参数。
% runbackup.sh archival_backup bck0906 FY06Q3
5.5.检查RMAN语法
可以检查RMAN命令的语法错误而不需要执行它们。使用命令行参数CHECKSYNTAX来启动RMAN客户端进入一个模式,在这个模式中只分析输入的命令和对于不是合法RMAN语法的命令返回一个RMAN-00558错误。
可以检查命令行或命令文件中的RMAN命令的语法。
5.5.1.检查命令行中的RMAN语法
可以交互检查RMAN命令的语法而不实际执行命令。
在命令行检查RMAN语法:
1) 使用CHECKSYNTAX参数启动RMAN:
% rman CHECKSYNTAX
2) 输入RMAN命令来检查。
RMAN> run [ backup database; ]
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01006: error signaled during parse
RMAN-02001: unrecognized punctuation symbol "["
RMAN> run { backup database; }
The command has no syntax errors
5.5.2.检查在命令文件中的RMAN语法
为了检查命令文件中的命令,使用命令行参数CHECKSYNTAX启动RMAN,然后使用@命令来指定需要检查的命令文件。
检查命令文件中的命令:
1) 使用文本编辑器创建命令文件。
假设使用以下内容创建文件/tmp/goodcmdfile:
# command file with legal syntax
RESTORE DATABASE;
RECOVER DATABASE;
假设使用以下内容创建另外一个文件/tmp/badcmdfile:
# command file with bad syntax
RESTORE DATABASE
RECOVER DATABASE
2)从RMAN提示符中运行命令文件
% rman CHECKSYNTAX @filename
/tmp/goodcmdfile文件的输出示例:
RMAN> # command file with legal syntax
2> restore database;
3> recover database;
4>
The cmdfile has no syntax errors
Recovery Manager complete.
/tmp/badcmdfile文件的输出示例:
RMAN> #command file with syntax error
2> restore database
3> recover
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01005: syntax error: found "recover": expecting one of: "archivelog,
channel, check, controlfile, clone, database, datafile, device,
from, force, high, (, preview, ;, skip, spfile, standby, tablespace,
until, validate"
RMAN-01007: at line 3 column 1 file: /tmp/badcmdfile
检查包含了替换变量的命令文件的输出示例(检查时RMAN会提示输入值):
RMAN> CONNECT TARGET *
2> BACKUP TAG
Enter value for 1: mybackup
abc COPIES
Enter value for 2: mybackup
abc
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01009: syntax error: found "identifier": expecting one of: "integer"
RMAN-01008: the bad identifier was: mybackup
RMAN-01007: at line 2 column 25 file: /tmp/whole_db.cmd
RMAN提示语法错误,因为字符串mybackup不是COPIES对应的有效参数。
4.6.使用RMAN管道接口
RMAN管道接口(Pipe Interface)中是一个可供选择的方法,用来向RMAN发出命令和接收这些命令的输出。使用这个接口,可以写一个到RMAN的可移植的程序接口。
利用管道接口,RMAN通过使用DBMS_PIPE PL/SQL包而不是操作系统shell来获取命令和发送输出。管理接口通过使用RMAN客户端的PIPE命令行参数来调用。RMAN使用两个私有的管道:一个用来接收命令,另外一个用来发送输出。管道的名称从PIPE参数的值衍生。例如,可以使用以下命令调用RMAN:
% rman PIPE abc TARGET /
RMAN在目标数据库中打开两个管道:RMAN用来接收用户命令的管道ORA$RMAN_ABC_IN和RMAN用来发送所有输出回RMAN的管道ORA$RMAN_ABC_OUT。所有在输入和输出管道中的信息类型都是VARCHAR2。
RMAN不允许管道接口与公共管道一起使用,因为有潜在的安全问题。如果与公共管道一起使用,任何知道管道名称的用户都可以发送命令到RMAN和拦截它的输出。
如果管道没有初始化,那么RMAN创建它们为私有管道。如果在RMAN启动前想将命令放在输入管道,必须首先调用DBMS_PIPE.CREATE_PIPE来创建管道 。当管道没有明确作为私有管道创建时,第一次访问管道会自动将它作为公共管道来创建,如果被告知使用一个公共管道,那么RMAN会返回一个错误。
注:如果多个RMAN会话运行在一个目标数据库上,那么必须为每个RMAN会话使用唯一的管道名称。函数DBMS_PIPE.UNIQUE_SESSION_NAME是一个可以用来生成唯一管道名称的方法。
6.1. 通过管道连续地执行多个RMAN命令
这个示例假设应用程序控制RMAN连续地执行多个命令。在每个命令发送到管道,执行和返回输出之后,RMAN暂停和等待下一个命令。
通过管道执行RMAN命令:
1) 通过连接到目标数据库(必需)和指定选项PIPE来启动RMAN。
% rman PIPE abc TARGET /
也可以指定TIMEOUT选项,如果它在指定的时间内(秒)没有从输入管道中接收到任何输入,强制RMAN自动退出。
% rman PIPE abc TARGET / TIMEOUT 60
2)连接到目标数据库,使用DBMS_PIPE.PACK_MESSAGE和DBMS_PIPE.SEND_MESSAGE将期望的命令放到输入管道。在管道模式中,当它准备接收输入而不是显示标准的RMAN提示符时,RMAN发出消息RMAN-00572。
3)使用DBMS_PIPE.RECEIVE_MESSAGE和 DBMS_PIPE.UNPACK_MESSAGE从输出管道中读取RMAN输出。
4)重复步骤2和3来使用在步骤1启动的RMAN实例执行更多的命令。
5)如果在启动RMAN时使用TIMEOUT选项,那么在指定的时间内没有接收到任何输入之后RMAN自动终止。也可以发送EXIT命令让RMAN立即终止。
6.2. 通过管道执行一个作业中的RMAN命令
这个示例假设应用程序控制RMAN作为一个作业来执行一个或多个命令。在运行管道中的命令后,RMAN退出。
通过管道执行一个作业中的RMAN命令:
1)在连接到目标数据库之后,使用DBMS_PIPE.CREATE_PIPE创建一个管道(如果它没有以名称ORA$RMAN_pipe_IN存在)
2)使用DBMS_PIPE.PACK_MESSAGE和DBMS_PIPE.SEND_MESSAGE将期望的命令放到输入管道中。
3)使用PIPE选项启动RMAN,指定TIMEOUT为0。
% rman PIPE abc TARGET / TIMEOUT 0
在管道模式中,当它准备接收输入而不是显示标准的RMAN提示符时,RMAN发出消息RMAN-00572。
4)RMAN读取放在管道中的命令,执行它们。当它执行完输入管道的所有命令后,RMAN立即退出。
5)使用DBMS_PIPE.RECEIVE_MESSAGE和 DBMS_PIPE.UNPACK_MESSAGE从输出管道中读取RMAN输出。
来源:《Oracle Database Backup and Recovery User’s Guide,19c》