Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1245547
  • 博文数量: 1211
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 14340
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-09 11:20
文章分类

全部博文(1211)

文章存档

2011年(1)

2008年(1210)

我的朋友

分类: 服务器与存储

2008-06-12 22:58:28

简单的按照备份进行的方式,可以分为逻辑备份、冷备份(脱机备份)、热备份(联机备份),其实冷备份与热备份又可以合称为物理备份

  按照备份的工具,可以分为EXP/IMP备份、OS拷贝、RMAN、第三方工具,如VERITAS

  以下我们将从多个角度来说明以上的各种备份方式  

   1、EXP/IMP逻辑备份

  导入/导出是ORACLE幸存的最古老的两个命令行工具了,其实我从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理冲突等中有不小的功劳。当然,我们也可以把它作为小型数据库的物理备份后的一个逻辑辅助备份,也是不错的建议。  

  对于越来越大的数据库,特别是TB级数据库和越来越多数据仓库的出现,EXP/IMP越来越力不从心了,这个时候,数据库的备份都转向了RMAN和第三方工具。下面我们还是简要介绍一下EXP/IMP的使用。

  i、使用方法

  Exp parameter_name=value

  Or Exp parameter_name=(value1,value2……)

  只要输入参数help=y就可以看到所有帮助

  如:

  C:\\>set nls_lang=simplified chinese_china.zhs16gbk

  C:\\>exp -help

  Export: Release 8.1.6.0.0 - Production on 星期四 4月 10 19:09:21 2003

  (c) Copyright 1999 Oracle Corporation. All rights reserved.  

  通过输入 EXP 命令和用户名/口令,您可以

  在用户 / 口令之后的命令:  

  实例: EXP SCOTT/TIGER

  或者,您也可以通过输入跟有各种参数的 EXP 命令来控制“导出”的运行方式。

  要指定参数,您可以使用关键字:  

  格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)

  实例: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)

  或 TABLES=(T1: P1,T1: P2),如果 T1 是分区表

  USERID 必须是命令行中的第一个参数。

  关键字 说明(默认)    关键字   说明(默认)

  --------------------------------------------------------------------------

  USERID  用户名/口令      FULL     导出整个文件 (N)

  BUFFER  数据缓冲区的大小     OWNER    所有者用户名列表

  FILE   输出文件 (EXPDAT.DMP)  TABLES    表名列表

  COMPRESS 导入一个范围 (Y)  RECORDLENGTH IO 记录的长度

  GRANTS 导出权限 (Y)      INCTYPE   增量导出类型

  INDEXES 导出索引 (Y)      RECORD    跟踪增量导出 (Y)

  ROWS  导出数据行 (Y)     PARFILE   参数文件名

  CONSTRAINTS 导出限制 (Y)  CONSISTENT  交叉表一致性

  LOG   输出的日志文件  STATISTICS 分析对象 (ESTIMATE)

  DIRECT  直接路径 (N)       TRIGGERS   导出触发器 (Y)

  FEEDBACK 显示每 x 行 (0) 的进度

  FILESIZE 各转储文件的最大尺寸

  QUERY  选定导出表子集的子句

  

  下列关键字仅用于可传输的表空间

  TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)

  TABLESPACES 将传输的表空间列表

  在没有警告的情况下成功终止导出。

  C:\\>

  帮助已经很详细的说明了参数的意义和使用方法,并列举了几个简单的例子,注意的是,从8i开始,已经开始支持数据子集的方法,就是可以指定自己的Where条件,可以从表中导出一行或多行数据。  

  注意上面的set nls_lang=simplified chinese_china.zhs16gbk,通过设置环境变量,可以让exp的帮助以中文显示,如果set nls_lang=American_america.字符集,那么你的帮助就是英文的了。

  增量和累计导出必须在全库方式下才有效,而且,大多数情况下,增量和累计导出并没有想象中的那么有效。ORACLE从9i开始,不再支持增量导出和累计导出。  

  ii、表空间传输

  表空间传输是8i新增加的一种快速在数据库间移动数据的一种办法,是把一个数据库上的格式数据文件附加到另外一个数据库中,而不是把数据导出成Dmp文件,这在有些时候是非常管用的,因为传输表空间移动数据就象复制文件一样快。

  关于传输表空间有一些规则,即:

  

  •源数据库和目标数据库必须运行在相同的平台上。

  •源数据库与目标数据库必须使用相同的字符集。

  •源数据库与目标数据库一定要有相同大小的数据块(9i已经不用)

  •目标数据库不能有与迁移表空间同名的表空间

  •SYS的对象不能迁移

  •必须传输自包含的对象集

  •有一些对象,如物化视图,基于函数的索引等不能被传输  

  可以用以下的方法来检测一个表空间或一套表空间是否符合传输标准:

  exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);

  select * from sys.transport_set_violation;

  如果没有行选择,表示该表空间只包含表数据,并且是自包含的。对于有些非自包含的表空间,如数据表空间和索引表空间,可以一起传输。  

  以下为简要使用步骤,如果想参考详细使用方法,也可以参考ORACLE联机帮助。

  a.设置表空间为只读(假定表空间名字为APP_Data 和APP_Index)

  alter tablespace app_data read only;

  alter tablespace app_index read only;

  b.发出EXP命令

  SQL>host exp userid=”””sys/password as sysdba”””

  transport_tablespace=y tablespace=(app_data, app_index)

  以上需要注意的是

  •为了在SQL中执行EXP,USERID必须用三个引号,在UNIX中也必须注意避免“/”的使用

  •在816和以后,必须使用sysdba才能操作

  •这个命令在SQL中必须放置在一行(这里是因为显示问题放在了两行)

  c.拷贝数据文件到另一个地点,即目标数据库

  可以是cp(unix)或copy(windows)或通过ftp传输文件(一定要在bin方式)

  d.把本地的表空间设置为读写

  e.在目标数据库附加该数据文件

  imp file=expdat.dmp userid=”””sys/password as sysdba”””

  transport_tablespace=y

  “datafile=(c:\\temp\\app_data,c:\\temp\\app_index)”

  f.设置目标数据库表空间为读写

  alter tablespace app_data read write;

  alter tablespace app_index read write;  

  iii、导出/导入与字符集

  明白ORACLE的多国语言设置,ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示,货币形式,排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的显示等有效。ORACLE的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据(如文本)时候的编码规则。正如刚才上面的一个小例子,环境变量NLS_LANG的不同,导致EXP帮助发生变化,这就是多国语言设置的作用(NLS_LANG包含国家语言设置与字符集设置,这里起作用的是国家语言设置,而不是字符集)。  

  ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,字符集在创建数据库的时候设定,并保存在数据库props$表中,对于8i以上产品,已经可以采用“Alter database character set 字符集”来修改数据库的字符集,但也仅仅是从子集到超集,不要通过update props$来修改字符集,如果是不支持的转换,可能会失去所有与字符集有关的数据,就是支持的转换,也可能导致数据库的不正常工作。字符集分为单字节字符集与多字节字符集,US7ASCII就是典型的单字节字符集,在这种字符集中length=lengthb,而ZHS16GBK就是常用的双字节字符集,在这里lengthb=2*length。  

  在客户端的字符集环境比较简单,主要就是环境变量或注册表项NLS_LANG,注意NLS_LANG的优先级别为:参数文件à注册表à环境变量àalter session。NLS_LANG的组成为“国家语言设置.字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客户端的字符集最好与数据库端一样(国家语言设置可以不一样,如zhs16gbk的字符集,客户端可以是nls_lang =simplified chinese_china.zhs16gbk或Ameircan_America.zhs16gbk,都不影响数据库字符的正常显示),如果字符集不一样,而且字符集的转换也不兼容,那么客户端的数据显示与导出/导入的与字符集有关的数据将都是乱码。  

  使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个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

  把852换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。(注意,十进制数与十六进制之间的转换,想明白其中的道理)  

  iv、跨版本使用Exp/Imp

  Exp/Imp很多时候,可以跨版本使用,如在版本7与版本8之间导出导入数据,但这样做必须选择正确的版本,规则为:

  •总是使用IMP的版本匹配数据库的版本,如果要导入到816,则使用816的导入工具。

  •总是使用EXP的版本匹配两个数据库中低的那个版本,如在815与816之间互导,则使用815的EXP工具。  

   2.备份RMAN数据库

  RMAN自己的数据库也需要备份,但是本身很小,而且不是经常发生变化,所以在每次RMAN备份完成后,都可以用如下脚本对RMAN数据库备份。

  EXP pafile =exprman.sql

  exprman.sql为

  USERID=RMAN/RMAN

  BUFFER=32768

  OWNER=RMAN

  FILE=RMAN.DMP

  ROWS=Y

  GRANTS=Y

  COMPRESS=Y

  CONSISTENT=Y  

  3.使自动备份数据库

  自动备份数据库不外乎以下三种方式

  WINDOWS下的任务计划(At命令)

  UNIX下的Crontab

  第三方工具如Viritas

  在以上三种方式中Viritas属于第三方工具,很多人可能都没有接触,主要说一下windows的任务计划与unix的cron

  i、生成脚本文件,如backup.rcv

  假定文件内容如下:

  $>cat backup.rcv

  connect target sys/password rcvcat rman/rman@localname;

  run{

  allocate channel c1 type disk;

  allocate channel c2 type disk;

  allocate channel c3 type disk;

  backup fileaperset 3 format ‘/u01/oradata/backup/arch%u_%s_%p’

  archivelog all delete input;

  release channel c1;

  release channel c2;

  release channel c3;

  }

  ii、生成执行文件

  在windows上生成backup_archive.bat,内容包括

  rman cmdfile = backup.rcv

  在unix下生成 backup_archive.sh,内容包括

  /oracle/ramn/rman cmdfile = backup.rcv

  iii、加入调度

  在windows中用任务计划向导即可,或使用at命令。

  在unix中,在目标机器上编写一个文件,用以启动自动备份进程。假定文件名为ORACLE,文件将放在/var/spool/cron/crontabs目录下

  $>cat oracle

  0 23 * * 0 backup_archive.sh

  #表示星期天23点对数据库备份

  0 12,18 * * * backup_archive.sh

  #表示每天12点,18点备份

  Crontab文件的每一行由六个域(minutes,hours,day of month,month,day of week,command)组成,域之间用空格或Tab分隔开来  

  常见误区

  1、使用EXP/IMP备份

  EXP/IMP不是一个良好的备份工具,在以后的发展之中,ORACLE对EXP/IMP用于备份的支持会越来越低。ORACLE只是把EXP/IMP当作一个好的工具而不是备份工具,在对于大型数据库,如TB级数据库或数据仓库,EXP/IMP肯定会力不从心。  

  2、在应用程序中备份数据库

  在论坛上,有很多这样的要求,“我怎么在程序中备份与恢复数据库?”。首先说,这个并不是不可以实现,但是实现的过程会很复杂而且意外会很多。就我的感觉,提出这样问题的人,首先一点就是对ORACLE或DBA的不了解,如果ORACLE可以这么轻松的实现备份与恢复,那么我可以说,就不需要DBA了。  

  3、冷备份比热备份更容易,效果会更好

  有人认为,冷备份是关闭数据库进行的一致性备份,肯定比热备份要好,使用也容易,其实不尽然,在热备份中,一样可以实现数据库的全备份,而且不会影响到数据库的运行。建议所有的生产机,都运行在归档方式下,采用热备份方式。  

  常见问题

  1、我导出的数据为什么不能导入,提示不支持的字符集转换

  答:参考上面的字符集原则,导出数据时客户端与数据库字符集一致,导入时修改为与目标数据库字符集一致。  

  2、我的归档日志越来越多,我什么时候可以删除归档日志?

  答:在每一次全备份(如OS全冷备份或全热备份)或基于全备份的增量备份(如RMAN基于0级备份上的增量备份)后都可以删除该备份点之前的归档日志,建议在上保留一年。  

  3、全备份时一定需要备份所有数据文件吗?

  答:不需要,起码有两类数据文件可以不备份,一类就是临时数据文件,如果丢失,可以删除后重建;一类是只读表空间数据文件,如果上次备份以来,没有修改过表空间的只读属性,就可以不需要备份。  

  4、联机日志需要备份吗?

  答:如果是归档方式热备份,就没有必要备份联机日志。但是对于冷备份,可以备份联机日志,特别是不归档状态。备份过联机日志后的冷备份,因为数据库是一致的,可以恢复到该备份点。  

  小结

  1、什么是数据库备份,数据库备份就是把数据库复制到转储设备的过程。

  2、数据库的运行方式,可以分为归档方式和非归档方式,建议运行在归档方式下运行热备份。

  3、了解了数据库的备份方式,逻辑备份、冷备份、热备份

  4、了解数据库的备份工具,EXP/IMP执行逻辑备份,OS脚本可以执行冷备份或热备份,RMAN也可以执行冷备份或热备份

  5、了解ORACLE的备份策略,并怎样选择最佳的备份策略

  6、知道怎么样启动自动备份,了解Windows的at命令与unix的cron进程。
阅读(282) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~