Ubuntu Linux定時備份資料庫,並上傳到阿里雲OSS
阿新 • • 發佈:2018-12-17
生產環境中可能會遇到各種各樣的問題,為了防止資料丟失和容災,定時備份資料庫就顯得很重要了。本文使用crontab定時執行shell指令碼,shell指令碼中備份MySQL到本地並上傳到阿里雲OSS物件儲存。
先看shell指令碼(shell指令碼處理了資料庫備份,資料庫備份同步上傳雲端,七天前資料庫備份刪除):
#!/bin/bash
#dbBackUp.sh //本shell指令碼名
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* #移除七天之前的整庫備份
#將price庫備份並壓縮到backup目錄下,檔名為price_+時間
mysqldump -uuser -ppassword price | gzip > /home/ubuntu/learn/mysql/backup/price_$Now.sql.gz;
#將MySQL中所有資料備份並壓縮到backup目錄下,檔名為all_+時間
mysqldump -uuser -ppassword --all-databases | gzip > /home/ubuntu/learn/mysql/backup/all_$Now .sql.gz
#執行上傳操作,將備份檔案同步到雲端,儲存在阿里雲物件儲存OSS中
NODE_ENV=$Now node /home/ubuntu/learn/mysql/upload.js
資料庫備份檔案上傳到OSS,需要使用npm 安裝ali-oss和co這兩個庫
/* upload.js */
var co = require('co');
var OSS = require('ali-oss');
var client = new OSS({
region: 'oss-cn-beijing',//上傳region節點,具體參照阿里雲提供列表
accessKeyId: 'AccessKeyID' ,
accessKeySecret: 'AccessKeySecret';
});
co(function* (){
client.useBucket('data-backup-by-xiaozhu');//上傳到的Bucket名稱
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設定生命週期規則,以自動淘汰過期掉的檔案,節省儲存空間。使用者可以同時設定多條規則
/* lifecycle.js */
/* 設定宣告週期規則,自動回收七天之外的資料庫備份 */
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', /*規則ID,用於標識一條規則,不能重複*/
status: 'Enabled', /*是否生效*/
prefix: 'price_', /*受影響的檔案字首,此規則只作用於符合字首的檔案*/
days: 7 /*指定距檔案最後修改時間N天過期*/
},{
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
#每天1點30分 執行dbBackUp指令碼