背景
我们的应用和数据库都在云服务器上,但是最近时常发生云服务厂商把创业公司的数据全部弄丢的事件,所以数据库定时异地备份是有必要的。我们采用的方案是在数据库所在的服务器上开启一个定时任务来备份数据库数据,并把备份文件传输到FTP服务器上异地存储。这样即使云服务器数据全部丢失,我们的数据都还可以从备份文件恢复。
crontab定时任务
https://www.cnblogs.com/tankblog/p/6934987.html
- 查看crontab是否运行,如果没有的话就安装并启动
[root@uat ~]# /sbin/service crond status
crond (pid 1503) is running...
#安装并启动服务
[root@uat ~]# yum install crontabs
[root@uat ~]# /sbin/service crond start
- 查看用户下的定时任务
[root@uat ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
[root@uat ~]# crontab -l
#定时做数据库备份
0 4 * * * /u03/oracle/dump/startBackupDbTask.sh
- crontab任务配置基本格式
* * * * * command
分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天) 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。
整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。
用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。
正斜线(/)可以用来指定间隔频率。在范围后加上 / 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。
开头为井号(#)的行是注释,不会被处理。
例子:
0 1 * * * /home/testuser/test.sh
每天晚上1点调用/home/testuser/test.sh
*/10 * * * * /home/testuser/test.sh
每10钟调用一次/home/testuser/test.sh
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。
- 编辑定时任务
[root@uat ~]# crontab -e
#定时做数据库备份
0 4 * * * /u03/oracle/dump/startBackupDbTask.sh
dump数据导出
之前已经写了一片介绍Oracle数据导出工具导出数据的文章,这里就不再重复了。只是贴上我使用的定时执行的这个脚本
【Oracle】 Dump数据导出
[root@uat dump]# pwd
/u03/oracle/dump
[root@uat dump]# ll
总用量 8
-rwxrwxr-x 1 root root 454 9月 7 11:59 ftp.sh
-rwxrwxr-x 1 root root 869 9月 7 11:41 startBackupDbTask.sh
startBackupDbTask.sh
[root@uat dump]# vim startBackupDbTask.sh
#定时备份任务4:00执行
#执行此脚本之前需要在Oracle数据库中创建数据导出目录dump_dir,配置用户对该目录的访问权限
#数据导出完成后会将这些文件传输到ftp服务器上
curr_path=`pwd`
echo "数据库备份文件目录:$curr_path"
prefix="test_"
filename=${prefix}`date +%Y%m%d_%H%M%S`
echo "文件名:$filename"
db_username="username"
db_password="password"
db_schemas="username"
echo "db_username/db_password:db_schemas-->$db_username/$db_password:$db_schemas"
#数据库数据导出
su - oracle << EOF
expdp $db_username/$db_password DIRECTORY=dump_dir DUMPFILE=${filename}.dmp LOGFILE=${filename}.log SCHEMAS=$db_schemas
EOF
#备份文件传输到ftp上
#sh ${curr_path}/ftp.sh "${filename}.*"
- 执行备份
[root@uat dump]# ./startBackupDbTask.sh
数据库备份文件目录:/u03/oracle/dump
文件名:test_20180907_172014
db_username/db_password:db_schemas-->username/password:schemas
Export: Release 11.2.0.4.0 - Production on Fri Sep 7 17:20:15 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "ML01USR"."SYS_EXPORT_SCHEMA_01": ml01usr/******** DIRECTORY=dump_dir DUMPFILE=test_20180907_172014.dmp LOGFILE=test_20180907_172014.log SCHEMAS=ml01usr
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 202.7 MB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
- 查看导出结果
[root@uat dump]# ll
总用量 126492
-rwxrwxr-x 1 root root 862 9月 7 17:22 startBackupDbTask.sh
-rw-r----- 1 oracle oinstall 129499136 9月 7 17:22 test_20180907_172236.dmp
-rw-r----- 1 oracle oinstall 16405 9月 7 17:22 test_20180907_172236.log
FTP配置
ftp服务端
我们的数据备份服务器是一台windows服务器,能够直接开启ftp服务具体过程可以参考这篇文章,过程记录的比较详细
https://blog.csdn.net/qq_35155205/article/details/52946806ftp客户端
https://blog.csdn.net/sun2012930/article/details/72724268
https://www.cnblogs.com/chinas/p/6957701.html
ftp.sh
脚本会接受一个输入参数LOC_FILENAMES
需要上传的本地文件名
[root@uat dump]# ll
总用量 126492
-rwxrwxr-x 1 root root 454 9月 7 11:59 ftp.sh
-rwxrwxr-x 1 root root 862 9月 7 17:22 startBackupDbTask.sh
-rw-r----- 1 oracle oinstall 129499136 9月 7 17:22 test_20180907_172236.dmp
-rw-r----- 1 oracle oinstall 16405 9月 7 17:22 test_20180907_172236.log
[root@uat dump]# vim ftp.sh
#FTP服务器地址
IP="your ip"
#FTP端口号
PORT="21"
#FTP用户名
USER="username"
#FTP用户密码
PWD="password"
#对应的本地服务器目录
LOC_DIR="/u03/oracle/dump/"
#本地文件名
#LOC_FILENAMES=test_`date +%Y%m%d_*`
LOC_FILENAMES=$1
echo ${LOC_FILENAMES}
#远程FTP服务器目录
REMOTE_DIR="/"
ftp -ivn << EOF
open $IP $PORT
user $USER $PWD
cd $REMOTE_DIR
lcd $LOC_DIR
size ${LOC_FILENAMES}
bin
mput ${LOC_FILENAMES}
close
quit
EOF
- 执行上传
[root@uat dump]# ./ftp.sh "test_20180907_172236.*"
test_20180907_172236.dmp test_20180907_172236.log
Connected to *.*.*.*.
220 Microsoft FTP Service
Remote system type is Windows_NT.
331 Password required
230 User logged in.
250 CWD command successful.
Local directory now /u03/oracle/dump
550 The filename, directory name, or volume label syntax is incorrect.
200 Type set to I.
local: test_20180907_172236.dmp remote: test_20180907_172236.dmp
227 Entering Passive Mode (218,244,49,142,222,80).
125 Data connection already open; Transfer starting.
-
查看上传结果
数据库自动备份的整体流程
简单来说就是在数据库服务器上使用crontab开启一个定时,定时执行数据库的数据导出脚本,数据导出完成后再将数据传输到FTP服务器上。
startBackupDbTask.sh
#定时备份任务4:00执行
#执行此脚本之前需要在Oracle数据库中创建数据导出目录,配置用户对该目录的访问权限
#数据导出完成后会将这些文件传输到ftp服务器上
curr_path=`pwd`
echo "数据库备份文件目录:$curr_path"
prefix="test_"
filename=${prefix}`date +%Y%m%d_%H%M%S`
echo "文件名:$filename"
db_username="username"
db_password="password"
db_schemas="schemas"
echo "db_username/db_password:db_schemas-->$db_username/****:$db_schemas"
#su - oracle -c "expdp $db_username/$db_password DIRECTORY=dump_dir DUMPFILE=${filename}.dmp LOGFILE=${filename}.log SCHEMAS=$db_schemas"
#数据库数据导出
su - oracle << EOF
expdp $db_username/$db_password DIRECTORY=dump_dir DUMPFILE=${filename}.dmp LOGFILE=${filename}.log SCHEMAS=$db_schemas
EOF
#备份文件传输到FTP服务器上
sh ${curr_path}/ftp.sh "${filename}.*"