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 &

浙公网安备 33010602011771号