#!/bin/sh
#作者:long QQ:755136755
#按用户备份,并打包,本地保存
#复制oracle用户的环境变量
export ORACLE_BASE=/data/u01/app/oracle #定义ORACLE_BASE
export ORACLE_HOME=/data/u01/app/oracle/product/11.2.0/dbhome_1 #定义ORACLE_HOME
export ORACLE_SID=orcl #定义SID
export ORACLE_UNQNAME=$ORACLE_SID
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"
#export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
###############################
USERNAME=sys #启动备份的用户名,必须具有备份权限
PASSWORD=123456 #密码
OWNERS=(lhz longhz test) #要备份用户
CURDATE=$(date '+%F_h%Hm%Ms%S') #当前时间
backup_directory=/ora_bak #主备份目录
backup_directory_time=${backup_directory}/$(hostname)_${ORACLE_SID}_${CURDATE} #每次备份目录、打包目录
data_file_prefix=$(hostname)_${ORACLE_SID} #定义文件名前缀
BACKUP_MAIN_log=${backup_directory}/main_ora_${ORACLE_SID}_$(date '+%Y-%m').log #主要日志
ALL_PARA=$* #存放所有参数
[ -d ${backup_directory_time} ] || mkdir -p ${backup_directory_time} #文件不存在则创建备份文件夹
###############################
function echo_color () {
what=$*
if [[ "$1" =~ "ERROR" ]];then
echo -e "\033[31m ${what} \033[0m"
elif [[ "$1" =~ "WARN" ]];then
echo -e "\033[33m ${what} \033[0m"
else
echo -e "\033[32m ${what} \033[0m"
fi
}
null_exp(){
thek=`echo "'"${1}"'" | tr 'a-z' 'A-Z'` #用户转换为大写
echo_color "$(date '+%F_%T'), 查找用户:${thek}下空表,并生成操作语句, 请稍等..."
if [[ "${USERNAME}" == "sys" ]];then
CONN="conn ${USERNAME}/${PASSWORD} as sysdba ;"
else
CONN="conn ${USERNAME}/${PASSWORD} ;"
fi
alt_aly_sql=`
sqlplus -s /nolog < ${CONN} set echo on; set timing off; set feedback on; set trimspool off; set linesize 120; set pagesize 2000; set newpage 1; set heading on; set term off; set termout on; set timing off; select 'alter table '||OWNER||'.'||table_name||' allocate extent;' from dba_tables t where t.INITIAL_EXTENT is null and t.owner=${thek}; select 'analyze table '||OWNER||'.'||table_name||' compute statistics;' from dba_tables t where t.INITIAL_EXTENT is null and t.owner=${thek}; exit; EOF` alt_aly_sql=$(echo "${alt_aly_sql}" |sed -n '/^a/p') echo "${alt_aly_sql}" >> ${backup_directory_time}/null_alt_aly_sql.log echo_color "[alt]${alt_aly_sql}[alt]" if [[ "${alt_aly_sql}" =~ "table" ]];then echo_color "$(date '+%F_%T'), 开始操作、分析空表, 请稍等..." opt_log=` sqlplus -s /nolog < ${CONN} set echo on; set timing off; set feedback on; set trimspool off; set linesize 120; set pagesize 2000; set newpage 1; set heading on; set term off; set termout on; set timing off; ${alt_aly_sql} exit; EOF` else echo_color "$(date '+%F_%T')无操作空表语句!" fi echo_color "[opt]${opt_log}[opt]" echo "${opt_log}" >> ${backup_directory_time}/null_opt_log.log } main_fun(){ cou_suc=0 #备份成功数 cd ${backup_directory_time} #进入目录 echo "----${CURDATE}----" >> ${BACKUP_MAIN_log} for thei in ${OWNERS[@]} #遍历用户数组 do [[ "${ALL_PARA[@]}" =~ "n" ]] || null_exp ${thei} #查找每个用户的空表 echo_color "[INFO:]SID: ${ORACLE_SID}, 开始备份的用户:${thei}" BACKUP_LOG=${data_file_prefix}_${thei}_${CURDATE}.log BACKUP_FILE=${data_file_prefix}_${thei}_${CURDATE}.dmp if [[ "${USERNAME}" == "sys" ]];then exp \'${USERNAME}/${PASSWORD}@${ORACLE_SID} as sysdba \' file=${BACKUP_FILE} log=${BACKUP_LOG} owner=${thei} && let cou_suc+=1 #备份成功加1 else exp \'${USERNAME}/${PASSWORD}@${ORACLE_SID} \' file=${BACKUP_FILE} log=${BACKUP_LOG} owner=${thei} && let cou_suc+=1 #备份成功加1 fi awk -v f=${BACKUP_FILE} -v t=${CURDATE} -v u=${thei} \ '/^\. \. 正在导出表/{OFS="\t";print t,"USER:"u,$4,$5,$6;a=a+$5}END{OFS="\t";print t,"USER:"u,"本次总导出数:",""a,f}' ${BACKUP_LOG} >> ${BACKUP_MAIN_log} biaoshu_hangshu[${cou_suc}]=`awk -v uu=${thei} '/^. . 正在导出表/{a+=1;b+=$5}END{print uu"(表数:"a", 行数:"b")"}' ${BACKUP_LOG}` done if [[ ${#OWNERS[@]} -eq ${cou_suc} ]];then #备份成功数等于用户数组数,则成功 echo_color "[INFO:]备份完成(用户:${OWNERS[@]}), 开始压缩文件!压缩列表如下: " tar czvf ${backup_directory_time}.tar * && cd .. && rm -fr ${backup_directory_time} #压缩成功后删除源文件 echo_color "[INFO:]备份并压缩完成: ${backup_directory_time}.tar ,详细: ${biaoshu_hangshu[@]}" echo_color "[INFO:]详细日志: ${BACKUP_MAIN_log} " echo -e "----${biaoshu_hangshu[@]} 压缩完成: ${backup_directory_time}.tar \n" >> ${BACKUP_MAIN_log} echo_color "tips:导入命令示例:imp \'sys/123456@SID as sysdba\' buffer=655360 file=文件.dmp fromuser=用户 touser=用户 log=/tmp/imp.log" exit 0 else #备份失败 echo_color "[ERROR:]${CURDATE}, 备份失败!" echo -e "${CURDATE}\t${OWNERS[@]}\t备份失败!" >> ${BACKUP_MAIN_log} exit 3 fi } main_fun