生产环境中可能会遇到各种各样的问题,为了防止数据丢失和容灾,定时备份数据库就显得很重要了。本文使用crontab定时运行shell脚本,shell脚本中备份MySQL到本地并上传到阿里云OSS对象存储。
先看shell脚本(shell脚本处理了数据库备份,数据库备份同步上传云端,七天前数据库备份删除):
#!/bin/bash
Now=$(date +"%Y%m%d_%H%M%S")
sevenDaysAgo=`date +%F | sed 's/-//g'`
sevenDaysAgo=`expr $sevenDaysAgo - 7`
rm ./backup/price_$sevenDaysAgo*
rm ./backup/all_$sevenDaysAgo*
mysqldump -uuser -ppassword price | gzip > /home/ubuntu/learn/mysql/backup/price_$Now.sql.gz;
mysqldump -uuser -ppassword --all-databases | gzip > /home/ubuntu/learn/mysql/backup/all_$Now.sql.gz
NODE_ENV=$Now node /home/ubuntu/learn/mysql/upload.js
数据库备份文件上传到OSS,需要使用npm 安装ali-oss和co这两个库
var co = require('co');
var OSS = require('ali-oss');
var client = new OSS({
region: 'oss-cn-beijing',
accessKeyId: 'AccessKeyID',
accessKeySecret: 'AccessKeySecret';
});
co(function* (){
client.useBucket('data-backup-by-xiaozhu');
var result = yield client.put('price_'+process.env.NODE_ENV+'.sql.gz','/home/ubuntu/learn/mysql/backup/price_'+process.env.NODE_ENV+'.sql.gz');
var result2 = yield client.put('all_'+process.env.NODE_ENV+'.sql.gz','/home/ubuntu/learn/mysql/backup/all_'+process.env.NODE_ENV+'.sql.gz');
}).catch(function(err){
console.log(err);
})
有时候数据库备份的文件会很庞大,对象存储空间很可能会被塞满,我们就需要定时清理,阿里云OSS允许用户对Bucket设置生命周期规则,以自动淘汰过期掉的文件,节省存储空间。用户可以同时设置多条规则
var co = require('co');
var OSS = require('ali-oss');
var client = new OSS({
region: 'oss-cn-beijing',
accessKeyId: 'AccessKeyID',
accessKeySecret: 'AccessKeySecret'
});
co(function* () {
var result = yield client.putBucketLifecycle('data-backup-by-xiaozhu', 'region', [
{
id: 'rule1',
status: 'Enabled',
prefix: 'price_',
days: 7
},{
id:'rule2',
status:'Enabled',
prefix:'all_',
days:7
}
]);
console.log(result);
}).catch(function (err) {
console.log(err);
});
shell脚本完成了数据库备份和备份清理的操作,还需要进行定时执行shell脚本的操作,我们可以使用crontab。执行crontab -e命令,添加以下内容。
如果第一次执行crontab会让选择使用什么编辑器来编辑,我们选择默认的nano即可。
30 1 * * * /bin/sh /home/ubuntu/learn/mysql/dbBackUp.sh
输入完成之后按ctrl + X 退出,退出之后按提示输入Y,然后回车即可保存。(命令行窗口下方提示的快捷键,^代表Ctrl,M代表Alt)
我们也可以直接编辑/etc/crontab来执行定时任务。区别为:crontab -e是某个用户的周期计划任务;/etc/crontab是系统的周期任务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?