在当今信息化的时代,数据尤其重要,为防止大量数据丢失,确保企业不因数据库的损坏而停止正常运行,需要对数据库数据进行备份。Oracle数据库有三种标准的备份方法,它们分别是冷备份、热备份、expdp数据泵备份。导出备份是一种逻辑备份,冷备份和热备份是物理备份。本文对这三种备份方式进行分析,讲述了各自的优缺点和适用的场合,并给出了自动执行这些备份方案的脚本。
一、三种备份的比较
1.1冷备份
冷备份是Oracle最简单的一种备份;执行冷备份前必须关闭数据库;然后使用操作系统实用工具或者第三方工具备份所有相关的数据库文件。
优点:能简单快速地备份。能简单快速地恢复。执行简单。
缺点:必须关闭数据库,不能进行点恢复。
1.2热备份
热备份是在数据库正在运行时进行数据备份的过程。执行热备份的前提是:数据库运行在归档模式。适用于24X7不间断运行的关键应用系统。
优点:备份时数据库是打开的,业务可以正常运行。热备份可以用来进行点恢复。
缺点:执行过程复杂。由于数据库不间断运行,测试比较困难。不能用操作系统实用工具拷贝打开的文件。必须使用Oracle提供的ocopy工具来拷贝打开的文件。热备份可能造成CPU、I/O过载,应在数据库不太忙时进行。
1.3expdp数据泵
冷备份和热备份都备份物理数据库文件,因而被称为物理备份。数据泵备份的是数据库对象,因此被称为逻辑备份。
优点:能执行对象或者行恢复。备份和恢复速度更快。能够跨操作系统平台迁移数据库。数据库可一直运行。
缺点:expdp并不是冷备份和热备份的替代工具。冷、热备份可保护介质失效。expdp备份可保护用户或应用错误。
二、冷备份
冷备份发生在数据库已经正常关闭的情况下,会提供给我们一个完整的数据库。冷备份时将关键性文件拷贝到另外的位置或者将数据库启动到mount状态执行rman备份。对于备份Oracle信息而言,冷备份时最快和最安全的方法。操作步骤总结如下:
2.1关闭数据库
用oracle用户登录操作系统,使用sqlplus / as sysdba命令进入数据库,执行下列命令,关闭数据库。
sql> shutdown immediate;
2.2备份数据
用拷贝命令备份全部的数据文件、重做日志文件、控制文件、初始化参数文件。或者将库启动到mount状态,执行rman备份,脚本如下:
#!/bin/bash
export PATH
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=/oracle/app/oracle/product/10.2/db_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl
BKDIR=/bk/rman/orcl/bk.`date+%Y%m%d%H%M`
LOGFILE=/bk/rman/orcl/log/bk.`date+%Y%m%d%H%M`.log
#create BKDIR
if [ ! -d $BKDIR ]; then
mkdir -p $BKDIR
fi
# rman backup
rman target / log $LOGFILE <<EOF
run {
alter database mount;
allocate channel c1 type disk;
allocate channel c2 type disk;
crosscheck archivelog all;
delete noprompt expired archivelog all;
crosscheck backup;
delete noprompt expired backup;
backup as compressed backupset database format '$BKDIR/full_%d_%T_%s_%p.bak';
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '$BKDIR/arch_%d_%T_%s_%p.bak' delete all input ;
backup as compressed backupset current controlfile format '$BKDIR/ctl_%d_%T_%s_%p.bak';
release channel c1;
release channel c2;
}
EOF
2.3启动数据库
数据备份完成后,启动数据库。用oracle用户登录操作系统,使用sqlplus / as sysdba命令进入数据库,执行下列命令,启动数据库。
sql> startup;
三、热备份
热备份是在数据库运行的情况下,对数据库进行备份,要求数据库必须在归档模式下。备份策略需要根据实际情况来确定。
3.1全库的备份
若数据库不是很大,可以考虑每天对数据库进行一次全备,备份前开启rman的冗余策略,方法如下:
在oracle用户模式下,使用命令rman target /进去rman模式,先对配置进行查看若没有冗余策略,配置冗余策略。
RMAN> show all;
RMAN> configure retention policy to redundancy 7;
然后将备份脚本加入oracle用户的计划任务,定期执行脚本。注意oracle需要有对脚本的执行权限,脚本内容如下:
#!/bin/bash
export PATH
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=/oracle/app/oracle/product/10.2/db_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl
BKDIR=/bk/rman/orcl/bk.`date+%Y%m%d%H%M`
LOGFILE=/bk/rman/orcl/log/bk.`date+%Y%m%d%H%M`.log
#create BKDIR
if [ ! -d $BKDIR ]; then
mkdir -p $BKDIR
fi
# rman backup
rman target / log $LOGFILE <<EOF
run {
alter database mount;
allocate channel c1 type disk;
allocate channel c2 type disk;
crosscheck archivelog all;
delete noprompt expired archivelog all;
crosscheck backup;
delete noprompt expired backup;
backup as compressed backupset database format '$BKDIR/full_%d_%T_%s_%p.bak';
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '$BKDIR/arch_%d_%T_%s_%p.bak' delete all input ;
backup as compressed backupset current controlfile format '$BKDIR/ctl_%d_%T_%s_%p.bak';
delete noprompt obsolete;
release channel c1;
release channel c2;
}
EOF
3.2全库备份和增量备份的结合
若数据量特别大时,备份执行需要的时间就长,会出现在业务高峰期时段,备份仍在进行的情况。rman备份消耗cpu、内存等资源,加之业务的运行,数据库服务器的负载就增加,可能会出现数据库巡运行缓慢的问题。为了避免此情况的发生,备份策略可以指定为周末进行全备,工作日执行增量备份。同样,根据实际情况需要设置rman的冗余策略,步骤详见3.1。
此时全库的备份我们采用level为0的备份方式,脚本如下:
#!/bin/bash
export PATH
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=/oracle/app/oracle/product/10.2/db_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl
BKDIR=/bk/rman/orcl/bk.`date+%Y%m%d%H%M`
LOGFILE=/bk/rman/orcl/log/bk.`date+%Y%m%d%H%M`.log
#create BKDIR
if [ ! -d $BKDIR ]; then
mkdir -p $BKDIR
fi
# rman backup
rman target / log $LOGFILE <<EOF
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
crosscheck archivelog all;
delete noprompt expired archivelog all;
crosscheck backup;
delete noprompt expired backup;
backup as compressed backupset incremental level 0 database format '$BKDIR/db_%d_%T_%s_%p.bak';
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '$BKDIR/arch_%d_%T_%s_%p.bak' delete all input ;
backup as compressed backupset current controlfile format '$BKDIR/ctl_%d_%T_%s_%p.bak';
delete noprompt obsolete;
release channel c1;
release channel c2;
}
EOF
库的增量备份我们采用level为1的增量备份,备份脚本如下:
#!/bin/bash
export PATH
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=/oracle/app/oracle/product/10.2/db_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl
BKDIR=/bk/rman/orcl/bk.`date+%Y%m%d%H%M`
LOGFILE=/bk/rman/orcl/log/bk.`date+%Y%m%d%H%M`.log
#create BKDIR
if [ ! -d $BKDIR ]; then
mkdir -p $BKDIR
fi
# rman backup
rman target / log $LOGFILE <<EOF
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
crosscheck archivelog all;
delete noprompt expired archivelog all;
crosscheck backup;
delete noprompt expired backup;
backup as compressed backupset incremental level 1 database format '$BKDIR/db_%d_%T_%s_%p.bak';
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '$BKDIR/arch_%d_%T_%s_%p.bak' delete all input ;
backup as compressed backupset current controlfile format '$BKDIR/ctl_%d_%T_%s_%p.bak';
delete noprompt obsolete;
release channel c1;
release channel c2;
}
EOF
四、数据泵备份(expdp)
数据泵(expdp)的备份也是常用的一种备份方式,备份和恢复比较简单。Oracle数据库有5种导出模式,现将5种导出模式及步骤总结如下:
4.1导出和导入前的准备
(1)检查已经建立的目录
SQL> select * from dba_directories;
(2)在操作系统上创建相应的目录
$ mkdir -p /home/oracle/dmp
$chown oracle:dba /home/oracle/dmp ------oracle:dba为目录的用户和用户组,根据实际情况更改
(3)创建directory文件存储路径
SQL> create directory dmp_dir as ‘/home/oracle/dmp’;
(4)给用户使用目录的权限
SQL> grant read,write on directory dmp_dir to test;
4.2数据泵导出的模式
(1)按表模式导出,例如:导出test用户的a表和b表
expdp test/test@test directory=dmp_dir tables=test.a,test.b dumpfile =test.dmp logfile=test.log
(2)按表空间导出,例如:导出表空间test01里面的数据
expdp test/test@test directory=dmp_dir dumpfile=tablespace_test01.dmp logfile=tablespace_test01.log tablespaces=test01
(3)按用户导出, 例如:导出test、test1两个用户的数据
expdp test/test directory=dmp_dir dumpfile=test_test1.dmp logfile=test_test1.log schemas=test,test1
(4)导出整个数据库,加参数full=y便可导出全库数据,需要注意的是用户有dba权限才可导出全库数据
expdp system/manager directory=dmp_dir dumpfile=full.dmp logfile=full.log full=y
(5)按查询条件导出,导出b表中满足where rownum<11条件的数据
expdp test/test@test directory=dmp_dir tables=test.b dumpfile =test1.dmp logfile=test1.log query=b:"where rownum<11"
4.3数据库导入的模式
5种导出模式,便对应的5种导入模式,现将步骤和模式总结如下:
(1)按表模式导入, 导入时表名是可以更换的。
—-语句①是将test表导入test用户,表名仍为test
①impdp test/test@test directory=dmp_dir tables=test.a dumpfile=test.dmp logfile=imptest.log
—-语句②是将test用户的a表数据导入到b表中
②impdp test/test@test directory=dmp_dir ramap_table=test.a:b dumpfile=test.dmp logfile=imptest.log
(2)按表空间导入
—-原表空间名和目标表空间名一致
impdp test/test directory=dmp_dir dumpfile=test.dmp logfile=imptest.log tablespaces=test
—-原表空间名与目标表空间名不一致,test原表空间名,目标表空间名为test1
impdp test/test directory=dmp_dir dumpfile=test.dmp logfile=imptest.log remap_tablespace=test:test1
(3)按用户导入(可以将用户信息直接导入,即如果用户信息不存在的情况下也可以直接导入)
—-原用户名与目标用户名一致
Impdp test/test directory=dmp_dir schemas=test dumpfile=test.dmp logfile=imptest.log
—-原用户名与目标用户名不一致,test原用户名,test1为目标用户名
Impdp test/test directory=dmp_dir remap_schema=test:test1 dumpfile=test.dmp logfile=imptest.log
(4)导入全库,加参数full
impdb system/manager directory=dmp_dir dumpfile=full.dmp logfile=full.log full=y
(5)按查询条件导入
expdp test/test directory=dmp_dir tables=test.b dumpfile =test.dmp logfile=test.log query=b:"where rownum<11"