1. 程式人生 > >Ubuntu Linux定時備份資料庫,並上傳到阿里雲OSS

Ubuntu Linux定時備份資料庫,並上傳到阿里雲OSS

生產環境中可能會遇到各種各樣的問題,為了防止資料丟失和容災,定時備份資料庫就顯得很重要了。本文使用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指令碼

輸入完成之後按ctrl + X 退出,退出之後按提示輸入Y,然後回車即可儲存。(命令列視窗下方提示的快捷鍵,^代表Ctrl,M代表Alt)

我們也可以直接編輯/etc/crontab來執行定時任務。區別為:crontab -e是某個使用者的週期計劃任務;/etc/crontab是系統的週期任務