在项目上有时客户不会给我们数据库服务器的访问权限,为了数据安全,我们需要使用可以访问数据库服务器的服务器安装Oracle客户端实现备份,比如Web服务器。
1. 下载客户端
Oracle客户端官网下载网址:http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
每种包分.zip和.rpm格式,zip格式相当于免安装版,解压就可以使用,rpm格式为安装版。这里推荐zip格式,安装rpm包会直接安装在默认路径下,zip包可以自定义解压路径,还有一点重要的原因就是内网服务器的rpm版本一般为服务器自带的4.3,无法安装高版本的Oracle客户端。
我们这里只使用exp和imp,所以只下载基础包(instantclient-basic-linux.x64-11.2.0.4.0.zip)就可以了,需要其他功能可以再下载其他包。下载后上传到服务器上。
2. 创建用户和用户组
为了不影响其他应用,最好单独为Oracle客户端创建一个用户。
使用管理员账号登陆服务器
#创建用户组oinstall
groupadd oinstall
#创建用户组dba
groupadd dba
#创建oracle用户,并加入到oinstall和dba用户组
useradd -g oinstall -g dba -m oracle
#oracle用户的登录密码
echo " 1qaz2wsx3e" | passwd --stdin oracle
3. 解压客户端
#切换到oracle用户,解压客户端文件,这里可以自己选择路径。
unzip instantclient-basic-linux.x64-11.2.0.4.0.zip
4. 配置环境变量
#这一步是关键,我们只修改oracle用户的环境变量,切换到oracle用户,编辑环境变量
vi ~/.bash_profile
export ORACLE_HOME=/home/oracle/instantclient_11_2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$ORACLE_HOME:$PATH
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
#其中,ORACLE_HOME就是客户端解压的路径。
#保存退出后,使环境变量立即生效:
source ~/.bash_profile
5. 配置TNS
#创建目录,路径要和环境变量中TNS_ADMIN的路径相同
mkdir -p network/admin
#进入该路径下,创建tns文件
vi tnsnames.ora
#在文件中输入你要连接的数据库的TNS配置
ksyj =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = **.**.**.**)(PORT = ****))
)
(CONNECT_DATA =
(SERVICE_NAME = ****)
)
)
6. 拷贝所需文件
此时基本配置已经完成,需要从其他Oracle服务端拷贝bin目录下的exp和imp文件到ORACLE_HOME路径下,以及dbhome_1下的rdbms中的部分文件,考虑到以后可能增加exp和imp以外的其他工具,这里就把整个文件夹拷贝过来。注意:拷贝的Oracle服务器的版本一定要和我们下载的版本相同。
我这里使用的是scp传输
scp -r root@84.12.72.52:/home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/exp /home/oracle/instantclient_11_2/
scp -r root@84.12.72.52:/home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/imp /home/oracle/instantclient_11_2/
scp -r root@84.12.72.52:/home/oracle/app/oracle/product/11.2.0/dbhome_1/rdbms /home/oracle/instantclient_11_2/
7. 测试
#使用exp语句测试是否成功
exp ksyj2sjods/***********@ksyj file=/home/oracle/ksyj.dmp tables=yj_yjtjb log=/home/oracle/ksyj.log
#如果执行exp命令时报无此命令错误,可能是拷贝来的exp文件无可执行权限,赋予可执行权限就可以解决。
chmod +x exp
8. 创建备份文件夹和脚本
#创建备份文件夹和脚本文件夹
mkdir -p backup/script
#创建脚本文件
#进入脚本路径
cd backup/script
#创建脚本文件
touch ksyj_backup.sh
#赋予可执行权限
chmod +x ksyj_backup.sh
#编辑脚本文件
vim ksyj_backup.sh
#!/bin/bash
#设置环境变量 【1】
source ~/.bash_profile
#当前日期
DD=`date +%Y%m%d`
#进入备份目录
cd /home/oracle/backup
#统计当前目录下的文件数量
fileNum=`ls -l |grep "^-"|wc -l`
#判断文件数量是否大于12 【2】
if [ ${fileNum} -gt 12 ]; then
#删除3天前的备份文件和日志
find -name "ksyj_*" -type f -mtime +3 -print -exec rm -f {} \;
fi
#开始备份 fact_processing为分区表 无法使用exp备份
exp ksyj2sjods/**************@ksyj file=ksyj_tables${DD}.dmp tables=yj_yjtjb,yj_yjmxb2,fact_process_log log=ksyj_tables${DD}.log
exp ksyj2sjods/**************@ksyj file=ksyj_bi${DD}.dmp owner=ksyj2sj log=ksyj_bi${DD}.log
#判断备份文件是否存在 【3】
if [ -e ksyj_tables${DD}.dmp ]; then
#压缩备份文件
tar -czf ksyj_tables${DD}.tar.gz ksyj_tables${DD}.dmp
#删除备份文件
rm -f ksyj_tables${DD}.dmp
fi
#判断备份文件是否存在
if [ -e ksyj_bi${DD}.dmp ]; then
#压缩备份文件
tar -czf ksyj_bi${DD}.tar.gz ksyj_bi${DD}.dmp
#删除备份文件
rm -f ksyj_bi${DD}.dmp
fi
保存退出。其中:
- 【1】的环境变量设置必须写,因为crontab是属于root用户的,如果不写,脚本就会使用root的环境变量,导致命令不存在错误,设置环境变量也可以使用export来写;
- 【2】处判断条件是为了防止备份多次失败又长时间没人检查而导致把以前的备份文件全部删光的情况,文件数量视情况而定;
- 【3】处判断条件是因为压缩时如果原文件不存在也会生成空的压缩文件,这样可能在检查时出现误判。
9. 设置定时任务
#编辑定时任务
crontab -e
#定时为每天凌晨1点开始执行脚本
00 01 * * * /home/oracle/backup/script/ksyj_backup.sh