Oracle 11g 数据库备份和恢复 —— 筑梦之路

准备工作:

#创建脚本中需要的逻辑目录
sqlplus sys as sysdba

create directory dmp_dir as '/u01/11g/datapump';

#给其他用户授权
grant read,write on directory dmp_dir to system;

#创建物理目录
mkdir /u01/11g/datapump

#给目录授权
chown oracle:oinstall /u01/11g/datapump



备份脚本:

#!/bin/bash
#:本脚本自动备份5天的数据库,每次备份完成后,删除5天之前的数据。
#加载oracle的相关参数,根据实际情况修改
#如果oracle参数不明确,请使用命令查看
# su - oracle
# echo $ORACLE_HOME
export ORACLE_BASE=/u01/11g
export ORACLE_HOME=/u01/11g/product/11.2.0
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin
#oracle字符集
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
#ORACLE_HOME
#ORACLE_HOME=/u01/11g/product/11.2.0
#获取当前时间,格式:20150210
DATE=$(date +%Y%m%d)
#删除5天前的文件
days=5
#执行备份的用户
bakuser=TEST
#执行备份的用户密码
bakuserpass=TEST
#服务器IP
IP=192.168.0.1
#dumpfilename
dumpfilename=$bakuser"_"$DATE
#设置备份目录
export backup_dir=/u01/11g/datapump
#开始备份,此处采用expdp数据方式导出
echo "start oracle backup ..."
#echo $ORACLE_HOME/bin/expdp $bakuser/$bakuserpass schemas=$bakuser dumpfile=$dumpfilename.dmp directory=DPDATA logfile=$dumpfilename.log
#指定用户,使用用户的账户
$ORACLE_HOME/bin/expdp $bakuser/$bakuserpass@$IP/orcl schemas=$bakuser dumpfile=$dumpfilename.dmp directory=dmp_dir logfile=$dumpfilename.log
#指定用户,使用sys用户
#expdp \'sys/oracle@$IP/orcl as sysdba\' schemas=$bakuser dumpfile=$dumpfilename.dmp directory=dmp_dir logfile=$dumpfilename.log
#全量备份
#expdp \'sys/oracle@orcl as sysdba\' full=y dumpfile=$dumpfilename.dmp directory=dmp_dir logfile=$dumpfilename.log

echo 'Oracle backup successfully.'
#开始压缩
cd $backup_dir
echo "开始压缩..."
tar -czf $dumpfilename.tar.gz $dumpfilename.dmp
echo "压缩完毕"
#删除.dmp文件
rm -rf $dumpfilename.dmp
#删除1天前的备份文件
echo 'remove files one day ago...'
find $backup_dir -type f -name "*.tar.gz" -mtime +$days -exec rm -f {} ;
find $backup_dir -type f -name "*.log" -mtime +$days -exec rm -f {} ;
echo 'remove successsfully.'


定时任务:

#定时任务服务开机启动
chkconfig crond on
#启动定时任务服务
service crond start
#定时任务计划
0 0 * * * /home/oracle/backupDB_orcl.sh

注意: 

1.新建逻辑目录,并在操作系统层面oracle用户创建对应的文件夹

2.针对sys/oracle@orcl as sysdba需要tnsping测试ok

参考资料: ORACLE常用定时备份脚本_ITPUB博客

数据库导入或恢复示例:

#恢复全库示例
impdp system/password directory=dmp_dir dumpfile=full.dmp full=y
#参数说明:用户system 密码password 备份存储目录directory 备份文件名dumpfile 是否全量full

#恢复指定的表
impdp system/password directory=dmp_dir dumpfile=full.dmp tables=yyyy table_exists_action=replace
#参数说明:用户system 密码password 备份存储目录directory 备份文件名dumpfile 指定表tables table_exists_action表存在时的动作为替换

#恢复指定的表空间
impdp system/password directory=dmp_dir dumpfile=full.dmp tablespaces=xxxx table_exists_action=replace
其他导出导入用法示例:

用expdp导出dmp,有五种导出方式:

1.“full=y”,全量导出数据库
expdp user/passwd@orcl dumpfile=expdp.dmp directory=data_dir full=y logfile=expdp.log;

2.schemas按用户导出
expdp user/passwd@orcl schemas=user dumpfile=expdp.dmp directory=data_dir logfile=expdp.log;

3.按表空间导出
expdp sys/passwd@orcl tablespace=tbs1,tbs2 dumpfile=expdp.dmp directory=data_dir logfile=expdp.log;

4.导出表
expdp user/passwd@orcl tables=table1,table2 dumpfile=expdp.dmp directory=data_dir logfile=expdp.log;

5.按查询条件导出
expdp user/passwd@orcl tables=table1='where number=1234' dumpfile=expdp.dmp directory=data_dir logfile=expdp.log;

--------------------------------------------
导入

1.如果不是同一台服务器,需要先将上面的dmp文件下载到目标服务器上;
2.参照“expdp导出步骤”里的前三步,建立逻辑目录;
3.用impdp命令导入,对应五种方式:
a:“full=y”,全量导入数据库;

impdp user/passwd directory=data_dir dumpfile=expdp.dmp full=y;
b:同名用户导入,从用户A导入到用户A;

impdp A/passwd schemas=A directory=data_dir dumpfile=expdp.dmp logfile=impdp.log;
c:①从A用户中把表table1和table2导入到B用户中;

impdp B/passwdtables=A.table1,A.table2 remap_schema=A:B directory=data_dir dumpfile=expdp.dmp logfile=impdp.log;
②将表空间TBS01、TBS02、TBS03导入到表空间A_TBS,将用户B的数据导入到A,并生成新的oid防止冲突;

impdp A/passwdremap_tablespace=TBS01:A_TBS,TBS02:A_TBS,TBS03:A_TBS remap_schema=B:A FULL=Y transform=oid:n 
directory=data_dir dumpfile=expdp.dmp logfile=impdp.log
d:导入表空间;

impdp sys/passwd tablespaces=tbs1 directory=data_dir dumpfile=expdp.dmp logfile=impdp.log;

e:追加数据;

impdp sys/passwd directory=data_dir dumpfile=expdp.dmp schemas=system table_exists_action=replace logfile=impdp.log; 
--table_exists_action:导入对象已存在时执行的操作。有效关键字:SKIP,APPEND,REPLACE和TRUNCATE

参考资料:

expdp with sys on linux - 墨天轮

常用脚本(以下脚本搜集自网络,作为参考使用,需要根据实际情况修改)

1.全库导出

cat datapump_exp.sh

#!/bin/sh
export MYDIR=/home/oracle/dumpfile
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORACLE_SID=prod1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin
export DAY_FORMAT=`date +'%Y%m%d%H%M'`
(
cd $MYDIR
echo "###################################################################################"
echo "`date` removing old files..." 2>&1;
find . -mtime +5 -name "prod_*.dmp" -exec rm -rf {} \;
find . -mtime +5 -name "prod_*.log" -exec rm -rf {} \; 
echo "`date` removed" 2>&1
echo "`date` exporting fully ..." 2>&1
expdp \'sys/oracle@prod1 as sysdba\' DIRECTORY=MYDIR DUMPFILE=prod_${DAY_FORMAT}_%U.dmp LOGFILE=budget_${DAY_FORMAT}.log FULL=Y PARALLEL=8 COMPRESSION=ALL CLUSTER=N JOB_NAME=prod_exp_${DAY_FORMAT} 1>/dev/null 2>&1 
echo "`date` export done" 2>&1
)>>$MYDIR/expdp.log


2.数据库备份脚本

cat backup_sh

#!/bin/bash
RMAN_BACKUP_DIR=/home/oracle/rman_backup
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORACLE_SID=prod1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin                                             
export MAXPIECESIZE=32G
export INCR_LEVEL=$((0))
export day=`date +%w`
export DAY_DATE=`date +'%Y%m%d'`
export DAY_FORMAT=`date +'%Y%m%d%H%M%S'`
export TAG_NAME=TAG_Incr${INCR_LEVEL}_${DAY_FORMAT}
echo "-----doing!!-----" >> $RMAN_BACKUP_DIR/rman_backup_log.log
rman log=$RMAN_BACKUP_DIR/rman_backup_log.log <<EOF
connect target /
run {
allocate channel 'ch1' TYPE DISK maxpiecesize=${MAXPIECESIZE};
allocate channel 'ch2' TYPE DISK maxpiecesize=${MAXPIECESIZE};
backup incremental level ${INCR_LEVEL} database tag ${TAG_NAME} format '${RMAN_BACKUP_DIR}/${ORACLE_SID}_${DAY_DATE}_db_%U';
sql 'alter system archive log current';
backup archivelog all format '${RMAN_BACKUP_DIR}/${ORACLE_SID}_${DAY_DATE}_arc_%U';
backup current controlfile format '${RMAN_BACKUP_DIR}/${ORACLE_SID}_${DAY_DATE}_ctl_%U';
release channel ch1;
release channel ch2;
}
exit;
EOF
echo `date '+%Y-%m-%d %H:%M:%S'` >> $RMAN_BACKUP_DIR/rman_backup_log.log
echo "-----done!!-----" >> $RMAN_BACKUP_DIR/rman_backup_log.log
cat $RMAN_BACKUP_DIR/rman_backup_log.log >> $RMAN_BACKUP_DIR/rman_backup_history.log
cd $RMAN_BACKUP_DIR
find . -mtime +7 -name "prod1_*" -exec rm -rf {} \;


3.归档日志备份脚本

cat auto_clear_archivelog.sh

#!/bin/sh
LOG_DIR=/home/oracle/auto_clear_archivelog
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORACLE_SID=prod1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin
echo "-----doing!!-----" >> $LOG_DIR/rman_delete_archivelog.log
rman log=$LOG_DIR/rman_delete_archivelog.log target / <<EOF
delete force noprompt archivelog all completed before 'sysdate-2';
crosscheck archivelog all;
delete noprompt expired archivelog all;
exit;
EOF
echo `date '+%Y-%m-%d %H:%M:%S'` >> $LOG_DIR/rman_delete_archivelog.log
echo "-----done!!-----" >> $LOG_DIR/rman_delete_archivelog.log
cat $LOG_DIR/rman_delete_archivelog.log >> $LOG_DIR/delete_history.log

4.归档清理脚本

cat auto_clear_archivelog.sh

#!/bin/sh
LOG_DIR=/home/oracle/auto_clear_archivelog
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORACLE_SID=prod1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin
echo "-----doing!!-----" >> $LOG_DIR/rman_delete_archivelog.log
rman log=$LOG_DIR/rman_delete_archivelog.log target / <<EOF
delete force noprompt archivelog all completed before 'sysdate-2';
crosscheck archivelog all;
delete noprompt expired archivelog all;
exit;
EOF
echo `date '+%Y-%m-%d %H:%M:%S'` >> $LOG_DIR/rman_delete_archivelog.log
echo "-----done!!-----" >> $LOG_DIR/rman_delete_archivelog.log
cat $LOG_DIR/rman_delete_archivelog.log >> $LOG_DIR/delete_history.log


5.备份脚本

#!/bin/bash
RMAN_BACKUP_DIR=/home/oracle/rman_backup
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORACLE_SID=prod1
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export TNS_ADMIN=$ORACLE_HOME/network/admin                                              
export MAXPIECESIZE=32G
export INCR_LEVEL=$((0))
export day=`date +%w`
if [ $day -eq 0 ] ; then
INCR_LEVEL=$((0))
fi
if [ $day -eq 1 ] ; then
INCR_LEVEL=$((2))
fi
if [ $day -eq 2 ] ; then
INCR_LEVEL=$((2))
fi
if [ $day -eq 3 ] ; then
INCR_LEVEL=$((1))
fi
if [ $day -eq 4 ] ; then
INCR_LEVEL=$((2))
fi
if [ $day -eq 5 ] ; then
INCR_LEVEL=$((2))
fi
if [ $day -eq 6 ] ; then
INCR_LEVEL=$((1))
fi
export DAY_DATE=`date +'%Y%m%d'`
export DAY_FORMAT=`date +'%Y%m%d%H%M%S'`
export TAG_NAME=TAG_Incr${INCR_LEVEL}_${DAY_FORMAT}
echo "-----doing!!-----" >> $RMAN_BACKUP_DIR/rman_backup_log.log
rman log=$RMAN_BACKUP_DIR/rman_backup_log.log <<EOF
connect target /
run {
allocate channel 'ch1' TYPE DISK maxpiecesize=${MAXPIECESIZE};
allocate channel 'ch2' TYPE DISK maxpiecesize=${MAXPIECESIZE};
backup incremental level ${INCR_LEVEL} database tag ${TAG_NAME} format '${RMAN_BACKUP_DIR}/${ORACLE_SID}_${DAY_DATE}_db_%U';
sql 'alter system archive log current';
backup archivelog all format '${RMAN_BACKUP_DIR}/${ORACLE_SID}_${DAY_DATE}_arc_%U' delete input;
backup current controlfile format '${RMAN_BACKUP_DIR}/${ORACLE_SID}_${DAY_DATE}_ctl_%U';
release channel ch1;
release channel ch2;
}
exit;
EOF
echo `date '+%Y-%m-%d %H:%M:%S'` >> $RMAN_BACKUP_DIR/rman_backup_log.log
echo "-----done!!-----" >> $RMAN_BACKUP_DIR/rman_backup_log.log
cat $RMAN_BACKUP_DIR/rman_backup_log.log >> $RMAN_BACKUP_DIR/rman_backup_history.log
cd $RMAN_BACKUP_DIR
find . -mtime +7 -name "prod1_*" -exec rm -rf {} \;


6.清空表空间回收站

cat auto_purge_recyclebin.sh

#!/bin/bash
source ~/.bash_profile
sqlplus -S /nolog > result.log<<EOF
#set heading off feedback off pagesize 0 verify off echo off
conn / as sysdba
PURGE tablespace tbs_cc user cc;
exit
EOF

猜你喜欢

转载自blog.csdn.net/qq_34777982/article/details/124969837
今日推荐