實戰-將MySQL備份上傳到私有云(3)

zone發表於2018-08-05

閱讀本文大約需要 10 分鐘

實戰-MySQL定時全量備份(1)

實戰-MySQL定時增量備份(2)

實戰-將MySQL備份上傳到私有云(3)

概要

  • 引言
  • 回顧
  • 備份到私有云-python
  • 備份到私有云-nodejs
  • 備份到git私有倉庫

引言

傳送門:

實戰-MySQL定時全量備份(1)

實戰-MySQL定時增量備份(2)

前兩篇文章聊了 MySQL 的全量備份與增量備份,我們也學會了資料庫的備份與恢復。這也增強了我們資料庫的安全性。假如,我們整臺資料庫伺服器被劫持了,或者遇到了其他毀滅性的災難,即使備份了也沒個毛用,因為備份檔案也在同一臺伺服器啊。那麼我們就會想如何備份的同時,上傳到其他私有云,這樣我們就不用擔心了。於是便有了本文。

回顧

OK,學習了上兩篇文章,我們已經可以輕鬆地備份資料庫,也得到了以下指令碼檔案。而在下面指令碼的最後幾行,我新增了幾行將備份檔案上傳到私有云的程式碼。這裡我註釋掉了,如要使用請取消註釋。OK,現在讓我們一起打怪升級。

#!/bin/bash
#獲取當前時間
date_now=$(date "+%Y%m%d-%H%M%S")
backUpFolder=/home/db/backup/mysql
username="root"
password="123456"
db_name="zone"
#定義備份檔名
fileName="${db_name}_${date_now}.sql"
#定義備份檔案目錄
backUpFileName="${backUpFolder}/${fileName}"
echo "starting backup mysql ${db_name} at ${date_now}."
/usr/bin/mysqldump -u${username} -p${password}  --lock-all-tables --flush-logs ${db_name} > ${backUpFileName}
#進入到備份檔案目錄
cd ${backUpFolder}
#壓縮備份檔案
tar zcvf ${fileName}.tar.gz ${fileName}

# use nodejs to upload backup file other place
#NODE_ENV=$backUpFolder@$backUpFileName node /home/tasks/upload.js
date_end=$(date "+%Y%m%d-%H%M%S")
echo "finish backup mysql database ${db_name} at ${date_end}."
# 使用 nodejs 上傳備份檔案到 私有云
#NODE_ENV=$backUpFolder@$backUpFileName /root/node/v8.11.3/bin/node /usr/local/upload.js

# 使用 python 上傳備份檔案到 私有云
#python /use/local/upload.py $backUpFolder $backUpFileName
複製程式碼
# 使用 python 上傳備份檔案到 私有云
#python /use/local/upload.py $backUpFolder $backUpFileName
複製程式碼
$backUpFolder #備份檔案的所在目錄
$backUpFileName #備份檔名
複製程式碼

這兩個引數為傳給 upload.py 的引數。

# 使用 nodejs 上傳備份檔案到 私有云
#/root/node/v8.11.3/bin/node /usr/local/upload.js $backUpFolder $backUpFileName
複製程式碼

這兩個引數為傳給 upload.js 的引數。

##備份到私有云-python

這裡的私有云使用的是七牛雲,使用其他私有云請自行替換。以下指令碼中,替換你自己的 access_key、secret_key、bucket_name(儲存倉庫名) 即可使用。

from qiniu import Auth, put_file, etag
import sys
print('引數個數為:', len(sys.argv), '個引數。')
print('引數列表:', str(sys.argv))

# backUpFolder,獲取備份檔案的目錄
backUpFolder = sys.argv[1]
# backUpFileName,獲取備份檔案的檔名
backUpFileName = sys.argv[2]
import qiniu.config

# 需要填寫你的 Access Key 和 Secret Key
access_key = 'your_key'
secret_key = 'your_key'
# 構建鑑權物件
q = Auth(access_key, secret_key)
# 要上傳的空間
bucket_name = 'test'
# 上傳到七牛後儲存的檔名
key = backUpFileName
# 生成上傳 Token,可以指定過期時間等
token = q.upload_token(bucket_name, key, 3600)
# 要上傳檔案的本地路徑
localfile = backUpFolder + backUpFileName
ret, info = put_file(token, key, localfile)
print(info)
assert ret['key'] == key
assert ret['hash'] == etag(localfile)

複製程式碼

備份到私有云-nodejs

這裡的私有云使用的是七牛雲,使用其他私有云請自行替換。以下指令碼中,替換你自己的 access_key、secret_key、bucket(儲存倉庫名) 即可使用。

let qiniu = require("qiniu");
let arguments = process.argv.splice(2);
console.log(process.argv)
console.log('所傳遞的引數是:', arguments[0]);
console.log('所傳遞的引數是:', arguments[1]);
let file = arguments[1];
let filePath = arguments[0] + '/' + file;
console.log(filePath);
bucket = "test"//你的儲存空間名

//需要填寫你的 Access Key 和 Secret Key
let accessKey = 'access_key';
let secretKey = 'secret_key';


let config = new qiniu.conf.Config();
// 空間對應的機房,選擇機房得看七牛的文件:https://developer.qiniu.com/kodo/sdk/1289/nodejs#form-upload-file
config.zone = qiniu.zone.Zone_z0;
let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
let options = {
    scope: bucket,
};
let putPolicy = new qiniu.rs.PutPolicy(options);
let uploadToken=putPolicy.uploadToken(mac);


let localFile = filePath;
let formUploader = new qiniu.form_up.FormUploader(config);
let putExtra = new qiniu.form_up.PutExtra();
let key = file;
// 檔案上傳
formUploader.putFile(uploadToken, key, localFile, putExtra, function (respErr, respBody, respInfo) {
    if (respErr) {
        throw respErr;
    }
    if (respInfo.statusCode == 200) {
        console.log(respBody);
    } else {
        console.log(respInfo.statusCode);
        console.log(respBody);
    }
});
複製程式碼

image-20180804160927893.png

上圖為我本地執行指令碼檔案上傳 README.md 的截圖。上傳成功。

備份到git私有倉庫

github 中的私有倉庫需要付費,可以選擇碼雲來作為私有倉庫,其私有倉庫的免費的。

#!/bin/bash
#獲取當前時間
date_now=$(date "+%Y%m%d-%H%M%S")
backUpFolder=/home/db/backup/mysql
username="root"
password="123456"
db_name="zone"
#定義備份檔名
fileName="${db_name}_${date_now}.sql"
#定義備份檔案目錄
backUpFileName="${backUpFolder}/${fileName}"
echo "starting backup mysql ${db_name} at ${date_now}."
/usr/bin/mysqldump -u${username} -p${password}  --lock-all-tables --flush-logs ${db_name} > ${backUpFileName}
#進入到備份檔案目錄
cd ${backUpFolder}
#壓縮備份檔案
tar zcvf ${fileName}.tar.gz ${fileName}

# use nodejs to upload backup file other place
#NODE_ENV=$backUpFolder@$backUpFileName node /home/tasks/upload.js
date_end=$(date "+%Y%m%d-%H%M%S")
echo "finish backup mysql database ${db_name} at ${date_end}."

git add .
git commit -m 'commit by script'
git push
複製程式碼

關注微信公眾號,回覆【mysql資源】,獲取 mysql 效能優化高階視訊教程

zone_qrcode.jpg

相關文章