最近系统要“缩容”,原因我不想多说,非常麻烦的一件事情,因为要把数据提出来压缩、存放。
和操作系统无关,主要系Oracle的数据。
Oracle版本:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
另外,系统有进行了6个节点的RAC集群,每个表都按照月份或者日期进行了分区。
一、前置工作:
1. 在系统中建立生成dmp文件(导出的数据文件)的目录(一般情况下都需要root权限,这个自由发挥了^_^):
root@bidb04# mkdir -p /data/oracle_backup
root@bidb04# chown oracle:oinstall /data/oracle_backup
另外提个醒,无论你导出导入的时候用的是什么用户和密码登陆,数据库都是用(linux系统中的)oracle用户导出文件的,所以这个目录一定要让(linux系统中的)oracle用户有写权限。
2. 在oracle中定义生成dmp文件(导出的数据文件)的目录:
使用sqlplus / as sysdba进入sqlplus:
sql> grant create any directory to scott; --这一步也可以不用。
sql> create or replace directory oracle_backup as '/data/oracle_backup'; --有了上面那一步,目录也可以使用scott用户建立,当然直接就这么建立就完了。
sql> grant read, write on directory oracle_backup to scott; --赋予目录访问权限。
sql> create or replace directory DATA_PUMP_DIR as '/oracle/app/oracle/product/11.2.0/dbhome_1/rdbms/log/'; --这个貌似我是没有这么建立的,系统自己有了。
sql> grant read, write on directory DATA_PUMP_DIR to scott; --同上备注。
sql> grant EXP_FULL_DATABASE to scott; --导出权限
sql> grant IMP_FULL_DATABASE to scott; --导入权限
二、Data Pump导出(expdp):
expdp scott/**********@bidb4 TABLES=KR.TR_DATA_APP_2A3R_D:P20130101 DIRECTORY=ORACLE_BACKUP DUMPFILE=KR.TR_DATA_APP_2A3R_D0101%u.dmp LOGFILE=DATA_PUMP_DIR:KR.TR_DATA_APP_2A3R_D0101.log CONTENT=data_only CLUSTER=N PARALLEL=8 FILESIZE=2G ENCRYPTION=data_only ENCRYPTION_PASSWORD=password
备注:
#1. scott/**********@bidb4 (红色部分)用户名密码和SID,这个就和sqlplus登陆的一致了。
#2. TABLES (绿色部分)表名(表名称:分区)
#3. DIRECTORY (蓝色部分)要生成导出文件的目录名--在oracle dba_directories中定义(定义方法见前文)
#4. DUMPFILE (黄色部分)生成的导出文件名%u参数表示对个文件的后缀,与parallel、filesize一起使用
#5. LOGFILE (紫色部分)日志记录文件名称(log目录:log名称,其中log目录在oracle dba_directories中定义)(定义方法见前文)
#6. CONTENT (橙色部分)要包含的内容
#7. CLUSTER (灰色部分)是否使用集群,默认是Y,这里需要N(可以看看后记)
#8. PARALLEL (灰色部分)并行处理
#9. FILESIZE (灰色部分)单个文件最大大小
#10. ENCRYPTION (灰色部分)加密选项1,指定加密内容(附录中有描述参数可选内容)
#11. ENCRYPTION_PASSWORD (灰色部分)加密选项2,指定加密密钥
三、Data Pump导入(impdp):
impdp scott/**********@bidb4 TABLES=KR.TR_DATA_APP_2A3R_D DIRECTORY=ORACLE_BACKUP DUMPFILE=KR.TR_DATA_APP_2A3R_D0101%u.dmp LOGFILE=DATA_PUMP_DIR:IMP_KR.TR_DATA_APP_2A3R_D0101.log CONTENT=data_only CLUSTER=N PARALLEL=8 FILESIZE=2G ENCRYPTION_PASSWORD=password
备注:
基本和expdp的参数配置一致,有区别主要在第2个和第10个,另外,导出的日志名最好稍微修改一下,不然就覆盖掉了。
#2. TABLES (绿色部分)表名(只要表名就好了,不用加上分区,因为导入的数据里面已经包含了分区信息)
#10. ENCRYPTION (不再需要了)
后记:
1. 这个有一个很容易被忽略的参数:CLUSTER,这个表示使用集群导出/导入,由于系统是6机器做成的集群,导出的时候会默认使用集群导出,如果不指定N,则无论如何都报错。这里给诸位参考一下,如果系统没有做集群的话,这个参数就忽略吧。
2. 导出了dmp文件之后,本来想压缩一下传输到别的机器上去存放的,发现压缩前整整2GB的文件,zip -9 压缩之后变成2.1GB,不知道神马情况,所以果断放弃压缩的念头。
3. 如果有错误信息,贴出来看看能不能帮大家解决。
4. 上面的expdp语句是用在linux层面的,写个shell就能批量解决了:
用法:compress.sh /home/oracle/tmp/table_list.conf #最好是跟绝对路径了
#!/bin/sh
#shell name : compress.sh
#conf文件格式:<1表优先级>|<2表所属用户>|<3表名>|<4分区名>
if [ -z $1 ] ; then
echo -e "usage:$0 /path/conf ERROR! \033[7;5m Warning \033[0m"
exit 1
fi
#定义参数
_log_name=`echo $1|awk -F'/' '{print $NF}'`
shell_log="/home/oracle/tmp/$_log_name.log"
tmp_ftp_log="/home/oracle/tmp/tmp_ftp.log"
exp_dir="/data/oracle_backup"
_str_pwd="/work2/oracle_backup/" #远程机器的存放目录
_str_lpwd=$exp_dir #lpwd这个命令大家都懂的。
ftp_ip="192.168.1.1" #远程机器的ip
USER="sam" #远程主机ftp用户名
PASSWORD='password\#123' #ftp密码,如果有特殊字符,则需要如实例般转义。
#程序开始
echo ---`date`--- > $shell_log
echo ---------------BEGIN-------------- >> $shell_log
while read line
do
#获取并格式化参数
user_name=`echo $line|awk -F'|' '{print $2}'`
table_name=`echo $line|awk -F'|' '{print $3}'`
list_name=`echo $line|awk -F'|' '{print $4}'`
tables_name_format="${user_name}.${table_name}:${list_name}"
file_name_format="${user_name}.${table_name}.${list_name}"
dmp_log="/oracle/app/oracle/product/11.2.0/dbhome_1/rdbms/log/${file_name_format}.log"
expdp_exc="expdp scott/scott@bidb4 tables=${tables_name_format} DIRECTORY=ORACLE_BACKUP DUMPFILE=${file_name_format}%u.dmp LOGFILE=DATA_PUMP_DIR:${file_name_format}.log content=data_only cluster=N PARALLEL=8 filesize=2G encryption=data_only encryption_password=password"
list_file_exc="ls -l $exp_dir"
find_file_exc="ls $exp_dir"
echo **ExpdpBegin`date`**
echo **ExpdpBegin`date`** >> $shell_log
echo $expdp_exc
echo $expdp_exc >> $shell_log
`$expdp_exc`
echo Log file is: $dmp_log
echo Log file is: $dmp_log >> $shell_log
echo **ExpdpEnd`date`**
echo **ExpdpEnd`date`** >> $shell_log
sleep 2
#检查是否成功
pa_count=`cat ${dmp_log}|grep Job|grep successfully|wc -l`
if [ $pa_count -eq 0 ] ; then
echo -e "chk_expdp ${file_name_format} ERROR \033[7;5m Warning \033[0m"
echo "chk_expdp ${file_name_format} ERROR" >> $shell_log
exit 1
else
echo "chk_expdp ${file_name_format} SUCC"
echo "chk_expdp ${file_name_format} SUCC" >> $shell_log
fi
#压缩导出文件 #实测,压缩后文件增大,所以,果断放弃压缩。
#echo **CompressBegin`date`**
#echo **CompressBegin`date`** >> $shell_log
#$list_file_exc|grep .dmp|grep ${file_name_format} >> $shell_log
#_file_list=`$find_file_exc|grep .dmp|grep ${file_name_format}`
#for files in $_file_list
#do
# echo "gzip -9 $exp_dir/$files"
# echo "gzip -9 $exp_dir/$files" >> $shell_log
# `gzip -9 $exp_dir/$files` >> $shell_log
#done
#$list_file_exc|grep .dmp.gz|grep ${file_name_format} >> $shell_log
#echo **CompressEnd`date`** >> $shell_log
#sleep 2
#ftp上传
echo **FtpputBegin`date`**
echo **FtpputBegin`date`** >> $shell_log
#_file_list=`$find_file_exc|grep .dmp.gz|grep ${file_name_format}` ##如果有压缩,就用这一行,没有压缩用下面那两行
$list_file_exc|grep .dmp|grep ${file_name_format} >> $shell_log
_file_list=`$find_file_exc|grep .dmp|grep ${file_name_format}`
for files in $_file_list
do
echo $files
echo "ftp put file: $_str_lpwd/$files"
ftp -v -n ${ftp_ip}< $tmp_ftp_log ##切记啊,这里一定要顶行写,每行开头不能有任何空格,不然这个shell怎么都报错。
user ${USER} ${PASSWORD}
prompt
cd $_str_pwd
lcd $_str_lpwd
mput $files
bye
!
cat $tmp_ftp_log >> $shell_log
pa_count=`cat ${tmp_ftp_log}|grep "receive OK"|wc -l`
if [ $pa_count -eq 0 ] ; then
echo -e "chk_ftpput ${file_name_format} ERROR \033[7;5m Warning \033[0m"
echo "chk_ftpput ${file_name_format} ERROR" >> $shell_log
exit 1
else
echo "chk_ftpput ${file_name_format} SUCC"
echo "chk_ftpput ${file_name_format} SUCC" >> $shell_log
fi
echo "rm $_str_lpwd/$files" >> $shell_log
`rm $_str_lpwd/$files`
done
echo **FtpputEnd`date`** >> $shell_log
echo ---------END ONE TABLE---------- >> $shell_log
echo "" >> $shell_log
done < $1
echo ---------------END-------------- >> $shell_log
附:
1. ENCRYPTION 有效关键字值为: ALL, DATA_ONLY, METADATA_ONLY,ENCRYPTED_COLUMNS_ONLY 或 NONE。
2. 参考资料:
http://space.itpub.net/519536/viewspace-709931
http://www.cnblogs.com/lanzi/archive/2011/01/06/1927731.html