閱讀本文大約需要 10 分鐘
概要
- 引言
- 回顧
- 備份到私有云-python
- 備份到私有云-nodejs
- 備份到git私有倉庫
引言
傳送門:
前兩篇文章聊了 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);
}
});
複製程式碼
上圖為我本地執行指令碼檔案上傳 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
複製程式碼