本篇我们运用Oracle的rman备份 & 恢复方法进行实战。
1. 小明去出差
上篇讲到,小明学会了Oracle数据库的物理备份 & 恢复,离迎娶白富美又近了一步。
不久后,领导就派小明去出差了。
在实战场景里,小明是否能够经受得住考验,顺利完成任务呢?
我们拭目以待。
2. 查明数据库状况
小明到了客户现场,在客户的帮助下登录进了数据库主机。
他不知道这台数据库主机上有多少个Oracle数据库。
于是,小明敲下了如下的操作系统命令:
ps -ef | grep ora_
然后他看见了
ora11g 5882 1 0 Nov21 ?00:00:04 ora_q002_test
ora11g 20851 1 0 05:59 ?00:02:34 ora_vkrm_test
……
oracle 23565 1 0 11:52 ?00:00:04 ora_pmon_new
oracle 23567 1 0 11:52 ?00:00:07 ora_psp0_new
……
oracle 23583 1 0 11:52 ?00:00:01 ora_dbw0_old
oracle 23585 1 0 11:52 ?00:00:00 ora_lgwr_old
……
解释如下:
1. 左边第一列,是运行Oracle软件的用户名。它们是操作系统上的用户名。
2. 最后一列,是Oracle软件的进程名。进程的名字,被"_"切割为了3部分,最后一部分是数据库名(此处database=instance)。
然后,小明开始了与客户的沟通。
“你有两个用户运行Oracle数据库啊?” 小明怯生生地问。
“是啊。” 用户回答。
“ora11g用户运行了test数据库。oracle用户运行了两个数据库,new和old。” 小明小心地说到。
“是这样的,那就搬吧。” 用户下命令了。
3. 有什么不同
3.1 进入用户ora11g的操作界面
3.1.1 test数据库的SQL界面
su - ora11g
export ORACLE_SID=test
sqlplus "/ as sysdba"
3.1.2 test数据库的rman界面
su - ora11g
export ORACLE_SID=test
rman target /
3.2 进入用户oracle的操作界面
3.2.1 new数据库的SQL界面
su - oracle
export ORACLE_SID=new
sqlplus "/ as sysdba"
3.2.2 new数据库的rman界面
su - oracle
export ORACLE_SID=new
rman target /
3.2.3 old数据库的SQL界面
su - oracle
export ORACLE_SID=old
sqlplus "/ as sysdba"
3.2.4 old数据库的rman界面
su - oracle
export ORACLE_SID=old
rman target /
3.3 下一步
剩下的事情,我们在《Oracle初级篇2》里已经讲过了。
没有什么不同。
3.4 小结
我们来做一个小结:
1. 哪个操作系统用户运行的数据库,就su到哪个操作用户;
2. 通过设定环境变量ORACLE_SID的值来指定操作的数据库对象。
3. 严格地说,每次进入SQL和rman界面以前,都应该检查ORACLE_SID的值是否满足要求。
小明似懂非懂地点了点,然后问到:“为什么上一篇里,没这么复杂啊?”
我答道:
1. 方便起见,一般用oracle用户来安装Oracle数据库,但这不排除有例外啊,所以我们需要检查确认。
2. 安装Oracle数据库时,我们通常会在系统环境变量里设定ORACLE_SID的值,所以单数据库情况往往不需要再设置这个环境变量。
3. 这是一个好的习惯。
查看ORACLE_SID环境变量的方法
echo $ORACLE_SID
设定的方法,我们上面已经讲了。
4. rman关键优化
4.1 指定备份文件的保存位置
在《Oracle初级篇2》第3章里,我们的备份文件都保存在默认位置。
我们通常希望能够保存在指定的目录。请看以下命令,我们把备份保存在/disk1目录里。
要求:
1. /disk1目录已经存在。
2. 当前运行Oracle数据库的用户对/disk1目录有写权限。
注意,一行一行地输入,> 符号及它以前的字符无需输入。
RMAN> run{
2> allocate channel ch00 type disk format '/disk1/bk_%s_%p_%t';
3> backup database plus archivelog;
4> backup current controlfile;
5> release channel ch00;
6> }
注意阅读屏幕输出信息。它会告诉我们备份保存在哪里了,数据文件、归档日志、控制文件生成的备份文件名字。
4.2 拆分备份文件
如果你有留意,你会发现,上述备份几乎是把所有的数据文件打包成1个备份文件,把归档日志文件打包成1个备份文件。
没有考虑备份文件是否过大,是否会备份时间过长,哪怕中间出个小问题也要前功尽弃、重新再来。
所以,我们需要限制每个备份文件里包含的原始文件(数据文件、归档日志文件数量),减小备份文件大小、缩短单个备份文件的生成时间。
我们使用filesperset参数。
注意,一行一行地输入,> 符号及它以前的字符无需输入。
RMAN> run{
2> allocate channel ch00 type disk format '/disk1/bk_%s_%p_%t';
3> backup
4> filesperset 2
5> database plus archivelog;
6> backup current controlfile;
7> release channel ch00;
8> }
注意阅读屏幕输出信息。它会告诉我们备份保存在哪里了,数据文件、归档日志、控制文件生成的备份文件名字。
小结:
1. 根据数据文件的数量,决定filesperset后面的参数值,建议值为10。
2. 本例中的filesperset参数值为2,是为了大家能在测试环境里验证。
3. 一条rman命令的结束符是分号,为了方便阅读,写成几行也是可以的。
4.3 多线程备份
我们注意到,上述每一条备份命令都是单线程执行的。
对于比较大的数据库,将会耗费比较多的时间。
我们希望能够多线程同时并行备份。
注意,一行一行地输入,> 符号及它以前的字符无需输入。
RMAN> run{
2> allocate channel ch00 type disk format '/disk1/bk_%s_%p_%t';
3> allocate channel ch01 type disk format '/disk1/bk_%s_%p_%t';
4> backup database plus archivelog;
5> backup current controlfile;
6> release channel ch00;
7> release channel ch01;
8> }
注意阅读屏幕输出信息。它会告诉我们备份保存在哪里了,数据文件、归档日志、控制文件生成的备份文件名字。
小结:
1. allocate channel和release channel成对出现;
2. 每多1个allocate channel,则多1个线程。
3. 并不是线程越多,备份速度越快,请综合考虑。
4.4 多线程恢复
同理可得,多线程恢复的命令。
注意,一行一行地输入,> 符号及它以前的字符无需输入。
RMAN> run{
2> allocate channel ch00 type disk;
3> allocate channel ch01 type disk;
4> restore database;
5> recover database;
6> release channel ch00;
7> release channel ch01;
8> }
注意阅读屏幕输出信息。它会告诉我们备份保存在哪里了,数据文件、归档日志、控制文件生成的备份文件名字。
5.生成rman脚本
小明向我抱怨,一行一行地输入,太累了;而且只要一行输错了,就要重头开始,太麻烦了。
他问我,有没有简单的方法。
答案是有的。我们以4.1节为例来说明。
把以下内容保存在1个名为dong的文件,假设它的全路径为/test/dong
run{
allocate channel ch00 type disk format '/disk1/bk_%s_%p_%t';
backup database plus archivelog;
backup current controlfile;
release channel ch00;
}
然后,我们执行如下命令
注意,> 符号及它以前的字符无需输入。
RMAN> @/test/dong
就等同于4.1节的效果。
6. 总结
小明经受住了考验,顺利地完成了出差任务,他已经是一名战士。小明加油!人生巅峰!
通过本篇的学习,我们进一步理解了上一篇的内容,把个人能力提高到了实战水平。
在将来,小明将会接受更多地挑战。