最近新入手了台廉价vps,服务器中装了个Docker,在docker中装了一些仅供自己使用的一些服务程序,其中有些程序会使用到一些MySQL或者是sqlite等数据库,这些数据库文件都是通过挂载的方式实现的,为了以防万一决定做个方案备份一些重要的文件,于是乎又可以水一篇文章了[aru_17]。
在实现这一解决方案中使用到的技术有Shell和Python,为什么不直接用shell呢? 因为我比较懒吧,毕竟腾讯云官方提供了sdk就可以直接使用。还有为什么选择腾讯云而不是其他方式? 本人再用的存储服务有腾讯和阿里的,没想什么,就直接用腾讯云了呗[aru_71]。
什么是腾讯云Cos?
腾讯云COS与阿里云的OSS都是提供对象存储的服务,(即文件存储)。比如图片,压缩包,安装包,视频,各种网站静态文件等(反正绝大多数格式的文件都能上传,而且还是免费额度,对我来说已经够用了)。
开始咯
首先打开腾讯云官网,没有账号就注册一个腾讯云账号然后实名认证什么的,这里就不在赘述了
然后打开腾讯云COS链接:https://cloud.tencent.com/product/cos
或者直接打开腾讯云控制面板直接开启:https://console.cloud.tencent.com/cos
打开页面点击存储桶列表,然后在点击创建存储桶,之后会弹出一个创建提示框
然后根据要求填写对应的名称和所属位置,位置推荐选离自己较近的,名称一经填写就不能更改
后面的几步,一般默认即可,有个加密选项,加不加密主要看你选择
创建成功后就可以在存储桶列表中看到它了,搞完这一步之后就可以搞服务器效果的了
这时在左侧侧边栏最下面找到SDK下载,并点进去,这里腾讯云提供很多语言的SDK,这里我们选择python
点击快速入门或者直接下载也可以,直接下载会打开这个链接:https://github.com/tencentyun/cos-python-sdk-v5
此时,您需要确保自己的服务器已经安装了python 如果你使用别的语言,就按你的情况来吧,我这里只说Python的
怎么安装python自行百度吧,网上很多(我装的python3版本的,我也推荐装3版本的)
在服务器之后在服务器运行以下指令:
pip install -U cos-python-sdk-v5
如果未配置pip环境变量的就使用这个命令:
python3 -m pip install -U cos-python-sdk-v5
出现这个样子时表示安装成功了
安装成功后,新建一个文件,可以使用vim一气呵成,终端执行 vim backup.py
,然后按下i改为插入模式,之后把以下代码粘贴上去
# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from qcloud_cos import CosServiceError
from qcloud_cos import CosClientError
import sys
import logging
def percentage(consumed_bytes, total_bytes):
"""进度条回调函数,计算当前上传的百分比
:param consumed_bytes: 已经上传/下载的数据量
:param total_bytes: 总数据量
"""
if total_bytes:
rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
print('\r{0}% '.format(rate))
sys.stdout.flush()
if __name__ == "__main__":
# 腾讯云COSV5Python SDK, 目前可以支持Python2.6与Python2.7以及Python3.x
# pip安装指南:pip install -U cos-python-sdk-v5
# cos最新可用地域,参照https://www.qcloud.com/document/product/436/6224
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
print(len(sys.argv))
if(len(sys.argv)==4):
fileType = sys.argv[1]
filePath = sys.argv[2]
oldFile = sys.argv[3]
print('path===:',filePath,' Type:',fileType,' oldfile ',oldFile)
else:
print('Plase Input FilePath And FileType!')
exit()
# 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在CosConfig中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成
bucket = '' #
secret_id = '' # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi
secret_key = '' # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi
region = 'ap-beijing' # 替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket
# COS支持的所有region列表参见https://www.qcloud.com/document/product/436/6224
token = None # 如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048
domain = None # domain可以不填,此时使用COS区域域名访问存储桶。domain也可以填写用户自定义域名,或者桶的全球加速域名
# 填写用户自定义域名,比如user-define.example.com,需要先开启桶的自定义域名,具体请参见https://cloud.tencent.com/document/product/436/36638
# 填写桶的全球加速域名,比如examplebucket-1250000000.cos.accelerate.myqcloud.com,需要先开启桶的全球加速功能,请参见https://cloud.tencent.com/document/product/436/38864
print(fileType!='site')
if fileType!='site' and fileType!='database':
print('File Type Error!')
exit()
cosPath ='/backup/' + fileType + '/' + filePath.split('/')[-1]
oldPath ='/backup/' + fileType + '/'+ filePath.split("/")[-1].split("_")[0]+"_"+str(int(filePath.split("/")[-1].split("_")[-1].split(".")[0])-int(oldFile))+"."+filePath.split("/")[-1].split("_")[-1].split(".")[1]+"."+filePath.split("/")[-1].split("_")[-1].split(".")[2]
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Domain=domain) # 获取配置对象
client = CosS3Client(config)
responseDel = client.delete_object(
Bucket=bucket,
Key=oldPath
)
#print(responseDel['Etag'])
# 高级上传接口(推荐)
response = client.upload_file(
Bucket=bucket,
LocalFilePath=filePath,
Key=cosPath,
PartSize=10,
MAXThread=10,
progress_callback=percentage
)
#print(response['ETag'])
然后在代码中填写与自己对应的信息,其中backet要填写存储桶的名称,如000-1557446978,可以在存储桶列表中查看,所属地也可以在这里看到
secret_id = '' # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi secret_key = '' # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi
修改完成后按键盘ESC,在输入 :backpu.py,之后在输入wq保存并退出,此时可以运行测试一下使用可以正常使用这脚本,在运行这个脚本时需要两个参数,分别存储的类型和文件所在路径地址以及文件过期时间(按天计算),如下所示
python3 backup.py database /root/shell/test.cn.gz 3
之后可以查看一下存储桶的文件列表中是否已存在这个文件,如果存在即表示可以正常使用。
前面的OK了就可以继续编写shell文件了
在backup.py的同级目录下运行 vim backup.sh
; 即可创建文件和编辑
#!/bin/bash
isDel=n
args=$#
isDel=${!args}
test -f /etc/profile && . /etc/profile >/dev/null 2>&1
baseDir=$(cd $(dirname $0) && pwd)
# 使用zip作为压缩
tar --version >/dev/null || (echo "未安装tar.gz请先安装" && exit 2)
TAR=$(which tar)
# 定义python版本
PYTHON=$(which python3)
MYSQLDUMP=$(which mysqldump)
# 上传文件函数
uploadToCOS()
{
# 下面的数字3是文件过期天数,每3天自动删除cos内存储文件
$PYTHON $baseDir/backup.py $1 $2 3
if [[ $? -eq 0 ]] && [[ "$isDel" == "y" ]]
then
test -f $2 && rm -f $2
fi
}
printHelp()
{
clear
printf '
=====================================帮助说明=========================================
1. 数据库备份:
1 [database]数据库备份
2: [dbname] 数据库名称
3: [mysqluser] 数据库用户名
4: [mysqlpassword] 数据库密码
5: [back_path] 临时目录(绝对路径)
6: [isDel] 备份完成后是否删除本地文件删除后面加 y
示 例:./backup.sh database dbname user 123456 /temp/
2. 备份网站或者文件:
1 文件或网站备份
2: [domain] 名称
3: [site_path] 文件路径
4: [back_path] 备份路径
5: [isDel] 删除文件 默认不删除,若删除最后加y参数
示 例:./backup.sh file test.cn /www/wwwroot/test.cn /temp/test.cn
'
exit 0
}
backupDB()
{
dbname=$1
mysqluser=$2
mysqlpd=$3
back_path=$4
test -d $back_path || (mkdir -p $back_path || echo "$back_path 不存在,请检查文件" && exit 2)
cd $back_path
#如果是要备份远程MySQL,则修改如下语句中localhost为远程MySQL地址
$MYSQLDUMP -hlocalhost -u$mysqluser -p$mysqlpd $dbname >$back_path/database_$dbname\_$(date +%Y%m%d)\.sql
test -f $back_path/database_$dbname\_$(date +%Y%m%d)\.sql || (echo "数据库导出失败,请检查路径" && exit 2)
$TAR zcf $back_path/database_$dbname\_$(date +%Y%m%d)\.tar.gz $back_path/database_$dbname\_$(date +%Y%m%d)\.sql && \
uploadToCOS database $back_path/database_$dbname\_$(date +%Y%m%d)\.tar.gz
}
backupFile()
{
domain=$1
site_path=$2
back_path=$3
test -d $site_path || (echo "$file_path 不存在,请检查文件" && exit 2)
test -d $back_path || (mkdir -p $back_path || echo "$back_path 不存在,请检查文件" && exit 2)
test -f $back_path/$domain\_$(date +%Y%m%d)\.tar.gz && rm -f $back_path/$domain\_$(date +%Y%m%d)\.tar.gz
$TAR -zcvf $back_path/$domain\_$(date +%Y%m%d)\.tar.gz $site_path && \
uploadToCOS site $back_path/$domain\_$(date +%Y%m%d)\.tar.gz
}
while [ $1 ]; do
case $1 in
'--database' | 'database' )
backupDB $2 $3 $4 $5 $6
exit
;;
'--file' | 'file' )
backupFile $2 $3 $4
exit
;;
* )
printHelp
exit
;;
esac
done
printHelp
粘贴进去之后按esc在输入:wq保存并退出,然后在终端输入运行./backup.sh,此时会显示使用帮助信息,如下图所示:
如果输入之后没有出现这个,可能是因为权限不足,使用以下语句为程序设置权限
chmod 755 backup.sh
注:如果是Ubuntu系统需要在前面加sudo
至此,基本上是可以了
测试及使用
现在可以提供命令来进行测试,比如要上传某文件目录或者是网站目录。可以使用以下示例
./backup.sh file test.cn /www/wwwroot/test.cn /temp/test.cn y
其中,backup.sh后面的file表示,这是一个文件目录或者是一个网站目录,后面的test.cn 可以是域名也可以是其他的,/www/wwwroot/test.cn这个为要备份的网站目录,/temp/test.cn 这是一个临时存放目录,备份同时会在这里生成一个tar.gz的压缩文件;后面的y是把本地服务器上的临时文件也删除的意思,建议使用,不填写默认不删除。运行命令后查看腾讯云存储桶,查看文件是否上传成功了。
备份数据库原理也是差不多,如下命令:
./backup.sh database dbname user 123456 /temp/ y
其中,backup.sh 后面的database表示数据库,第一此时为数据库名,第二个为数据库用户名,第三个为数据库密码,第四个为临时存放文件目录,最后还可以添加一个y参数,这个参数和上面文件的参数是一样的,都是删除临时文件的,建议使用。
如果以上测试都没有问题就可以进行下一步了。
定时任务
为了每天(或周期)可以定时备份文件,使用需要添加到corn定时任务中,如果还未安装,请自行安装
使用命令编辑
crontab -e
和vim编辑器是一样的,按键盘i插入内容,插入到最后一行,写入完成后按esc 在输入 :wq 保存并退出
重启corn
systemctl restart crond
查看任务列表
crontab -l
上图中 >> 号后面的是为了方便输出运行日志,可不用配置,直接使用即可。
然后就O啦。有说明问题可以在下方评论哦[aru_43]
本文作者为Mr.Bai,转载请注明。