Oracle数据库定时备份

一、Linux数据库显示中文乱码

1.echo $LANG         ---查看当前系统语言

2.locale --查看已有语言包

3.yum groupinstall  "chinese-support"  --下载语言支持包

但是这里无论是输入yum groupinstall  "chinese-support"还是yum groupinstall  chinese-support还是yum groupinstall  "Chinese Support"都不行,都显示Warning: group chinese-support does not exist.如下图

 

 

 yum clean all后还是同样。然后网上查找到  On Centos 7 yum groupinstall "fonts"  于是查了一下自己的Centos版本 rpm -q centos-release 如下图

 

 

 

 

 确实是Centos 7,于是尝试用 yum groupinstall "fonts"来下载,但是---------------------------依然失败:

 

 

 我蒙了。。

然后从网上查了下Centos7安装中文包需要用yum install kde-l10n-Chinese 。使用locale -a 查询当前有的语言包,是有zh_CN.utf8的

 

 

然后设置LANG="zh_CN.utf8",发现没生效,设置LANG="zh_CN.UTF-8"也不生效。

 

 

 继续研究:执行locale发现现在LANG="zh_CN.UTF-8",那么为什么执行.sh中汉字信息依然是错误的呢?下面做个测试:

vi test.txt -----------------新建一个txt文件,然后使用xftp直接修改内容添加汉字“你好  测试一下”,然后再保存  回到xshell  vi test.txt  发现汉字是乱码形式。然后再xshell中编辑此txt,输入“你好 测试一下”:wq(保存并退出)然后再打开是没问题的,说明使用xftp直接修改文件内容可能会导致问题。这样在xshell中再次修改一下autobak.sh的内容。

然后就成功了。

 

 

 

二、开始写备份数据库shell文件

Oracle数据库新建虚拟目录

新建临时备份文件存储目录

mkdir /home/oradp

修改临时备份文件目录权限,让oracle具有写入权限

chown oracle:oinstall /home/oradp

登录sqlplus

su - oracle
sqlplus /nolog

新建虚拟目录供expdp使用

conn / as sysdba
create directory dpdata as '/shell';

查看目录是否创建成功

select * from dba_directories;

用sys管理员给指定用户赋予在该目录的操作权限

grant read,write on directory dpdata to cmsxx;

Oracle数据库虚拟目录创建成功

编写自动备份脚本

编写自动备份的shell脚本供定时任务使用,在正式服务器下新建脚本存储目录

mkdir /shell

内容如下

#!/bin/sh

#自动备份oracle数据库并压缩

#定时任务示例
#每隔十天10点凌晨1点备份
#0 1 * * * nohup /shell/autobak.sh >> /shell/autobak.log &

#数据库用户
db_user="XXX";
#数据库密码
db_password="XXX";
#数据库服务器,需要在本地客户端tnsnames中定义好
db_server="XXX";
#本地客户端执行程序目录
oracle_bin_dir="XXX";
#oracle虚拟目录名
oracle_directory="/shell";
#备份服务器地址
backup_server="XXX";
#备份服务器用户
backup_user="XXX";
#本地备份目录,存放dump文件与临时压缩文件
local_backup_dir="/home/oradp";
#远程备份目录,对应备份服务器存放位置,需要提前挂载
remote_backup_dir="/data/autobak";

#获取当前日期
date_now=$(date +%Y%m%d);
#备份当天的数据库
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 自动备份数据库并压缩开始 ----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 数据库备份开始 --------------------------------------------------------";
echo "su oracle -lc \"${oracle_bin_dir}/expdp ${db_user}/${db_password}@${db_server} directory=${oracle_directory} content=METADATA_ONLY full=y dumpfile=${db_server}_${date_now}.dmp logfile=${db_server}_${date_now}.log parallel=3\"";
su oracle -lc "${oracle_bin_dir}/expdp ${db_user}/${db_password}@${db_server} directory=${oracle_directory} content=METADATA_ONLY full=y dumpfile=${db_server}_${date_now}.dmp logfile=${db_server}_${date_now}.log parallel=3";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 数据库备份结束--------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 数据库压缩开始 --------------------------------------------------------";
echo "cd ${local_backup_dir} && tar -zcf ${db_server}_${date_now}.tar.gz ${db_server}_${date_now}.dmp ${db_server}_${date_now}.log";
cd ${local_backup_dir} && tar -zcf ${db_server}_${date_now}.tar.gz ${db_server}_${date_now}.dmp ${db_server}_${date_now}.log;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 数据库压缩结束--------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 传输备份文件开始--------------------------------------------------------";
echo "scp ${local_backup_dir}/${db_server}_${date_now}.tar.gz ${backup_user}@${backup_server}:/${remote_backup_dir}";
scp ${local_backup_dir}/${db_server}_${date_now}.tar.gz ${backup_user}@${backup_server}:/${remote_backup_dir};
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 传输备份文件结束--------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 删除当前备份原始文件开始 ----------------------------------------------";
echo "rm -rf ${local_backup_dir}/${db_server}_${date_now}.dmp ${local_backup_dir}/${db_server}_${date_now}.log"
rm -rf ${local_backup_dir}/${db_server}_${date_now}.dmp ${local_backup_dir}/${db_server}_${date_now}.log;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 删除当前备份原始文件结束----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 删除当前备份压缩文件开始 ----------------------------------------------";
echo "rm -rf ${local_backup_dir}/${db_server}_${date_now}.tar.gz"
rm -rf ${local_backup_dir}/${db_server}_${date_now}.tar.gz;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 删除当前备份压缩文件结束---------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 自动备份数据库并压缩结束----------------------------------------------";

三、scp免密码传输

首先假设服务器A和B,要想实现从A向B复制文件或者从B获取文件,也就是: scp -r "some files in A" B:/somewhere 或者 scp -r B:/somewhere/somefiles "somewhere in A"

1. 在A中执行命令:

ssh-keygen -t rsa -P ""

这会在 ~/.ssh 目录下生成两个文件:id_rsa 和 id_rsa.pub

2. 拷贝A的id_rsa.pub到B:

scp /xxx/.ssh/id_rsa.pub root@xxx.xxx.xxx.xxx:/xxx/xxx

3. 登录B,并把id_rsa.pub输入到B的authorized_keys文件中:

cat /xxx/xxx/id_rsa.pub >> /xxx/xxx/.ssh/authorized_keys

经测试这样A和B互相传文件无需输密码,scp的说明

经过这三步,路子起码是对的但是还是报错了。我太难了。。。。

 

 

 继续研究 看了东城绝神这哥们的一番操作试了一下 果然有用,现在可以进行到处操作了,导出的文件也成功的生成在了/shell/expdpdir这路径下,然后就不对了 下一步应该是压缩文件并传输到备份服务器,但是执行的命令里有这么一句:

 

 

 这里/home/oradp下是找不到这两个文件(oracledb.01_20200306.dmp和oracledb.01_20200306.log)的,而在/shell/expdpdir能找到,所以我试试把参数设置中改成 local_backup_dir="/shell/expdpdir";然后再尝试 看看能不能成功压缩文件并传输到备份服务器--------------------------------------------------------------------------------------成功!

 

 

 四、设置定时任务

#进入vi的编辑界面让你编辑工作
crontab -e
#每隔十天凌晨1点备份 0 1 10 * * nohup /usr/bin/sh /shell/autobak.sh >> /shell/autobak.log &
posted @ 2020-03-06 16:55  DreamCatt  阅读(930)  评论(0)    收藏  举报