Oracle 数据库备份与恢复总结-exp/imp (导出与导入装库与卸库)
sqlldr userid=B/A@D control=result.ctl
log=resulthis.out rows=10000?? bindsize=8192000
?
1.1? 基本命令
?1.? 获取帮助
?
$ exp help=y
$ imp help=y
?
2.? 三种工作方式
?
(1)交互式方式
$ exp??????? //? 然后按提示输入所需要的参数
(2)命令行方式
$ exp user/pwd@dbname file=/oracle/test.dmp full=y??? //? 命令行中输入所需的参数
?
(3)参数文件方式
$ exp parfile=username.par??? //? 在参数文件中输入所需的参数
参数文件 username.par 内容 userid=username/userpassword buffer=8192000
compress=n grants=y
file=/oracle/test.dmp full=y
?
3.? 三种模式
?
(1)表方式,将指定表的数据导出/导入。
导出:
导出一张或几张表:
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2
导出某张表的部分数据
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query=\”where col1=\’…\’
and col2 \<…\”
导入:
导入一张或几张表
$? imp? user/pwd? file=/dir/xxx.dmp? log=xxx.log? tables=table1,table2? fromuser=dbuser touser=dbuser2 commit=y ignore=y
?
(2)用户方式,将指定用户的所有对象及数据导出/导入。
导出:
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=(xx, yy)
只导出数据对象,不导出数据? (rows=n )
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n
导入:
$? imp? user/pwd? file=/dir/xxx.dmp? log=xxx.log? fromuser=dbuser? touser=dbuser2
commit=y ignore=y
(3)全库方式,将数据库中的所有对象导出/导入导出:
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=ycommit=y ignore=y
导入:
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2
?
?
1.2? 高级选项
1.? 分割成多个文件
?
以多个固定大小文件方式导出:这种做法通常用在表数据量较大,单个 dump文件可能
会超出文件系统的限制的情况
$ exp user/pwd file=1.dmp,2.dmp,3.dmp,…filesize=1000m??? log=xxx.log full=y
以多个固定大小文件方式导入
$? imp? user/pwd file=1.dmp,2.dmp,3.dmp,…? filesize=1000m tables=xxx? fromuser=dbuser touser=dbuser2??? commit=y ignore=y
?
2.? 增量导出/导入
?
// oracle 9i? 以后 exp? 不再支持? inctype
必须为? SYS? 或? SYSTEM? 才可执行增量导出导入
增量导出:?? 包括三个类型:
(1)“完全”增量导出(Complete)? //? 备份整个数据库
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
(2)“增量型”增量导出????? 导出上一次备份后改变的数据。
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental
(3)? “累计型”增量导出(Cumulative)只导出自上次“完全”导出之后数据库中变化 了的信息。
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative
增量导入:
$ imp usr/pwd FULL=y inctype=system/restore/inct ype
其中:
SYSTEM:??? 导入系统对象
RESTORE:? 导入所有用户对象
?
?
3.? 以SYSDBA进行导出/导入
?
?
1.? 用于 Oracle 技术支持
2.? 用于表空间传输
例:
$??? imp??? \'usr/pwd@instance??? as??? sysdba\'??? tablespaces=xx??? transport_tablespace=y file=xxx.dmp datafiles=xxx.dbf
$? imp? file=expdat.dmp? userid=”””sys/password? as? sysdba”””? transport_tablespace=y
“datafile=(c:tempapp_data,c:tempapp_index)”
?
4.? 表空间传输? (速度快)
?
表空间传输是? 8i? 新增加的一种快速在数据库间移动数据的一种办法,是把一个数 据库上的格式数据文件附加到另外一个数据库中,而不是把数据导出成? dmp? 文件,这 在有些时候是非常管用的,因为传输表空间移动数据就象复制文件一样快。
1.关于传输表空间有一些规则? (10g前):
?????? 源数据库和目标数据库必须运行在相同的硬件平台上。
?
?????? 源数据库与目标数据库必须使用相同的字符集。
?????? 源数据库与目标数据库一定要有相同大小的数据块
?????? 目标数据库不能有与迁移表空间同名的表空间
?????? SYS 的对象不能迁移
?????? 必须传输自包含的对象集
?????? 有一些对象,如物化视图,基于函数的索引等不能被传输
(同字节序文件的跨平台可以用更换数据文件的文件头的方法)
(10g? 支持跨平台的表空间传输,只要操作系统字节顺序相同,就可以进行表空间 传输。需要使用 RMAN转换文件格式,略)
2.? 检测一个表空间是否符合传输标准的方法:
SQL > exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true); SQL > select * from sys.transport_set_violations;
如果没有行选择,表示该表空间只包含表数据,并且是自包含的。对于有些非自包
含的表空间,如数据表空间和索引表空间,可以一起传输。
?
3. 简要使用步骤:
如果想参考详细使用方法,也可以参考 ORACLE联机帮助。
1.设置表空间为只读(假定表空间名字为 APP_Data? 和 APP_Index)
SQL > alter tablespace app_data read only; SQL > alter tablespace app_index read only;
2.发出 EXP命令
SQL> host exp userid=”””sys/password as sysdba””” transport_tablespace=y tablespaces=(app_data, app_index)
以上需要注意的是
为了在 SQL 中执行 EXP,USERID 必须用三个引号,在 UNIX中也必须注意 避免“/”的使用
在 816和以后,必须使用 sysdba才能操作
这个命令在 SQL中必须放置在一行(这里是因为显示问题放在了两行)
3.拷贝.dbf数据文件(以及.dmp文件)到另一个地点,即目标数据库
可以是 cp(unix)或 cop y(windows)或通过 ftp传输文件(一定要在 bin方式)
4.把本地的表空间设置为读写
$ alter tablespace app_data read write;
$ alter tablespace app_index read write;
5.在目标数据库附加该数据文件? (直接指定数据文件名)
(表空间不能存在,必须建立相应用户名或者用 fromuser/touser)
$ imp file=expdat.dmp userid=”””sys/password as sysdba””” transport_tablespace=y??? datafiles=(“c:\app_data.dbf,c:\app_index.dbf”) tablespaces=app_data,app_index tts_owners=hr,oe
6.设置目标数据库表空间为读写
$ alter tablespace app_data read write;
$ alter tablespace app_index read write;
?
?
1.3? 优化
?1.? 加快exp速度
?
加大 large_pool_size,可以提高 exp的速度 采用直接路径的方式(direct=y),数据不需要经过内存进行整合和检查. 设置较大的 buffer,如果导出大对象,小 buffer会失败。
export文件不在 ORACLE使用的驱动器上 不要 export到 NFS文件系统
UNIX环境:用管道模式直接导入导出来提高 imp/exp的性能
?
2.? 加快imp速度
?
建立一个 indexfile,在数据 import完成后在建立索引
将 import 文件放在不同的驱动器上 增加 DB_BLOCK_BUFFERS
增加 LOG_BUFFER
用非归档方式运行 ORACLE:ALTER DATABASE NOARCHIVELOG; 建立大的表空间和回滚段,OFFLINE其他回滚段,回滚段的大小为最大表的 1/2 使用? COMMIT=N
使用 ANALYZE=N
单用户模式导入
UNIX环境:用管道模式直接导入导出来提高 imp/exp的性能
?
3.? 通过unix/Linux PIPE管道加快exp/imp速度
?
通过管道导出数据:
1.通过 mknod -p 建立管道
$ mknod /home/exppipe p??? //? 在目录/home下建立一个管道 exppipe注意参数 p
2.通过 exp和 gzip导出数据到建立的管道并压缩
$ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz
$ exp test/test tables=bitmap file=/home/newsys/test.pipe &
gzip < /home/newsys/test.pipe > bitmap.dmp.gz
3.导出成功完成之后删除建立的管道
$ rm??? -rf??? /home/exppipe
?
导出脚本:
###UNIX下 ORACLE数据库通过 PIPE管道进行备份
###### using "export" and "tar" command to bakup oracle datebase #######
?
trap "" 1 #nohup
LOGFILE=/opt/bakup/log/bakup_ora.log
?
export LOGFILE
DUMPDIR=/archlog_node1
export DUMPDIR
exec >$LOGFILE 2>&1
?
?
echo
echo ' Begin at ' `date`
echo
?
?
#?????????????? clear old result file
cd $DUMPDIR
if [ -f exp.dmp.Z ]
then
echo "clear old result file"
rm exp.dmp.Z
fi
?
?
#?????????????? make pipe
mkfifo exp.pipe
chmod a+rw exp.pipe
?
?
#?????????????? gain the dmp.Z file
compress < exp.pipe > exp.dmp.Z &
su -u oracle -c "exp userid=ll/ll file=$DUMPDIR/exp.pipe full=y buffer=20000000"
?
?
echo
echo '??? exp end at '`date`
echo
?
?
#?????????????? rm pipe
rm exp.pipe
?
?
#?????????????? tar the dmp.Z file to tape
mt -f /dev/rmt/0 rew
tar cvf /dev/rmt/0 exp.dmp.Z
?
?
echo
echo '??? tar end at '`date`
echo
?
通过管道导入生成的文件:
1.通过 mknod -p 建立管道
?
$ mknod /home/exppipe p
2.导入生成的压缩文件
$ imp test/test file=/home/exppipe fromuser=test touser=macro &
gunzip < exp.dmp.gz > /home/exppipe
3.删除管道
$ rm fr /home/exppipe
?
?
4.? 全库导入的一般步骤
?
注意:在导出时,需要通过toad或其他工具提取源数据库创建主键和索引的脚本
1.? 先全库加 rows=n 把结构导进去
$ imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n
2.? 使业务用户的触发器失效/删除主键和唯一索引
spool drop_pk_u.sql
select 'alter table '||table_name||' drop constraint '||constraint_name||';'
from user_constraints
where constraint_type in ('P','U');
/
spool off
spool disable_trigger.sql
select 'alter trigger '||trigger_name||' disable;'
from user_triggers;
/
spool off
?
?
@drop_pk_u.sql
@disable_trigger.sql
?
?
3.? 以 ignore=y全库导入
$ imp system/manager file=exp.dmp log=imp.log full=y ignore=y
4.? 通过 toad或其他工具提取源数据库创建主键和索引的脚本,在目标数据库中创建主键
和索引。使触发器生效。
?
1.4? 常见问题
?1.? 字符集问题
?
ORACLE? 多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示, 货币形式,排序方式和? CHAR,VARCHAR2,C LOB,LONG? 字段的数据的显示等有效。 ORACLE? 的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语 言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据
(如文本)时候的编码规则。
ORACLE 字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,
?
字符集在创建数据库的时候设定,并保存在数据库 props$表中。
在客户端的字符集环境比较简单,主要就是环境变量或注册表项? NLS_ LANG,注 意 NLS_LANG的优先级别为:参数文件<注册表<环境变量<alter? session。如果客户端 字符集和服务器端字符集不一样,而且字符集的转换也不兼容,那么客户端的数据显示 与导出/导入的与字符集有关的数据将都是乱码。
使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里
需要一个 2进制文件编辑工具即可,如 uedit32。用编辑方式打开导出的 dmp文件,获
取? 2 、 3? 字节 的 内容 , 如? 00? 01 , 先 把 它 转换 为? 10? 进 制 数, 为? 1 ,使用 函 数
NLS_CHARSET_NAME 即可获得该字符集: SQL> select nls_charset_name(1) from dual; NLS_CHARSET_NAME(1)
------------------- US7ASCII
可以知道该 dmp文件的字符集为 US7ASCII,如果需要把该 dmp文件的字符集换
成 ZHS16GBK,则需要用 NLS_CHARSET_ID 获取该字符集的编号: SQL> select nls_charset_id('zhs16gbk') from dual; NLS_CHARSET_ID('ZHS16GBK')
--------------------------
把 852换成 16进制数,为 354,把 2、3字节的 00? 01 换成 03? 54,即完成了把该 dmp文件字符集从 us7ascii 到 zhs16gbk 的转化,这样,再把该 dmp文件导入到 zhs16gbk 字符集的数据库就可以了。
?
2.? 版本问题
?
Exp/Imp 很多时候,可以跨版本使用,如在版本 7与版本 8之间导出导入数据,但 这样做必须选择正确的版本,规则为:
总是使用 IMP的版本匹配数据库的版本,如果要导入到 816,则使用 816的导入工 具。
总是使用 EXP 的版本匹配两个数据库中低的那个版本,如在 815与 816之间互导,则使用 815的 EXP 工具。
imp和 exp版本不能往上兼容:??? imp 可以导入低版本 exp生成的文件,? 不能导入高版本 exp生成的文件。
?
?
2.1 基本知识
Oracle 的? SQL* LOADER? 可以将外部格式化的文本数据加载到数据库表中。通常 与 SPOOL导出文本数据方法配合使用。
?
1.命令格式
?
SQLLDR keyword=value [,keyword=value,...]
例:
$ sqlldr user/pwd control=emp.ctl data=emp.dat bad=emp.bad log=emp.log
?
2.控制文件
?
SQL*LOADER? 根据控制文件可以找到需要加载的数据。并且分析和解释这些数
据。
控制文件由三个部分组成,具体参数参考帮助文档:
1.? 全局选件,行,跳过的记录数等;
2. INFILE 子句指定的输入数据;
3.? 数据特性说明。
comment: --注释
例:
load data infile *
append??? --除了 append外,还有 insert、replace、truncate等方式
into table emp
fields terminated b y ‘|’
(
no???????????? float external, name char(20),
age?????????? integer external,
duty???????? char(1),
salary????? float external,
upd_ts???? date(14) ‘YYYYMMDDHH24MISS’
)
begindata
100000000003|Mulder|000020|1|000000005000|20020101000000
100000000004|Scully|000025|2|000000008000|20020101235959
?
控制文件中 infile选项跟 sqlldr 命令行中 data 选项含义相同,如使用 infile *则表明
数据在本控制文件以 begin data 开头的区域内。 一些选项:
FIELDS TERMINATED BY WHITESPACE FIELDS TERMINATED BY x'09'
FILLER_1 FILLER, //? 指定某一列将不会被装载
DEPTNO position(1:2), DNAME position(*:16), //? 指定列的位置
SEQNO RECNUM //载入每行的行号
SKIP n????????? //? 指定导入时可以跳过多少行数据
?
3.数据文件
?
按控制文件数据格式定义的数据行集,例:
100000000001|Tom|000020|1|000000005000|20020101000000
100000000002|Jerry|000025|2|000000008000|20020101235959
?
?
固定格式、可变格式、流记录格式:
固定格式:
当数据固定的格式(长度一样)时且是在文件中得到时,要用 INFILE "fix n"
load data
infile 'example.dat' "fix 11"
into table example
fields terminated b y ',' optionally enclosed by '"'
(col1 char(5), col2 char(7)) example.dat:
001, cd, 0002,fghi,
00003,lmn,
1, "pqrs",
0005,uvwx,
可变格式:
当数据是可变格式(长度不一样)时且是在文件中得到时,要用 INFILE "var n"。如:
load data
infile 'example.dat' "var 3"
into table example
fields terminated b y ',' optionally enclosed by '"'
(col1 char(5), col2 char(7)) example.dat:
009hello,cd,010world,im,
012my,name is,
流记录格式: // Stream-recored format:
load data infile 'xx.dat' "str '|\n'"
?
into table xx field terminated b y ',' optionally enclosed by '"'
(col1 char(5), col2 char(7))
?
?
example.dat:
hello, ccd,|
world, bb,|
?
4.? 坏文件
?
?
bad=emp.bad
坏文件包含那些被 SQL*Loader拒绝的记录。被拒绝的记录可能是不符合要求的记
录。
?
5.? 日志文件及日志信息
?
log=emp.log
当 SQL*Loader? 开始执行后,它就自动建立? 日志文件。日志文件包含有加载的总 结,加载中的错误信息等。
?
2.2? 高级选项
1. Conventional Path Load? 与? Direct Path Load
?
Conventional-path Load:
通过常规通道方式上载。
特点:commit, always? gen redo logs,? enforce all constraints, fire insert triggers, can load into cluster, other user can make change
rows:每次提交的记录数
bindsize:每次提交记录的缓冲区
readsize:与 bindsize 成对使用,其中较小者会自动调整到较大者
sqlldr 先计算单条记录长度,乘以 rows,如小于 bindsize,不会试图扩张 rows以填充 bindsize;如超出,则以 bindsize 为准。 命令为:
$ sqlldr dbuser/oracle control=emp.ctl log=emp.log rows=10000 bindsize=8192000
Direct-Path Load:
通过直通方式上载,可以跳过数据库的相关逻辑,不进行? SQL解析,而直接将数 据导入到数据文件中。
特点:save, conditionly gen redo logs, enforce PK UK NN, not fire triggers, can not load into cluster, other user can not make change命令为:
$ sqlldr dbuser/oracle control=emp.ctl log=emp.log direct=true
?
2. SPOOL导出文本数据方法
?
导入的数据文件可以用 SPOOL导出文本数据方法生成。
SQL*PLUS环境设置
SET NEWPAGE NONE HEADING OFF SPACE 0 PAGESIZE 0
SET TRIMOUT ON TRIMSPOOL ON LINESIZE 2500
注:LINESIZE 要稍微设置大些,免得数据被截断,它应和相应的 TRIMSPOOL结合使用防止导出的文本有太多的尾部空格。
但是如果 LINESIZE 设置太大,会大大降低导出的速度,另外在 WINDOWS下导 出最好不要用 PLSQL导出,速度比较慢,直接用? COMMEND 下的 SQLPLUS命令最 小化窗口执行。对于字段内包含很多回车换行符的应该给与过滤,形成比较规矩的文本 文件。
通常情况下,我们使用 SPOOL方法,将数据库中的表导出为文本文件,如下述:
set trimspool on
set linesize 120 pagesize 2000 newpage 1 heading off??? term off spool? 路径+文件名
select col1||','||col2||','||col3||','||col4||'..' from tablename;
?
2.3 脚本
?1.? 将表中数据记录导出为字段值用分隔符'|'分开的.dat文件
?
#!/bin/ksh
##################################################################
##??? 名称: unloadtable
##??? 功能:? 本 shell 用于将表中数据记录导出
##???????????????? 导出为字段值用分隔符'|'分开的.dat文件
##??? 编者:
##??? 日期: 2006.03.18
##################################################################
?
if [ $# -ne 3 ]
then
echo "usage:unloadtable tablename username password."
exit 0
fi
?
##准备工作
echo "set heading off???? " >/tmp/$1.col
echo "set pagesize 0" >>/tmp/$1.col
echo "set linesize 800??? " >>/tmp/$1.col
echo "set feedback off??? " >>/tmp/$1.col
?
echo "set tab off????????????? " >>/tmp/$1.col
echo? "select? column_name||','? from? user_tab_columns? where? lower(table_name)='$1'? order? by
column_id; " >> /tmp/$1.col
?
##产生 select 语句
echo "set heading off???? " >/tmp/$1.sel
echo "set pagesize 0" >>/tmp/$1.sel
echo "set linesize 800??? " >>/tmp/$1.sel
echo "set feedback off??? " >>/tmp/$1.sel
echo "set tab off????????????? " >>/tmp/$1.sel
echo "select " >>/tmp/$1.sel
echo? `sqlplus? -s? $2/$3? <? /tmp/$1.col`? |sed? "s/,/||'|'||/g"? |sed? "s/||$//g"|sed? "s/date/\"date\"/g"
>>/tmp/$1.sel
?
##生成 dat文件
#echo "from $1;\n/" >>/tmp/$1.sel??? 由于? /? 导致多执行一次 select
echo "from $1;\n" >>/tmp/$1.sel
sqlplus -s $2/$3 < /tmp/$1.sel >$1_tmp.dat
#awk '{if(FNR!=1) print $0}' $1_tmp.dat >$1.dat?????? FNR 选项使得第一条记录选不出
awk '{print $0}' $1_tmp.dat >$1.dat
rm -f $1_tmp.dat
?
2.? 将数据导入到相应表中
?
#!/bin/ksh
##################################################################
##??? 名称:loadtable
##??? 功能:本 shell 用于将已经准备好的.dat数据文件导入相应的表中
##?????????????? .dat 文件各个字段值用分隔符'|'分开。
##??? 编者:
##??? 日期: 2006.03.18
##################################################################
if [ $# -ne 3 ]
then
echo "usage:loadtable tablename username??? password."
exit 0
fi
?
##准备工作
echo "set heading off???? " >/tmp/$1.colsql
?
echo "set pagesize 0" >>/tmp/$1.colsql
echo "set linesize 800??? " >>/tmp/$1.colsql
echo "set feedback off??? " >>/tmp/$1.colsql
echo "set tab off????????????? " >>/tmp/$1.colsql
echo? "select? column_name||','? from? user_tab_columns? where? lower(table_name)='$1'? order? by
column_id; " >> /tmp/$1.colsql
?
##产生 ctl文件
echo "load data" >/tmp/$1.ctl
echo "infile *" >>/tmp/$1.ctl
echo "into table $1" >>/tmp/$1.ctl
echo "fields terminated by '|'" >>/tmp/$1.ctl
echo `sqlplus -s $2/$3 < /tmp/$1.colsql` |sed "s/,$/)/g" |sed "s/^/(/g" >>/tmp/$1.ctl
?
##开始导入数据
echo "truncate table $1;" >/tmp/$1.sql
sqlplus $2/$3 < /tmp/$1.sql
sqlldr $2/$3 data=$1.dat control=/tmp/$1.ctl log=/tmp/$1.log
?
?
?
?
用户管理的备份与恢复也称 OS物理备份,是指通过数据库命令设置数据库为备份 状态,然后用操作系统命令,拷贝需要备份或恢复的文件。这种备份与恢复需要用户的 参与手工或自动完成。?
对于使用 OS拷贝备份的数据文件,可以使用 DBVERTIFY? 进行检验。DBVERTIFY
是一个外部工具,主要用于校验数据文件或备份的数据文件的数据块是否正确。 例:? dbv /u01/oradata/oracle/users01.dbf BLOCKSIZE=8192
参数说明:
关键字??????????????????? 说明??????????????????????? (默认)
FILE 要检验的文件 (NONE)
START 起始块 (文件的第一个块)
END 结束块 (文件的最后一个块)
BLOCKSIZE 逻辑块大小 (2048)
LOGFILE 输出日志 (NONE)
FEEDBACK 显示进程 (0)
?
Recover? 还可以进行测试,检测恢复的错误,错误信息记载在? alert_SID.log? 文件
中,通过测试,我们可以知道该恢复操作是否能正常完成。
SQL> RECOVER TABLESPACE sales TEST;
SQL> RECOVER DATABASE UNTIL CANCEL TEST;
?
3.1? 相关设置
?
3.1.1? 设置ARCHIVELOG与NONARCHIVELOG模式
?
重做日志组是以循环方式使用的,重做日志组会被覆盖重做日志信息就会丢失。为
了保存历史以来的重做日志,数据库可以运行在日志归档模式下(archivelog mode)。 在日志归档模式下,当日志组撤换到下一个组时后台进程? ARCn? 将上一个日志文件复
制到另一个地方(oracle 10g? 使用快速恢复区会归档到该区)保存。数据库默认为非归档
模式(noarchivelog mode)。
设置 ARCHIVELOG模式步骤:
1.? 关闭数据库,备份已有的数据,改变数据库的运行方式是对数据库的重要改动,所
以要对数据库做备份,对可能出现的问题作出保护。
2.? 修改初试化参数:? 使用 PFILE,修改初始化参数文件 init[SID].ora log_archive_start=true #启动自动归档 log_archive_format=ARC%T%S.arc #归档文件格式 log_archive_dest=/arch12/arch???????????? #归档路径
?
3.? 启动 Instance 到 Mount状态,即加载数据库但不打开数据库:
SQL > startup mount;
4.? 发出修改命令
SQL > alter database archivelog; SQL > alter database open;
设置 NONARCHIVELOG模式步骤同上,只需修改相应参数值即可。
?
3.1.2 LOGGING? 与? NOLOGGING
?
表空间、表、索引、分区可以设置为? NOLOGGING,用于快速装入数据—irect Load)。 在插入数据时只写入最小的重做日志和回滚数据。在归档数据库模式下,执行? Direct? Load 操作后应立即进行备份,否则不能使用之前的备份进行恢复。另外,用户可以设置数据库的 强制日志模式,使用所有操作都记入日志。
LOGGING? 与? NOLOGGING? 的区别:
?
LOGGING NOLOGGING
所有的更改写入 REDO 最小写入 REDO LOG
从最近备份中完全恢复 不能从最近备份中完全恢复
不需要增加备份 需要增加备份
?
NOLOGGING? 的操作:
CREATE TABLE … NOLOGGING AS SELECT??? 语句
INSERT /*+APPEND*/??? INTO <表> NOLOGGING??? SELECT? 语句
INSERT /*+ PARALLEL(<表>,<n>)达式*/ INTO <表> NOLOGGING SELECT? 语句
SQL*LOADER? 的? DIRECT 方法
例:
SQL>CREATE TABLE emp1 NOLOGGING AS SELECT * FROM emp; SQL>SELECT name,unrecoverable_time FROM V$DATAFILE;
?
SQL>INSERT /*+ APPEND */ INTO emp1 NOLOGGING SELECT* * FROM emp; SQL>SELECT name,unrecoverable_time FROM V$DATAFILE;
?
SQL>ALTER DATABASE NO FORCE LOGGING;
?
3.1.3? 归档路径
?
在归档模式下进行自动归档时,或者在恢复时设置归档所在的位置,需要设置归档路径
初始化参数:
LOG_ARCHIVE_DEST_n=”LOCATION=path MANDATORY|OPTIONAL REOPEN=n”
LOG_ARCHIVE_DEST_n=”SERVICE=standby MANDATORY|OPTIONAL REOPEN=n
?
3.2 NONARCHIVELOG 模式
3.2.1? 脱机冷备与恢复
?
冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数 据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份? Oracle? 信息而言,冷 备份是最快和最安全的方法。
冷备份的优点:
1.是非常快速的备份方法(只需拷贝文件)
2.容易归档(简单拷贝即可)
3.容易恢复到某个时间点上(只需将文件再拷贝回去)
4.能与归档方法相结合,作数据库“最新状态”的恢复。
5.低度维护,高度安全。
冷备份的不足:
1.单独使用时,只能提供到“某一时间点上”的恢复。
2.在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在
冷备份过程中,数据库必须是关闭状态。
3.若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
4.不能按表或按用户恢复。
如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用户可以 工作)并将所备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。冷备份中必须 拷贝的文件包括:
1.所有数据文件
2.所有控制文件
3.所有联机 REDO LOG 文件
4.参数化参数 Init.ora 文件(可选)。
?
3.2.2? 案例
?
1.9i? 脱机冷备/恢复的例子:
(1)? 关闭数据库
$ sqlplus /nolog
SQL> connect /as sysdba
SQL> shutdown normal;
(2)? 用拷贝命令备份/恢复全部的时间文件、重做日志文件、控制文件、初始化参数 文件
SQL > host cp??? xx?????? xx;
?
可以使用以下冷备脚本:
#!/bin/bash
##################################################################
##??? 名称:??? coldback_gen.sh
?
##??? 功能:??? 本 shell 用于生成冷备份脚本, 进行冷备份同时生成相应的恢复命令
##?? 可以修改后在生成后立即执行
## 编者:??
## 日期: 2006.12.13.
?
##################################################################
?
##设置变量
##设置临时文件名
tempsql=./backup.sql
##设置备份文件存放路径
backdate=`date -u +%Y%m%d`
backupdir=/u04/oracle/coldback/$backdate
?
mkdir $backupdir
##设置备份脚本文件名
backupsh=$backupdir/coldback.sh
rcvrsh=$backupdir/recovery.sh
?
echo "正在生成冷备份脚本[$backupsh]..."
?
##检查 ORACLE数据库是否启动
oraisrun=`ps -ef|grep -c ora_`
if [ "$oraisrun" = "0" ] || [ "$oraisrun" = "1" ]
then
echo "ORACLE 数据库尚未启动,请先启动 ORACLE"
echo ""
exit
fi
?
##准备工作
echo "set heading off???? " > $tempsql
echo "set feedback off?? " >>$tempsql
echo "set tab off????????????? " >>$tempsql
echo "set verify off??????? " >>$tempsql
echo "set pagesize 0"?????????? >>$tempsql
echo "set linesize 800??? " >>$tempsql
echo "select '#!/bin/bash' from dual;"????????? >> $tempsql
echo "select ''?????????????????????????? from dual;"????????? >> $tempsql
echo? "select? '##? 备份脚本生成时间:? "? `date? +%Y 年%m月%d日-%H:%M:%S`? "'
from dual;" >> $tempsql
echo "select '##? 备份目的路径: $backupdir' from dual; "??????? >> $tempsql
echo "select '' from dual; " >> $tempsql
?
echo ""
echo "select 'echo ''开始进行脱机冷备...''' from dual; "?????????????? >> $tempsql
echo "select 'echo ''备份目的路径: $backupdir ''' from dual; "????? >> $tempsql
?
##这里不直接关闭数据库,提示用户手工关闭为好??? 如果需要直接关闭,请修改
echo "select 'orarun='||'\`'||'ps -ef|grep -c ora_'||'\`' from dual;" >>$tempsql
echo "select 'if [ "\$orarun" != "0" ] && [ "\$orarun" != "1" ]??? ' from dual;" >>$tempsql
echo "select 'then' from dual; " >>$tempsql
echo "select 'echo '' '' ' from dual;" >>$tempsql
echo "select 'echo ''ORACLE 数据库已启动,请先关闭 ORACLE 数据库'' ' from dual;
" >>$tempsql
echo "select 'echo '' '' ' from dual;" >>$tempsql
echo "select 'exit' from dual; "????? >>$tempsql
echo "select 'fi'?????? from dual; "????? >>$tempsql
?
echo "select 'echo '' '' ' from dual; "??? >> $tempsql
echo "select 'echo ''正在备份控制文件...''' from dual; "??? >> $tempsql
echo "select 'cp ' ||name||' $backupdir' from v\$controlfile; "??? >> $tempsql
echo "select 'echo ''控制文件备份完毕!''' from dual; "??? >> $tempsql
echo "select 'echo '' '' ' from dual; "??? >> $tempsql
echo "select 'echo ''正在备份数据文件...''' from dual; "??? >> $tempsql
echo "select 'cp ' ||name||' $backupdir' from v\$datafile;????? "??? >> $tempsql
echo "select 'echo ''数据文件备份完毕!''' from dual; "??? >> $tempsql
echo "select 'echo ''正在备份联机日志...''' from dual; "??? >> $tempsql
echo "select 'echo '' '' ' from dual; "??? >> $tempsql
echo "select 'cp '||member||' $backupdir' from v\$logfile;????? "??? >> $tempsql
echo "select 'echo ''联机日志备份完毕!''' from dual;"??? >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
echo "select 'echo ''脱机冷备完毕!''' from dual;"??? >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
?
##生成冷备份执行脚本
sqlplus -s ' / as sysdba' < $tempsql > $backupsh
rm -f $tempsql
chmod +x $backupsh
cp $backupsh .
?
echo "正在生成冷备对应的恢复脚本[$rcvrsh]..."
?
##准备工作
echo "set heading off???? " > $tempsql
echo "set feedback off?? " >>$tempsql
echo "set tab off????????????? " >>$tempsql
echo "set verify off??????? " >>$tempsql
echo "set pagesize 0"?????????? >>$tempsql
echo "set linesize 800??? " >>$tempsql
echo "select '#!/bin/bash' from dual;"????????? >> $tempsql
echo "select ''?????????????????????????? from dual;"????????? >> $tempsql
echo? "select? '##? 恢复脚本生成时间:? "? `date? +%Y 年%m月%d日-%H:%M:%S`? "'
from dual;" >> $tempsql
echo "select '##? 恢复文件所在路径: $backupdir' from dual; "??????? >> $tempsql
echo "select '' from dual; " >> $tempsql
echo ""
echo "select 'echo ''开始进行文件的复制恢复...''' from dual; "??????????????? >> $tempsql
echo "select 'echo ''恢复文件所在的路径: $backupdir ''' from dual; "????? >> $tempsql
?
##这里不直接关闭数据库,提示用户手工关闭为好??? 如果需要直接关闭,请修改
echo "select 'orarun='||'\`'||'ps -ef|grep -c ora_'||'\`' from dual;" >>$tempsql
echo "select 'if [ "\$orarun" != "0" ] && [ "\$orarun" != "1" ]??? ' from dual;" >>$tempsql
echo "select 'then' from dual; " >>$tempsql
echo "select 'echo '' '' ' from dual;" >>$tempsql
echo "select 'echo ''ORACLE 数据库已启动,请先关闭 ORACLE 数据库'' ' from dual;
" >>$tempsql
echo "select 'echo '' '' ' from dual;" >>$tempsql
echo "select 'exit' from dual; "????? >>$tempsql
echo "select 'fi'?????? from dual; "????? >>$tempsql
?
echo "select 'echo '' '' ' from dual; "??? >> $tempsql
echo "select 'echo ''正在恢复控制文件...''' from dual; "??? >> $tempsql
echo????????????? "select?????????????? 'cp????????????? '||'$backupdir'||'/'||substr(name,instr(name,'/',-1)+1,
length(name)-instr(name,'/',-1) )||' '||name from v\$controlfile; "??? >> $tempsql
echo "select 'echo ''控制文件恢复完毕!''' from dual; "??? >> $tempsql
echo "select 'echo '' '' ' from dual; "??? >> $tempsql
echo "select 'echo ''正在恢复数据文件...''' from dual; "??? >> $tempsql
echo????????????? "select?????????????? 'cp????????????? '||'$backupdir'||'/'||substr(name,instr(name,'/',-1)+1,
length(name)-instr(name,'/',-1) )||' '||name from v\$datafile;????? "??? >> $tempsql
echo "select 'echo ''数据文件恢复完毕!''' from dual; "??? >> $tempsql
echo "select 'echo ''正在恢复联机日志...''' from dual; "??? >> $tempsql
echo "select 'echo '' '' ' from dual; "??? >> $tempsql
echo?????????? "select??????????? 'cp?????????? '||'$backupdir'||'/'||substr(member,instr(member,'/',-1)+1,
length(member)-instr(member,'/',-1) )||' '||member from v\$logfile;??????? "??? >> $tempsql
?
echo "select 'echo ''联机日志恢复完毕!''' from dual;"??? >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
echo "select 'echo ''脱机冷备恢复完毕!''' from dual;"??? >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
echo "select 'echo '' '' ' from dual; " >> $tempsql
?
##生成冷备恢复的执行脚本
sqlplus -s ' / as sysdba' < $tempsql > $rcvrsh
?
rm -f $tempsql
chmod +x $rcvrsh
cp $rcvrsh .
?
echo "生成脱机冷备备份与恢复脚本完毕!"
echo "请检查脚本文件: [$backupsh]"
echo "?????????????????????????????????? [$rcvrsh]"
echo ""
?
#如果需要生成后立即执行备份,可增加关闭数据库的操作,然后将以一几行的注
释#去掉即可
#./$backupsh
#echo "备份执行完毕,请检查!"
#echo ""
?
(3)? 重启 Oracle 数据库
$ sqlplus /nolog
SQL> connect /as sysdba
SQL> startup
?
2.如果自从上次脱机冷备后,数据文件错误,联机日志没有被覆盖,可模拟不完全恢复。
1. SQL> shutdown;
2. $ cp .. ..;???????? //? 只恢复出错的数据文件
3. SQL> startup mount;
4. SQL> recover database;
5. SQL> alter database open;
?
?
3.3 ARCHIVELOG 模式
3.3.1? 脱机冷备与恢复
?
同 NONARCHIVELOG模式
?
3.3.2? 联机热备
?
联机热备是在数据库运行的情况下进行备份的方法。热备份要求数据库在 Archivelog
方式下操作,并需要大量的档案空间。
热备份的优点:
1.可在表空间或数据文件级备份,备份时间短。
2.备份时数据库仍可使用,支持 24*7不间断运行。
3.可达到秒级恢复(恢复到某一时间点上)。
4.可对几乎所有数据库实体作恢复。
5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。
热备份的不足是:
1.不能出错,否则后果严重。
2.若热备份不成功,所得结果不可用于时间点的恢复。
3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”。
注意:在热备过程中系统会生成更多的重做日志和回滚数据。所以必须在数据库较
空闲时才进行备份。
备份内容:
(1)? 数据文件:? 一个表空间一个表空间地备份 sql> alter tablespace users begin backup; sql> $copy '/xx/xx.dbf ''/yy/yy.dbf' ; sql> alter tablespace users end backup; sql> alter system checkpoint;
(只读表空间直接拷贝,不用begin backup)
(2)? 备份归档 log文件
(1)临时停止归档进程???? log_archive_max_processes=0
(2)log下那些在 archive redo log 目标目录中的文件
(3)重新启动 archive 进程
(4)备份归档的 redo log? 文件
(3)? 备份联机的控制文件:
sql> alter database backup controlfile to '/xx/xx.ctl';
(4)? 备份初始化文件? 配置文件? 等:
sql> $copy??? .. .. ;
?
热备脚本:hotback.sql
?
Rem? 热备份脚本 for Linux
Rem? 执行该脚本必须保证数据库处于归档模式
Rem db.dw.dm@gmail.com 2007-03-17
?
Rem
Rem? 设置 SQL*Plus环境参数
Rem
?
set feedback off
set pagesize 0
set heading off
set verify off
set linesize 100
set trimspool on
?
Rem? 设置备份相关的路径??? For Linux
Rem? 设置数据文件备份路径
define datafile_dir??? = '/u05/oracle/hotback/datafile'
Rem? 设置归档日志文件备份路径
define archlog_dir = '/u05/oracle/hotback/archlog'
Rem? 设置控制文件备份路径
define controlfile_dir = '/u05/oracle/hotback/controlfile'
?
Rem? 设置生成的备份脚本名
define hotback??? = '/u05/oracle/hotback/open_hot_backup.sql'
define spoolfile = '/u05/oracle/hotback/spool.tmp'
define cpy = 'cp'
prompt *** Spooling to &hotback
?
Rem? 产生备份数据文件、归档日志文件的命令
?
set serveroutput on size 1000000
spool &hotback
prompt spool &spoolfile
?
prompt archive log list;;
prompt alter system switch logfile;;
prompt alter system archive log all;;
?
DECLARE
CURSOR cur_tablespace IS
SELECT tablespace_name
FROM dba_tablespaces
ORDER BY tablespace_name;
?
CURSOR cur_datafile (tn VARCHAR) IS
?
SELECT file_name
FROM dba_data_files
WHERE tablespace_name = tn
ORDER BY file_name;
?
CURSOR cur_arch_dest IS
SELECT value
FROM v$parameter
WHERE??? name = 'log_archive_dest';
BEGIN
FOR ct IN cur_tablespace LOOP
IF ct.tablespace_name!='TEMP' then
dbms_output.put_line ('alter tablespace '||ct.tablespace_name||' begin backup;');
FOR cd IN cur_datafile (ct.tablespace_name) LOOP
dbms_output.put_line ('host &cp y '||cd.file_name||' &datafile_dir');
END LOOP;
dbms_output.put_line ('alter tablespace '||ct.tablespace_name||' end backup;');
end if;
END LOOP;
?
FOR dest IN cur_arch_dest LOOP
dbms_output.put_line ('host &cpy '|| dest.value || '/* &archlog_dir ');
END LOOP;
?
END;
/
Rem? 产生备份控制文件的命令
?
prompt alter system archive log current;;
prompt alter database backup controlfile to trace;;
prompt alter database backup controlfile to '&controlfile_dir/control.bak' REUSE;;
prompt archive log list;;
prompt prompt ***Hot Backup Finish***;
prompt spool off
spool off;
host rm -f &spoolfile
Rem? 执行生成的脚本文件
Rem @&hotback
Rem host del &hotback
?
3.3.3? 联机热备的恢复
?
3.3.3.1完全恢复
?
一般步骤:
1.? 通过以下信息,找到故障数据文件
alert.log
background trace file v$recover_file??????? v$recovery_lo
通过这两个视图可以了解详细的需要恢复的数据文件与需要使用到的归档日志。
2.? 将故障数据文件对应的表空间? offline
SQL> alter tablespace xxx offline;
3. restore and recover
SQL> host cp .. ..;
SQL> [alter database] recover database/tablespace/datafile 'xx';
4.? 将表空间 online
SQL> alter tablespace xxx online;
?
3.3.3.2不完全恢复
?
不完全恢复的方法只能恢复到过去某个时间点/SCN的数据库状态。
一些限制:
1.??? 必要条件
一个有效的? online/offline? 备份(包含所有的数据文件)
自从备份到故障前的所有归档日志
有可能需要控件文件? (所有控件文件丢失,数据库结构已改变) SQL> recover database ... using backup controlfile;
2.? 只能恢复到所有备份数据文件的最大 SCN以后,
3.? 恢复后需要 resetlog,所以需要在恢复后马上备份
三种不完全恢复的方法:
1.??? 基于变化的不完全恢复???? Change-based Recovery
2.??? 基于用户干涉(取消)的不完全恢复????? Cancel-based Recovery
3.??? 基于时间的不完全恢复??? Time-based Recovery
获得信息:
alert.log
可以通过 LogMiner获得精确的时间/SCN,一般在备机上恢复,再 exp/imp到生产机。 查看需要恢复的文件,以及相关的提示信息
SQL> select * from v$recover_file; SQL> select * from v$datafile;
查看二者的 change#,? 确定对应的在 v$log_history 中的范围,从而确定需要那个日志文件序列
设置归档日志文件的路径:? LOG_ARCHIVE_DEST
设置? log? 在不同的路径:
SQL> SET LOGSOURCE 'xx';
SQL> alter system archive log start to 'xx';
恢复步骤:
1.??? 关闭数据库,启动到 MOUNT 状态
SQL> shutdown; SQL> startup mount;
2.??? 恢复数据文件、日志文件、归档日志文件
SQL> host cp .. ..; SQL> archive log list;
SQL> archived log ==>LOG_ARCHIVE_DEST
3.??? 执行恢复命令 基于变化:
SQL> recover database until change 9999;
基于时间:
SQL> revover database until time '2001-12-01 14:02:23' using backup controlfile;
基于取消:
SQL> recover database until cancel;
4.??? 重置日志,恢复后需要马上备份
SQL> alter database open resetlogs;
?
?
3.4? 分类案例
?3.4.1? 控件文件的备份与恢复
?
一、备份
?
1.? 镜像控制文件
手工备份?????? //? 每当数据库结构发生变化时立即备份
1.数据库关闭时,OS命令拷贝。
2.? 联机备份
SQL> alter database backup controlfile to 'ctl.bak'; SQL> alter database backup controlfile to trace;
?
二、恢复
?
1.? 损坏一个控制文件:从镜像拷贝或修改 initSID.ora取消损坏的控制文件。
2.? 损坏所有的控制文件:
利用备份的控制文件恢复,拷贝或在命令中恢复:
SQL> recover database ...using backup controlfile;
手工重建控制文件:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
NOMOUNT状态下执行
SQL> CREATE CONYTROLFILE..; //注意联机日志和数据文件的路径和文件名
SQL> alter database open resetlogs;
?
3.4.2? 联机日志文件的备份与恢复
?
一、备份
?
1.? 镜像在不同的磁盘上。? //如果有镜像备份,不用恢复
2.? 非归档模式下,在数据库关闭时用 OS命令拷贝备份。
3.? 归档模式下,手工或自动归档。 二、恢复??? //? 在恢复后一定要重做备份 丢失日志组成员:
在有多个镜像时,一般不会报错,如果需要恢复,可以先删除再增加。
1.? 删除:??? SQL> alter database drop logfile member 'xx';
2.? 新增:??? SQL> alter database add logfile member 'xx' to group 2;
( 如果丢失当前日志组成员:???? 可以先 alter system switch logfile;? 再进行操作。) 以下恢复方法都是指丢失所有日志组成员的情况下的恢复。
?一、丢失非当前联机日志
1.? 重启数据库到 Mount状态:
2.? 重建丢失的日志:用命令清空日志组的方法
//已归档,重建该日志
SQL> alter database clear logfile group 2;
//归档模式下如果没有归档
SQL> alter database clear unarchived logfile group 2;
二、丢失当前联机日志
1.? 如果数据库正常关闭:
日志中没有未决事务需要实例恢复,同非当前联机日志方法。
2.? 如果是非正常关闭数据库的情况,未决事务需要实例恢复: 如果有备份,可通过备份进行不完全恢复。// until cancel 没有备份,进行强制性恢复????? //? 最后的办法,可能导致数据库的不一致
3.? 如果数据库当前为 Open状态,有活动的事务:
尝试能否 Export 或热备份,如果可以,赶紧备份
检查非当前日志是否正常,可先做 clear,然后尝试是否能 switch log,能
否正常关闭 DB,如果可以 switch log 正常关闭 DB,方法同 1,否则同 2
?
3.4.3? 回滚数据文件的恢复
?
1.? 从可用备份中恢复
非归档模式下的恢复会有数据丢失
归档模式下,有可用备份,可完全恢复(需要关闭数据库)
2.? 没有可用备份时强行恢复:
// offline drop,删除重建。
//? 需要先注释 undo_tablespace,或者重新指定一个系统回滚段表空间,然后再操作
1.? 数据库正常关闭?? 没有未决的事务
1. shutdown,修改 init参数文件,注释 undo_tablespace
2. SQL>startup restrict mount;
3. SQL>alter database datafile 2 offline drop;
4. SQL>alter database open;
5. SQL>drop tablespace xxx including contents;
6.? 重建回滚段表空间
7.??? shutdown,修改 init参数文件,去掉注释设置新的 undo_tablespace
8.??? SQL> alter system disable restricted session;
2.? 非正常关闭??? 强制恢复? 隐含参数:_CORRUPTED_ROLLBACK_SEGMENTS
1. shutdown,修改 init参数文件,删除 undo_tablespace
2. SQL>startup restrict mount;
3. SQL>alter database datafile 2 offline drop;
4. SQL>alter database open;
5. SQL>drop tablespace xxx including contents;
如果出错:回滚段中有活动事务
SQL>drop rollback segment rbs0; rbs1, 2 ...
在第 1步中,加入隐含参数
_CORRUPTED_ROLLBACK_SEGMENTS
= (_SYSSMU1$,_SYSSMU2$,_SYSSMU3$, ...)
6.? 重建回滚段表空间,online
7. shutdown,修改 init参数文件,去掉注释设置新的 undo_tablespace
去掉隐含参数
8.??? SQL>alter system disable restricted session;
?
3.4.5? 临时数据文件的恢复
?
方法:??? 先将用户临时表空间置为其他,然后删除重建
1. SQL> shutdown
2. SQL> startup restrict mount;
3. SQL> alter user xxx temporary tablespace TEMP2;
4. SQL> alter database open;
5. SQL> drop tablespace temp including contents;
6.? 重建临时表空间
7.? 重新分配给各用户
8.?????????? SQL> alter system disable restricted session; 如果是默认的临时表空间,需要先将默认临时表空间置为其他 SQL> alter database default temporary tablespace temp_2;
?
?
RMAN是 ORACLE提供的一个备份与恢复的工具,可以用来备份和还原数据库文件、 归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。
RMAN可以由命令行接口或者 OEM的 Backup Manager GUI 来控制。
4.1 基本知识
4.1.1 RMAN的组件、概念
?
1.? RMAN? 主要包括以下组件:
?
Target Database: (目标数据库)
就是需要? RMAN? 对其进行备份与恢复的数据库,RMAN? 可以备份数据文件,控制文
件,归档日志,spfile。(注意:RMAN不能用于备份联机日志、初始化参数文件和口令文件)
Server Session:??? (服务器会话)
RMAN启动数据库上的 Oracle服务器进程,将建立一个与目标数据库的会话。由目标
数据库上的服务器进程进行备份、还原、恢复的实际操作。
?
服务器进程
?
RMAN? 的服务进程是一个后台进程,用于与 RMAN工具与数据库之间的通信,也用于 RMAN? 工具与磁盘/磁带等? I/O? 设置之间的通信,服务进程负责备份与恢复的所有工作, 在如下情况将产生一个服务进程:
???? 当连接到目标数据库
???? 分配一个新的通道
?
Channel:??? (通道)
?
一个通道是 RMAN和目标数据库之间的一个连接,"allocate channel"命令在目标数据库
启动一个服务器进程,同时必须定义服务器进程执行备份或者恢复操作使用的 I/O类型。
通道控制命令可以用来:
?????? 控制 RMAN使用的 O/S资源,影响并行度
?????? 指定 I/O带宽的限制值(设置 limit read rate 参数)
?????? 定义备份片大小的限制(设置 limit kbytes)
?????? 指定当前打开文件的限制值(设置 limit maxopenfiles)
?
recovery catalog: (恢复目录)
?
用来保存备份与恢复信息的一个数据库,不建议创建在目标数据库上。RMAN? 利用恢 复目录记载的信息去判断如何执行需要的备份恢复操作。
如果不采用恢复目录,备份信息可以存在于目标数据库的 control file 中。
如果存放在目标数据库的? control? file? 中,控件文件会不断增长,不能保存? RMAN? 的
Script。
CONTROL_FILE_RECORD_KEEP_TIME? (default=7):控件文件中? RMAN? 信息保存的
最短时间。
使用恢复目录的优势:? 可以存储脚本,记载较长时间的备份恢复操作。
?
RMAN Repository:??? (RMAN? 恢复目录数据库)
?
存放 recovery catalog(恢复目录)的数据库。建议为恢复目录数据库创建一个单独的数据
库。
?
MML: (媒体管理库)
?
Media Management Layer (MML)是第三方工具或软件,用于管理对磁带的读写与文件的 跟踪管理。如果你想直接通过? RMAN? 备份到磁带上,就必须配置媒体管理层,媒体管理层 的工具如备份软件可以调用 RMAN来进行备份与恢复。
?
2.概念述语
?
Backup Sets (备份集合)
?
备份集合的特性:包括一个或多个数据文件或归档日志,以 oracle专有的格式保存,有 一个完全的所有的备份片集合构成,构成一个完全备份或增量备份。
?
Backup Pieces (备份片)
?
一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大 小是有限制的;如果没有大小的限制,? 备份集就只由一个备份片构成。备份片的大小不能 大于使用的文件系统所支持的文件长度的最大值。
?
Image Copies 镜像备份
?
镜像备份是独立文件(数据文件、归档日志、控制文件)的备份。它很类似操作系统级 的文件备份。它不是备份集或备份片,也没有被压缩。
?
Full backup Sets 全备份集合
?
全备份是一个或多个数据文件中使用过的数据块的的备份。没有使用过的数据块是不被
备份的,也就是说,oracle? 进行备份集合的压缩。
?
Incremental backup sets 增量备份集合
?
增量备份是指备份一个或多个数据文件的自从上一次同一级别的或更低级别的备份以
来被修改过的数据块。? 与完全备份相同,增量备份也进行压缩。
?
File multiplexing
?
多个数据文件可以在一个备份集中。
?
Recovery catalog resyncing? 恢复目录同步
?
使用恢复管理器执行 backup、copy、restore 或者 switch 命令时,恢复目录自动进行更 新,但是有关日志与归档日志信息没有自动记入恢复目录。需要进行目录同步。使用 resync catalog命令进行同步。
RMAN> resync catalog;
?
Incarnation? 对应物
?
在不完全恢复完成之后,通常需要使用? resetlogs? 选项来打开数据库。resetlogs? 表示一个 数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始。数据库的逻辑生存期也被称为 一个对应物(incarnation)。每次使用? resetlogs? 选项来打开数据库后都会创建一个新的数据库 对应物。
4.1.2 RMAN的使用:命令行接口与脚本
?
数据库状态:
RMAN恢复目录数据库:? 必须OPEN
目标数据库:? 根据不同情况,必须MOUNT或OPEN
?
1.? 使用不带恢复目录的 RMAN
?
设置目标数据库的? ORACLE_SID? ,执行:
$ rman nocatalog
RMAN> connect target
RMAN> connect target user/pwd>@db
?
2.? 使用带恢复目录的RMAN
?
$ rman catalogrman/rman
RMAN> connecttarget??? //连接本地数据库作为目标数据库
RMAN> connecttarget user/pwd>@db //连接远程数据库
或
$ rman catalogrman/rman targetuser/pwd>@db
?
3.? 命令行接口
?
1、单个执行
RMAN> backup database;
2、运行一个命令块
RMAN> RUN {
2> copy datafile 10 to
3> '/oracle/prod/backup/prod_10.dbf';
4> }
3、运行存储在恢复目录中的脚本:
RMAN> RUN??? { EXECUTE SCRIPT backup_whole_db };
4、运行外部脚本:
$ rman catalog rman/rman target / @backup_db.rman
$ rman cmdfile=backup.rman msglog=backup.log
RMAN> @backup_db.rman
RMAN> RUN??? { @backup_db.rman }
?
如果在 cron? 中执行,注意在脚本中设置正确的环境变量,例:
#set env
export ORACLE_HOME=/opt/oracle/product/9.2
export ORACLE_SID=test
export NLS_LANG="AMERICAN_AMERICA.zhs16gbk"
export PATH=$PATH:$ORACLE_HOME/bin rman cmdfile=backup_db.rman
?
4.? 使用脚本
?
创建或者取代脚本:
RMAN> create script alloc_disk {
2> # Allocates one disk
3> allocate channel dev1 type disk;
4> setlimit channel dev1 kbytes 2097150 maxopenfiles 32 readrate 200;
5> }
RMAN> replace script rel_disk {
2> # releases disk
3> release channel dev1;
5> }
删除脚本:
RMAN> DELETE SCRIPT Level0Backup;
查看脚本:
RMAN> PRINT SCRIPT Level0Backup;
运行脚本:
RMAN> RUN { EXECUTE SCRIPT backup_whole_db };
?
5.? 运行OS命令
?
RMAN支持通过执行 host命令暂时退出 RMAN的命令提示符而进入到操作系统的命令
环境。
?
6.? 执行SQL语句
?
在? RMAN? 的命令提示符后输入? SQL? 命令,然后在一对单引号(双引号亦可)中输入要
执行的? SQL? 语句,例如:
RMAN> SQL 'ALTER SYSTEM CHECKPOINT';
对于 SELECT语句,无法得到结果。可以先执行 host再用 SQLPLUS。
?
?
4.2 RMAN 的配置
?4.2.1? 建立Recovery Catalog恢复目录
?
(1)? 在目录数据库中创建恢复目录所用表空间:
SQL> create tablespace rman_ts datafile '/xxx/rman_ts.dbf' size 20M;
(2)? 在目录数据库中创建RMAN? 用户并授权:
SQL>? create? user? rman? identified? by? rman? default? tablespace? rman_ts? temporary tablespace temp quota unlimited on rman_ts;
SQL> grant connect, resource, recovery_catalog_ownerto rman;
(3)? 在目录数据库中创建恢复目录
$ rman catalog rman/rman
RMAN> create catalog tablespace rman_ts;
(4)? 登记目标数据库:
一个恢复目录可以注册多个目标数据库,注册目标数据库的命令为:
$ RMAN catalog rman/rman target user/pwd @rcdb; RMAN> register database;
?
4.2.2? 查看RMAN的默认设置SHOW命令
?
必须连接目标数据库
RMAN> show all
RMAN> show channel;????????????????????????????? //? 通道分配 RMAN> show device type;??? // IO 设备类型 RMAN> show retention policy;?????????????? //? 保存策略
RMAN> show datafile backup copies;???? //? 多个备份的拷贝数目 RMAN> show maxsetsize; //? 备份集大小的最大值 RMAN> show exclude;??? //? 不必备份的表空间 RMAN> show backup optimization;???????????????????????????????????????????????? //? 备份的优化
?
4.2.3? 配置RMAN的默认设置
?
1.? 配置备份集文件的格式? (format)
?
RMAN> configure channel device type disk format'/u05/oracle/rmanback/%U';
备份文件可以自定义各种各样的格式,如下
%c? 备份片的拷贝数
%d? 数据库名称
%D? 位于该月中的第几天? (DD)
%M? 位于该年中的第几月? (MM)
%F? 一个基于? DBID? 唯一的名称,这个格式的形式为? c-IIIIIIIIII-YYYYMMDD-QQ,
其中 IIIIIIIIII? 为该数据库的 DBID,YYYYMMDD? 为日期,QQ? 是一个? 1-256? 的
?
序列
%n? 数据库名称,向右填补到最大八个字符
%u? 一个八个字符的名称代表备份集与创建时间
%p? 该备份集中的备份片号,从 1? 开始到创建的文件数
%U? 一个唯一的文件名,代表%u_%p_%c
%s? 备份集的号
%t? 备份集时间戳
%T? 年月日格式(YYYYMMDD)
?
2.? 配置默认 IO设备类型???????? ( device type )
?
IO? 设备类型可以是磁盘或者磁带,在默认的情况下是磁盘,可以通过如下的命令 进行重新配置。
RMAN> configure default device t ype to disk; RMAN> configure default device t ype to sbt;
注意,如果换了一种 IO? 设备,相应的配置也需要做修改,如
RMAN> configure device type sbt parallelism 2;
?
3.? 配置自动分配的通道??? ( Chanel )
?
RMAN> configure channel device type disk format
'/U01/ORACLE/BACKUP/%U
在运行块中,手工指定通道分配,这样的话,将取代默认的通道分配。
RMAN> Run {
allocate channel cq type disk format='/u01/backup/%u.bak';
…
}
通道的一些特性:
读的速率限制???????????????????????????????????? Allocate channel ……rate = integer 最大备份片大小限制???????? Allocate channel …… maxpiecesize = integer 最大并发打开文件数(默认 16)? Allocate channel …… maxopenfile = integer
4.? 配置默认的保存策略? ( Retention Policy)
?
保存策略是管理备份与副本有效期或者是否有效的一种方法。恢复数据库的时候
Oracle? 不 考 虑 失效 的 备 份。我 们可 以 定 义 两 种 保存 策 略: 恢复 窗口 备份 保存 策 略
(recovery window? backup? retention policy? )和冗余备份保存策略(redundancy backup retention policy? )
备份策略保持???? 分为两个保持策略: 一个是时间策略,决定至少有一个备份能恢复到指定的日期 一个冗余策略,规定至少有几个冗余的备份。 恢复窗口备份保存策略
这种保存策略类型的使用基于数据库可能恢复到的最早的日期。? 例如,假设今天 是星期一,此前存在? 3? 个备份。第一个备份在昨天生成的,第二个备份是上星期四生 成的,而最后一个备份是? 10? 天前备份的。假如恢复窗口是? 7? 天,那么昨天和上星期 四的备份是有效备份,而? 10? 天前的备份会成为废弃备份。下面的命令将恢复窗口配置为 7 天:
RMAN> configure retention policy to recovery window of 7 days;
冗余备份保存策略
使用这种保存策略,RMAN??? 会从最新备份开是保留? N? 个数据备份,其余的废弃。 例如,如果有四个备份,而冗余数是? 3,那么最早的那个备份将被废弃。下面的命令将 备份策略设置为? 3:
RMAN> configure retention policy to redundancy3;
设置 NONE可以把使备份保持策略失效,Clear? 将恢复默认的保持策略
RMAN> configure retention policy to none;
例:
保 证 至 少有一 个 备份 能 恢复 到? Sysdate-5???? 的时 间点 上, 之 前 的备份将 标 记 为
Obsolete
RMAN> configure retention policy to recovery window of 5 days;
至少需要有三个冗余的备份存在,如果多余三个备份以上的备份将标记为冗余
RMAN> configure retention policy to redundancy 5;
?
5.? 配置多个备份的拷贝数目( backup copies )
?
如果觉得单个备份集不放心,可以设置多个备份集的拷贝,如: RMAN> configure datafile backup copies for device type disk to 2; RMAN> configure archivelogbackup copies for device type disk to 2;
如果指定了多个拷贝,可以在通道配置或者备份配置中指定多个拷贝地点:
RMAN> configure channel device type disk format
'/u01/backup/%U', '/u02/backup/%U';
RMAN> backup datafile n format '/u01/backup/%U', '/u02/backup/%U';
?
6.? 设置并行备份( ARALLELISM )
?
RMAN支持并行备份与恢复,也可以在配置中指定默认的并行程度。如:
RMAN> configure device type disk parallelism 4;
指定在以后的备份与恢复中,将采用并行度为 4,同时开启 4个通道进行备份与恢 复,当然也可以在 RUN的运行块中手工分配多个通道来决定备份与恢复的并行程度。 并行的数目决定了开启通道的个数。如果指定了通道配置,将采用指定的通道,如果没 有指定通道,将采用默认通道配置。
还可以在 BACKUP命令中使用指定 FILESPERSET 或者指定(datafile? 1,4,5? channel c1 tag=DF1)(datafile 2,3,6 channel c2 tag=DF2)
?
7.? 设置控制文件自动备份? (autobackup on)
?
通过如下的命令,可以设置控制文件的自动备份
RMAN> configure controlfile autobackup on;
对于没有恢复目录的备份策略来说,这个特性是特别有效的,控制文件的自动备份
发生在任何 backup? 或者 copy? 命令之后,或者任何数据库的结构改变之后。
可以用如下的配置指定控制文件的备份路径与格式
RMAN> configure controlfile autobackup format for type disk to '%f';
?
在备份期间,将产生一个控制文件的快照,用于控制文件的读一致性,如下配置:
RMAN> configure snapshot controlfile name to
'/u01/app/oracle/produ