为保证数据的安全,防止异常问题造成数据库文件破坏/丢失,大型项目通常需要每天执行1~2次数据库备份。
因为数据库的备份工作有其重复性和规律性,所以通过自执行脚本的方式可以提高备份的效率和可靠性。
本文介绍了在Ubuntu下设置mysql自动定时备份的方法。
1. 基本技术依据和系统环境
系统: Ubuntu 16.04系统
数据库: MySQL
主要实现语言: Shell脚本 +scp命令(SSH远程文件传输)
2. 主要实现步骤
2.1. 编写备份及远程存档脚本
2.1.1. 设置本地数据库备份文件储存位置并创建备份程序
在数据库服务器上设置一个专门用于保存数据库备份文件的路径,如mkdir /home/ubuntu/database_backup/mysqlDb_dumps/
。后续脚本执行产生的备份文件即将保存在此路径下。
随后创建backup_mysql_database.sh文件,位置可自行定义,如本文则放置于/home/ubuntu/database_backup/
路径下。
通过nano /home/ubuntu/database_backup/backup_mysql_database.sh
命令编辑脚本文件,开始编写程序。
2.1.2. 备份主程序的编写
首先定义几个常用的变量,在后续代码中可以直接引用:
#预定义 rq=`date +%Y%m%d-%H%M%S` ip=120-27-151-217 new_file_path=${rq} user='dump' psw='db_dump@217#' dump_file_path_base_str=/home/ubuntu/database_backup/mysqlDb_dumps/ dump_file_path_str=${dump_file_path_base_str}${new_file_path}'/'
以当前日期及时间为标识(为避免重名,可另行随意设计),创建一个子目录,用于保存当前时间生成的备份文件。
cd ${dump_file_path_base_str} mkdir ${new_file_path}
使用mysqldump命令实现数据库备份及备份文件本地路径保存
主要命令脚本如下:
mysqldump -u<用户名> -p<密码> -h<host名称或ip地址> <要备份的数据库名称> ><生成备份脚本的文件命名与路径>.sql
如:
#备份oa_supervaliant_database数据库
db_name_1=oa_supervaliant_database
dump_file_name_1=${dump_file_path_str}'mysqldb_'${ip}'_'${db_name_1}'_'${rq}
mysqldump -u${user} -p${psw} -hlocalhost ${db_name_1}>${dump_file_name_1}.sql
#备份information_schema数据库
db_name_2=information_schema
dump_file_name_2=${dump_file_path_str}'mysqldb_'${ip}'_'${db_name_2}'_'${rq}
mysqldump -u${user}-p${psw} -hlocalhost ${db_name_2}>${dump_file_name_2}.sql
这段代码执行完,将会在/home/ubuntu/database_backup/mysqlDb_dumps/
路径下生成一个以当前日期时间命名的文件夹,其中储存了上一步生成的数据库备份文件:
2.1.3. 使用scp命令打包备份文件并发送至远程地址
为了多一层数据安全保障,本地生成的数据库备份文件可以打包并发送至另一台服务器。
具体实现方式如下:
- 设置压缩文件的名称及储存位置
首先预定义压缩文件及文件路径等基本属性:
dump_tar_file_name='mysqldb_'${ip}'_'${rq} #定义压缩文件命名
cd ${dump_file_path_base_str} #进入备份文件路径,打包生成的文件将保存在此处
按照上一步的设置,打包前几步生成的数据库备份文件
tar -cvf ${dump_tar_file_name}.tar ${dump_file_path_str} #将最新生成的文件夹内全部sql备份文件打包
用scp命令发送打包好的包文件至指定远程服务器的ip及路径
示例代码如下:
#发送至120.27.151.228服务器
remote_server1_ip=120.27.151.228
remote_server1_file_addr=/usr/local/mysqlDB_dumps_remote/120-27-151-217/
scp ${dump_file_path_base_str}${dump_tar_file_name}.tar root@${remote_server1_ip}:${remote_server1_file_addr}${dump_tar_file_name}.tar
set timeout 300
#发送至118.89.106.215服务器
remote_server2_ip=118.89.106.215
remote_server2_file_addr=/usr/local/mysqlDB_dumps_remote/120-27-151-217/
scp ${dump_file_path_base_str}${dump_tar_file_name}.tar root@${remote_server2_ip}:${remote_server2_file_addr}${dump_tar_file_name}.tar
set timeout 300
2.1.4. 附完整代码如下
#预定义
rq=`date +%Y%m%d-%H%M%S`;
ip=47-100-64-208;
new_file_path=${rq};
dump_file_path_base_str=/home/ubuntu/database_backup/mysqlDb_dumps/;
dump_file_path_str=${dump_file_path_base_str}${new_file_path}'/';
cd ${dump_file_path_base_str};
mkdir ${new_file_path};
#备份选定MySQL数据库
do_dump_MySQL_database(){
ip=47-100-64-208;
user=dump;
psw=mysql_dump_psw;
db_name=$1;
dump_file_path_str=$2;
new_file_path=$3;
dump_file_name=${dump_file_path_str}'mysqldb_'${ip}'_'${db_name}'_'${new_file_path};
echo ${dump_file_name};
mysqldump -u${user} -p${psw} -hlocalhost ${db_name}>${dump_file_name}.sql;
}
#以scp命令发送文件至远程服务器
scp_send_file_to_remote_server(){
dump_file_path_base_str=$1;
dump_tar_file_name=$2;
remote_server_ip=$3;
remote_server_file_addr=$4;
scp ${dump_file_path_base_str}${dump_tar_file_name}.tar root@${remote_server_ip}:${remote_server_file_addr}${dump_tar_file_name}.tar;
#set timeout 300;
}
#执行数据库备份并保存至本地路径
###备份oa_center_database中央数据库
do_dump_MySQL_database oa_center_database ${dump_file_path_str} ${new_file_path};
###备份oa_database数据库
do_dump_MySQL_database oa_database ${dump_file_path_str} ${new_file_path};
#打包备份文件
##定义备份文件范围及新备份压缩文件名称路径
dump_tar_file_name=mysqldb_${ip}_${rq};
#执行打包
cd ${dump_file_path_base_str};
tar zcvfP ${dump_tar_file_name}.tar ${dump_file_path_str};
#发送打包备份文件至其他服务器
scp_send_file_to_remote_server ${dump_file_path_base_str} ${dump_tar_file_name} 106.15.226.150 /usr/local/mysqlDB_dumps_remote/${ip}/;
scp_send_file_to_remote_server ${dump_file_path_base_str} ${dump_tar_file_name} 118.89.106.215 /usr/local/mysqlDB_dumps_remote/${ip}/;
2.2. 将执行脚本添加到系统任务列表
到这一步,数据库备份,备份文件远程传输等主要功能已完成,但需要手动执行,而不能自动执行。
如需设置脚本自动执行,则需要把计划任务添加到列表。系统每分钟会扫描一次任务列表,探测当前时间下是否有待执行的任务。
具体执行步骤如下:
2.2.1. 为脚本设置可执行权限
进入脚本文件所在路径,输入chmod +x <脚本文件名称>
命令,授予这个文件的执行权限。
通过这一步设置,只要直接输入文件名称,脚本将会直接运行。
现在可以尝试运行脚本,确认脚本内容可正确执行(这是进行下一步设置的必要条件,否则脚本不会执行成功)。
在这一步测试中,脚本文件可能会报
$'\r': command not found
错误。这通常是因为脚本文件中的换行符出现了问题。通过sed -i 's/\r$//' <filename>
命令,将脚本内容转为unix格式,即可修复。
2.2.2. 修改/etc/crontab文件,向系统计划任务清单中添加上述脚本
输入nano -w /etc/crontab
命令,在列表中添加:
0 2 * * * root /home/ubuntu/database_backup/backup_mysql_database.sh
表示每天2:00以root用户执行/home/ubuntu/database_backup/backup_mysql_database.sh
如需对脚本执行事件进行记录,可以将任务指向日志文件,如:
0 2 * * * root /home/ubuntu/database_backup/backup_mysql_database.sh >> /home/ubuntu/database_backup/backup_logs
2.2.3. 重启crontab,使其生效:
/etc/init.d/cron restart
至此,上述脚本将在设定的时间下自动执行。