日期:2014-05-16  浏览次数:20677 次

linux 下oracle 11G定时备份数据库
假设数据库的拥有者为oracle,数据库的用户为tpm
Oracle数据库的参数$ORACLE_HOME为/usr/oracle,$ORACLE_SID为oracle1,则实现步骤如下:

1、建立实现备份的shell
在/data/app/oracle/product/11.2.0/dbhome_1/中用vi命令建立文件orcl_tpm_backup.sh,其内容为:
#ORACLE_HOME=/usr/oracle;
#export ORACLE_HOME;
#ORACLE_SID=oracle1;
#export ORACLE_SID;

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORACLE_HOME=/data/app/oracle/product/11.2.0/dbhome_1;

D=tpm_$(date +%Y%m%d);
export D;
$ORACLE_HOME/bin/exp expdb/expdb file=$ORACLE_HOME/backup_tpm/${D}.dmp owner=tpm compress=n
buffer=65536 feedback=100000 log=$ORACLE_HOME/backup_tpm/tpm_exp.log;

注意先以sys的dba的权限登录数据库赋予expdb用户下面的权限
grant exp_full_database to expdb;
grant imp_full_database to expdb;

注意:这里D=$(date +%y%m%d); 是确保你每个备份文件以日期名字.例如:060814.dmp 060815.dmp
如果想每天把备份文件覆盖那么把 ${D}.dmp 这里用固定的名字例如: backup.dmp

使用chmod命令修改backup.sh的属性为可执行:
chmod +x backup.sh
到此,具有备份功能的可执行文件(shell)backup.sh已经建成。其执行结果是将scott所拥有的ORACLE对象备份到/usr/oracle中的backup.dmp中,读者可以直接运行它来看看效

果。值得注意的是,backup.sh中Oracle的两个环境参数一定要声明,否则系统会报错。下一步将开始建立oracle用户的Crontab文件。

2、查看Crontab的使用权限
使用超级用户(root)的身份登录,在/usr/var/adm/cron下通过vi命令查看cron.deny文件,如果数据库的拥有者oracle被列在里面,将其删除即可。

3、建立oracle的Crontab文件
用oracle用户登录,通过使用命令crontab –e oracle开始建立oracle用户的Crontab文件。其内容为:
00 23 * * 1-5 "/data/app/oracle/product/11.2.0/dbhome_1/backup.sh"

前面5个参数的意义:
0~59 表示分
1~23 表示小时
1~31 表示日
1~12 表示月份
0~6 表示星期(其中0表示星期日)

存盘退出后,你会发现在/var/spool/cron/crontabs中新增了一个名为oracle文件,其作用是在周一至周五每天的23:00运行

“/data/app/oracle/product/11.2.0/dbhome_1/backup.sh”。

到此大功告成,系统会将每次备份的信息通过mail的形式发送给oracle用户。
在进行以上操作时,建议将/var/spool/cron/crontabs中其他用户(尤其是root)的Crontab文件进行备份,以免误操作对系统产生影响。


4. 数据库用户的恢复
sqlplus /nolog
conn sys/system@orcl as sysdba;

drop user tpm cascade; 或者不删除用户都可以,也可以删除部分表,根据具体情况定,请注意当设置ignore=y时,如果表没有主键会导入重复数据
create user tpm identified by tpm default tablespace tpm;
grant connect, resource to tpm;

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

imp expdb/expdb fromuser=tpm touser=tpm file=$ORACLE_HOME/backup_tpm/tpm_20110927.dmp commit=y feedback=10000 buffer=10240000 ignore=y
log=$ORACLE_HOME/backup_tpm/tpm_imp.log;


另:
若直接备份到磁带设备,使用如下命令:
exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536 feedback=100000 volsize=0 file=/dev/rmt0 log=exp.log

若从磁带设备恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0 log=imp.log

恢复备份数据中的指定表:
若从本地文件恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n file=exp.dmp log=imp.log tables=t1,t2,t3;
若从磁带设备恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0 
log=imp.log tables=t1,t2,t3

参数说明:

ignore参数
       Oracle在恢复数据的过程中,当恢复某个表时,该表已经存在,就要根据ignore参数的设置来决定如何操作。
       若ignore=y,Oracle不执行CREATE TABLE语句,直接将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,则出错的记录不会插入,但合法的记录会添加到

表中。
      若ignore=n,Oracle不执行CREATE TABLE语句,同时也不会将数据插入到表中,而是忽略该表的错误,继续恢复下一个表。 -

indexes参数
       在恢复数据的过程中,若indexes=n,则表上的索引不会被恢复,但是主键对应的唯一索引将无条件恢复,这是为了保证数据的完整性。

字符集转换
       对于单字节字符集(例如US7ASCII),恢复时,数据库自动转换为该会话的字符集(NLS_LANG参数);
       对于多字节字符集(例如ZHS16CGB231280),恢复时,应尽量使字符集相同(避免转换),如果要转换,目标数据库的字符集应是输出数据库字符集的超集。

IMP 常见问题及解决方法:

数据库对象已经存在
      一般情况, 导入