oracle数据库备份分两种形式,分别为用户管理的系统级备份和逻辑备份。
一、用户管理的备份
用户管理的备份主要是对数据文件、控制文件和日志文件的备份。
这些备份又分为冷备份和热备份两种。
oracle有两种运行模式,及归档模式和非归档模式。而数据库的归档模式决定了数据库的备份形式。
如果数据库是非归档模式,只能进行冷备份
一下两个命令查看数据库检查点
select file#,checkpoint_change#,fuzzy from V$datafile_header;
select file#,checkpoint_change#,last_change# from V$datafile
数据文件头和控制文件记录的scn号相同数据库才能正常启动。
1、冷备份
a、数据库正常关闭,使用操作系统复制命令,备份所有的控制文件、 数据文件。
数据库正常关闭,会触发完全检查点信息,所有脏内存块都写入到了 数据文件中,联机重做日志文件没有什么意义。
要备份所有的数据文件、控制文件,不需要联机重做日志文件
b、如果使用的是abort关闭数据库,或者实例崩溃关闭,需要备份联机 重做日志文件
关键是要获取所有的数据文件和控制文件的位置
以下命令查看三大文件的位置,恢复时需要用到三大文件位置信息,当然也能改变控制文件中三大的指针,让其指向新的三大文件位置:
select member from V$logfile //找日志文件的位置
select name from V$datafile //找数据文件位置
select name from V$controlfile //找控制文件位置
步骤:挂起数据库、备份文件、开始数据库
知道以上信息,使用一下脚本进行备份(当然每条命令执行也是可以滴)
vi bk.sh//将配置文件copy到备份目录 *.ora //将数据文件和控制文件及日志文件copy到备份目录
{sqlplus /nolog @/root/shut.txt//调用shut.txt脚本
cp spfiledbname.ora(参数文件) /root(备份目录)
cp datafile controlfile logfile(三大文件) /root(备份目录)
sqlplus /nolog @/root/start.txt//调用start.txt脚本
}
vi shut.txt
{conn / as sysdba
shutdown immmediate;
exit
}
vi start.txt
{conn / as sysdba
startup
exit
}
冷备份恢复有两种方式,将备份文件直接恢复到原位置上进行替换,或者修改控制文件中三大文件的位置,让其指向备份目录;这两种方式是由备份文件存放决定,如果备份文件不能恢复到源文件的的原位置,则修改控制文件中三大文件的位置
2、热备份
<一>热备份原理
1)、Oracle的数据块大小是操作系统块大小的整数倍,直接复制数据文件到备份介质的过程中,由于数据库一直可用,数据块中不断地有数据进进出出,使用操作系统命令复制数据文件时,是基于操作系统块进行复制的,也就是说复制一个操作系统块的时候,首先锁定这个块,复制完成以后,解锁这个块,这样这个块在复制前和复制后是一致的。但是对于一个Oracle数据库来说,一个块要分成几次进行复制,可能在复制一个操作系统数据块的时候,另外一个操作系统数据块被改变了,导致oracle数据块在复制到备份介质以后,前一半是没有改动过的,后一半是改动过的,数据块的状态就不一致,数据块就能够使用,备份也就不能够使用,这叫做分离数据块现象(split blocks)
2)、oracle在数据块的头部和尾部各存了一个版本号,通过这个来确认这个数据块是否是分离数据块,oracle修改过一个数据块以后,将这个数据块的版本号在头部和尾部各存放了一份
3)、为了修复分离数据块现象,我们在备份某个表空间的时候,首先进行begin backup,通知数据库开始备份,在没有end backup命令之前,只要是进程修改了被备份的表空间所包含的数据块中的某条记录,oracle就会把该数据块中所包含的所有的数据行的数据生成重做记录,记录到日志文件中
4)、通过发出begin backup以后,第一次修改数据块中的数据行之前,在联机重做日志文件中记录数据块的修改前的数据,这样在热备份恢复的时候,一旦发现某个数据块被分离,则会利用日志文件里的记录的数据对整个数据块进行恢复
5)、备份表空间中的所有的被修改过的数据块的所有数据行都被保存在了联机重做日志文件中,而不是只记录被修改的数据行的记录,因此在热备份过程中,会发现生成的联机重做日志文件的量比较大,这取决于业务的繁忙程度,例如DML量比较大,那么产生的日志会非常的多
6)、发出begin backup命令以后,oracle会对被备份的表空间所对应的数据文件触发文件级别的检查点进程,将内存中属于该表空间的所有脏数据块写入数据文件,检查点结束以后,数据文件头部(第一个和第一个数据块)的检查点SCN和日志序列号都不在变化,直至发出end backup,数据文件头部的SCN和日志序列号才被更新
7)、在热备份的过程中,数据文件头部的SCN和日志序列号被冻结,但是数据文件本身还是最新的,和正常一样的更新和使用,DML更新了某个表,这些更新都会被写入到数据文件中去
8)、冻结数据文件头部的SCN号和日志序列号,是为了将来使用热备份进行恢复的时候,能够知道应该从哪里开始应用重做记录,也就是备份的数据文件头部所记录的SCN和日志序列号,定位到日志文件中,从日志文件中找到开始的SCN,向后应用所有的日志文件
9)、end backup以后,所有的数据文件的头部SCN和日志序列号推进到最新,因为数据文件本身就是最新的
<二>首先要将数据库设置为归档模式
a、让数据库处于mount状态
b、修改数据库归档模式alter database archivelog;
c、启动数据库alter database open;
archive log list//该命令可以查看数据库归档模式状态
<三>创建一个备份目录
备份控制文件alter database backup controlfile to '/home/oracle/hotbk/control01.ctl';
<四>热备份恢复
以下是例子:
弄坏控制文件,进行数据操作,commit
恢复控制文件(copy实现,此时源文件的位置信息的重要性显现出来)
查看检查点是否一致。此时由于进行了数据操作并提交,所有检查点应该不同,查看检查点的命令见文章前面。
进行数据库恢复recover database using backup controlfile;//此时需要加载所需数据文件,将此时显示出来的数据文件复制粘贴,或者使用auto自动填充恢复。
因为有新数据,又写了日志,所以数据库不能启动,要通过日志文件进行数据补全。查找到需要的日志(最后一个数据文件的号),用最新的文件'数'减去当前(select group#,sequence#,status from V$log)日志最大数,整除就是最大数,余数从最小轮询倒数。给予这个日志文件,通过以上查询和计算,可以得到需要的日志文件号。
alter database open resetlogs;//重置日志文件启动db
select group#,sequence#,status from V$log;//查看