oracle冷备份与热备份

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、冷备份
1、关闭数据库
sqlplus /nolog
sql>connect /as sysdba
sql>shutdown normal;
2、用拷贝命令cp备份全部的时间文件、重做日志文件、控制文件、初始化参数文件
sql>cp;;
3、重启Oracle数据库
sql>startup

二、热备份
热备份是数据库运行下采用archivelog mode方式备份数据库的方法,热备要求数据库再archivelog方式下操作需要大量的档案空间。
1、数据文件按照表空间分别备份
1.1、设置表空间为备份状态
1.2、备份表空间的数据文件
1.3、恢复表空间为正常状态

2、备份归档log文件
2.1、临时停止归档进程
2.2、log下那些在archive rede log目标目录中的文件
2.3、重新启动archive进程
2.4、备份归档的redo log文件

3、用alter database backup controlfile命令来备份控制文件

三、提高oracle备份速度
1、发布命令启动跟踪机制:
sql>alter database enable block change tracking using file '/oracle10g/rman/change.log';
该命令创建change.log的二进制文件用于跟踪block变化(增量变化备份)
2、如果跟踪文件丢失,则会做全库扫描
以后增量也会做全库扫描,唯一的解决办法,就是重新执行全被,最后再增量备份。

exp/imp导出与导入/装载数据库与卸载数据库
一、基本命令
1、获取帮助
$exp help=y
$imp help=y

2、三种工作方式
2.1交互式
$exp //然后按照提示输入所需参数

2.2命令行式
$exp user/pwd@dbname file =/oracle/test.dmp full=y //命令行中输入所需的参数

2.3参数文件式
$exp parfile=username.par //在参数文件中输入所需的参数
参数文件username.par内容:userid=username/userpassword buffer=8192000 compress=n grants=y file=/oracle/test.dmp full=y

3、三种模式备份
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

3.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.3、全库方式,将数据库中的所有对象导出/导入
导出:$exp user/pwd file=/dir/xxx.dmp log=xxx.log full=y commit=y ignore=y
导入:$imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2

4、高级选项参数
4.1、分割成多个文件导出/导入
导出:$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

4.2、增量导出/导入 //oracle 9i后exp不再支持inctype必须为sys或system才可执行增量导出/导入
完全增量导出,备份整个数据库:$exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
增量型导出,导出上一次备份后改变的数据:$exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental
累计型导出,导出上次完全导出后数据库中变化的信息:$exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative
增量导入:$imp user/pwd full=y inctype=system/restore/inctype //其中system:导入系统对象 restore:导入所有用户对象

5、以sysdba进行导出/导入
例:$imp \'user/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)"

6、表空间传输
传输规则:源数据库与目标数据库必须运行在相同的硬件平台上,使用相同字符集,数据块大小一定相同,目标数据库不能有与迁移表空间同名的,sys的对象不能迁移,传输自包含的对象集
物化视图,基于函数的索引等不能被传输

6.1、检测一个表空间是否符合传输标准的方法:
sql>exec sys.dbms_tts.transport_set_check('tablespace_name',true);
sql>select * from sys.transport_set_violations;
如果没有行选择,表示该表空间只包含表数据并且是自包含的。对于有些非自包含的表空间,如数据表空间和索引表空间可以一起传输

7、表空间传输的步骤
7.1、设置表空间为只读(表空间名字假定为app_data和app_index)
sql>alter tablespace app_data read only;
sql>alter tablespace app_index read only;

7.2、发出exp命令
sql>host exp userid="""sys/password as sysdba""" transport_tablespace=y tablespaces=(app_data,app_index)
注意:为了在sql中执行exp,userID 必须用三个引号,在unix中避免"/"的使用,命令必须放置在一行

7.3、拷贝cp
dbf数据文件以及dmp文件到另一个地点,即目标数据库可以是cp(unix)或copy(windows)或通过ftp传输文件

7.4、把本地表空间设置为读写
$alter tablespace app_data read write;
$alter tablespace app_index read write;

7.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

7.6、设置目标数据库表空间为读写
$alter tablespace app_data read write;
$alter tablespace app_index read write;

8、优化速度
8.1、加快exp速度
加大

large_pool_size可以提高exp的速度,采用直接路径的方式(direct=y),数据不需要经过内存进行整合和检查。设置较大的buffer,导出大对象,小buffer会失败。
export文件不在oracle使用的驱动器上,不要export到nfs文件系统。
unix环境:使用管道符|直接导入导出来提高imp/exp的性能

8.2、加快imp速度
建立一个indexfile,在数据import完成后在建立索引将import文件放在不同的驱动器上增加db_block_buffers增加log_buffer
用非归档方式运行oracle:alter database noarchivelog;建立大的表空间和回滚段,offline其他回滚段,回滚段的大小为最大表的1/2使用commit=N 使用analyze=N
单用户模式导入
unix环境:用管道模式直接导入导出来提高imp/exp的性能

8.3、通过unix/linux PIPE管道加快exp/imp速度
通过管道导出数据:1、通过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/news/test.pipe > bitmap.dmp.gz
3、导出成功后删除建立的管道
$rm -rf /home/exppip
导出脚本:
#####unxi下oracle数据库通过pipe管道进行备份
#####using "export" and "tar" command to bakup oracle database ######
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
chomod a+rw exp.pipe
#gain the dmp.Z file
compress< exp.pipe >exp.dmp.Z &
su -u oracle -c "exp userid=||/|| 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 -rf /home/exppipe

8.4、全库导入的一般步骤:
注意:在导出时,需要通过toad或其他工具提取源数据库创建主键和索引的脚本
8.4.1、先全库加rows=n把结构导进去
$imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n

8.4.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||' disa

ble;' from user_triggers;
/spool off
@drop_pk_u.sql
@disable_trigger.sql

8.4.3、以ignore=y全库导入
$imp system/manager file=exp.dmp log=imp.log full=y ignore=y

8.4.4、通过toad或其他工具提取源数据库创建主键和索引的脚本,在目标数据库中创建主键和索引并使触发器生效。

9、导入/导出常见问题
9.1、字符集问题:
国家语言设置与字符集设置:国家语言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据时候的编码规则。
oracle字符集设定分为数据库字符集和客户端字符集环境设置。在数据库端字符集在创建库的时候设定,并保存在数据库props$表中。客户端的字符集是环境变量或注册表项NLS_LANG。
注意:NLS_LANG的优先级:参数文件<注册表<环境变量
小技巧使不同的字符集在数据库上转换数据:
使用uedit32用编辑方式打开导出的dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进纸,为1,使用函数NLS_CHARSET_NAME即可获得该字符集:
sql>select nls_charset_name(1) from dual; 显示查询结果为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文件字符集转换为zhs16gbk的转化,这样再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。

9.2、版本问题:
imp和exp版本不能向上兼容,imp可以导入低版本exp生成的文件,不嗯给你导入高版本exp生成的文件。

10、使用rman恢复数据
首先要有备份:
RMAN>backup database fomat '/u01/app/oracle/full_%U'等等
查看备份:
RMAN>list backup;
恢复到某一时间点的数据:(各类恢复方式在备份word文档rman恢复篇)
RMAN>shutdown immediate;
RMAN>startup mount;
RMAN>restore database until time "to_date('2017-04-20 13:40:00','yyyy-mm-dd hh24:mi:ss')";
RMAN>recover database until time "to_date('2017-04-20 13:40:00','yyyy-mm-dd hh24:mi:ss')";
RMAN>alter database open resetlogs;

按照控制文件时间恢复--有问题待定
run{
restore controlfile to '/u01/app/oracle/control_auto_c-2206211967-20170517-02' from autobackup;
restore database;
recover database;}

10.1、表空间的数据文件损坏,但存放盘没坏:
通过恢复表空间即可解决问题,以system表空间为例:
run{
startup force mount;
restore tablespace system;
recover tablespace system;
alter database open;}

10.2、表空间单个数据文件所在存放盘损坏:
这种情况

下,只能另找地方恢复和存放数据文件了,以system表空间为例:
run{
startup force mount;
set newname for datafile 1 to '/u01/app/oracle/oradata/xcldb/system01.dbf';
restore datafile 1;
switch datafile 1;
recover datafile 1;
alter database open;}
这种方法与sqlplus采用alter database create datafile与rename file 方法差不多,但rman可以处理任意表空间的数据文件恢复。

10.3、close状态下,所有表空间数据文件存放盘都坏了:
run{
startup force mount;
set newname for datafile 1 to '/u01/app/oracle/oradata/xcldb/system01.dbf';
...--列出要更改存放路径并恢复的所有数据文件
restore database;
switch datafile all;
recover database;
alter database open;}
注:这种技巧不只可用在这种情况下,在异机重定向恢复或单实例与RAC互转时也有用。

10.4、在数据库open状态下,有数据文件损坏,报ORA-00376:此时无法读取文件XXX报错
a.磁盘没坏,但是某个数据文件坏了:
run{
sql 'alter database datafile xxx offline';
restore datafile xxx;
recover datafile xxx;
sql 'alter database datafile xxx online';}

b.数据文件所在磁盘都坏了:
run{
sql 'alter database datafile xxx offline';
set newname for datafile xxx to '/u01/app/oracle/oradata/xcldb/system01.dbf';
restore datafile xxx;
switch datafile xxx;
recover datafile xxx;
sql 'alter database datafile xxx online';}
上面几种情况中,不管数据库open状态下的恢复与close状态下,差别就是open状态下在恢复数据前要设数据文件为离线状态,恢复后还原online状态。
system类特殊的表空间要在mount状态下才能恢复。
只要归档齐全,上面几种情况都可以恢复,这种恢复不用太在意损坏前数据文件有没有做过rman备份,只要有归档日志就可以重演出来。

相关文档
最新文档