阿里云CentOS自动备份MySql 8.0并上传至七牛云
本文主要介绍一下阿里云CentOS7下如何对MySql 8.0数据库进行自动备份,并使用.NET Core 将备份文件上传至七牛云存储上,并对整个过程所踩的坑加以记录.
环境、工具、准备工作
- 服务器:阿里云64位CentOS 7.4.1708版本;并安装MySql 8.0 数据库(如何安装点击)
- 客户端:Windows 10;
- SFTP客户端:FileZilla;用来进行文件传输;
- SSH工具:Putty;用来在Windows 上远程访问CentOS;
编写Shell脚本实现自动备份MySql数据库
1.创建相关目录
使用mkdir命令创建两个目录,一个用来存放Shell和上传七牛云的APP;命令如下
mkdir /home/software/mysql/backupapp //此目录用来存放相关shell和应用程序 mkdir /home/software/mysql/backupfiles //此目录用来存放mysql的备份文件
2.编写MySQL备份Shell
- 使用命令进如shell存放的目录,命令如下:
cd /home/software/mysql/backupapp
- 创建备份的shell文件,命令如下:
vi backup.sh //vi命令学习
- 编写mysql备份shell命令,内容如下:
db_user="dbuser" //输入你的数据库用户名
db_password="password" //输入你的数据库密码
db_name="dbname" //输入你要备份的数据库名 mysqldump -u$db_user -p$db_password $db_name | gzip > /home/software/mysql/backupfiles/$(date +%Y%m%d%H%M%S).sql.gz
//将导出的脚本按照年月日时分秒命名并压缩成gz文件,要保证/home/software/mysql/backupfiles存在,并注意脚本不能在windows环境下编写,注意脚本的空格与相关字符的全半角. -
测试脚本是否正常,命令如下:
sh /home/software/mysql/backupapp/backup.sh
//没有错误信息或者提示 Using a password on the command line interface can be insecure 表示正常
cd /home/software/mysql/backupfile //进入备份文件目录并使用ls命令查看是否备份成功 -
设置shell的权限并设置可运行,命令如下:
chmod 777 /home/software/mysql/backupapp/backup.sh //chmod命令学习
3.设置crontab实现自动执行Shell备份数据库
- 创建定时任务使备份脚本能定时运行,命令如下:
crontab -e //进入调度器编辑窗口
//编写如下命令,此命令表示每天凌晨01:00分执行脚本backup.sh crontab命令学习
0 1 * * * /home/software/mysql/backupapp/backup.sh
//注意事项:保证/home/software/mysql/backupapp/backup.sh至少有读和可执行权限
//为方便测试可设置10 * * * * 表示每10分钟执行一次shell - 重启crontab使命令生效,命令如下:
systemctl restart crond
开发APP实现将数据库备份文件上传至七牛云
1.注册七牛云(已注册可忽略)
因为七牛云免费提供10G的对象存储空间,所以本文选择七牛云做远程备份.相关注册操作请跳转至七牛云并创建存储空间.
2.新建控制台应用程序编写代码实现上传功能
使用.NET Core创建一个Console应用程序,并使用NuGet安装Newtonsoft.json和Qiniu.Shared;上传功能代码如下:
using Microsoft.Extensions.Configuration; using Qiniu.Common; using Qiniu.Http; using Qiniu.IO; using Qiniu.IO.Model; using Qiniu.Util; using System; using System.IO; using System.Runtime.InteropServices; namespace QiniuManagerApp { internal class Program { private const string AccessKey = "";//设置七牛AccessKey private const string SecretKey = "";设置七牛SecretKey private const string Bucket = "";//设置你的Bucket,就是你新建的存储空间名称 private static void Main(string[] args) { var systemPath = Environment.CurrentDirectory; if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { systemPath = Path.GetDirectoryName(typeof(Program).Assembly.Location); } var logPath = systemPath + @"/logs/"; var uploadBackupPath = systemPath + @"/filebackup/"; DeleteFile(uploadBackupPath, 7); var config = new ConfigurationBuilder() .SetBasePath(systemPath) .AddJsonFile("appsettings.json") .Build(); //读取配置 var filePath = config["filePath"]; if (!string.IsNullOrEmpty(filePath)) { Console.WriteLine("当前文件路径:" + filePath); var logName = DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; if (!File.Exists(logPath + logName)) { File.Create(logPath + logName); } using (StreamWriter sw = new StreamWriter(logPath + logName, true)) { try { var files = Directory.GetFiles(filePath); if (files.Length > 0) { sw.WriteLine("[Start]============================================================================================================================="); for (int i = 0; i < files.Length; i++) { FileInfo file = new FileInfo(files[i]); if (file.Extension == ".gz") { sw.WriteLine($"[DateTime]: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff")}"); var reslut = string.Empty; if (UploadFile(file.DirectoryName + @"/", file.Name, out reslut)) { sw.WriteLine($"[FileName]:{file.Name} upload successfully."); Console.WriteLine($"[FileName]:{file.Name} upload successfully."); file.MoveTo(uploadBackupPath + @"/" + file.Name); } else { sw.WriteLine($"[FileName]:{file.Name} upload unsuccessfully."); Console.WriteLine($"[FileName]:{file.Name} upload unsuccessfully."); sw.WriteLine($"[ Result ]:{reslut}"); } } sw.WriteLine(); } sw.WriteLine("[ End ]============================================================================================================================="); } } catch (Exception ex) { sw.WriteLine("[Exception]============================================================================================================================="); sw.WriteLine(ex.Message); sw.WriteLine("[Exception]============================================================================================================================="); throw; } } Console.WriteLine("上传完成!"); } } private static bool UploadFile(string filePath, string fileName, out string error) { Mac mac = new Mac(AccessKey, SecretKey); // 设置上传策略,详见:https://developer.qiniu.com/kodo/manual/1206/put-policy PutPolicy putPolicy = new PutPolicy(); // 设置要上传的目标空间 putPolicy.Scope = Bucket; // 上传策略的过期时间(单位:秒) putPolicy.SetExpires(3000); // 生成上传token string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString()); // 设置上传区域 Config.SetZone(ZoneID.CN_North, false); // 表单上传 FormUploader target = new FormUploader(); // 上传文件 var fileBytes = File.ReadAllBytes(filePath + fileName); HttpResult result = target.UploadData(fileBytes, fileName, token); error = result.ToString(); if (result.Code == 200) { return true; } return false; } private static void DeleteFile(string filePath, int createdDays) { if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } DirectoryInfo di = new DirectoryInfo(filePath); var files = di.GetFiles(); for (int i = 0; i < files.Length; i++) { if (files[i].CreationTime >= DateTime.Now.AddDays(createdDays)) { files[i].Delete(); } } } } }
//appsetting.json的内容,文件要新建,默认console程序没有该文件 { "filePath": "/home/software/mysql/backupfiles"//设置你MySQL备份文件所在路径 }
注意事项:
- 注意设置七牛云相关配置如AccessKey ,SecretKey ,Bucket 选择正确的上传区域;
- 发布程序时,需要将console依赖的相关文件都拷贝至应用程序根目录下(此处可能是.NET Core的一个bug);
- 注意区分获取程序根目录的方式(在Linux服务器和Window 服务器获取方式不一样)
3.将Console部署至阿里云CentOS并进行测试
- 将程序部署至CentOS(参见此文或官方文档),目录路径为:/home/software/mysql/backupapp/qiniuapp
- 使用chmod命令,设置console程序的可执行权限;命令如下:
chmod 777 /home/software/mysql/backupapp/qiniuapp/QiniuManagerApp.dll
- 测试程序;命令如下:
dotnet /home/software/mysql/backupapp/qiniuapp/QiniuManagerApp.dll
- 进入七牛站点,查看文件是否上传成功;
- 编写app shell脚本;内容如下:
cd /home/software/mysql/backupapp vi backupapp.sh
//编写如下内容:
dotnet /home/software/mysql/backupapp/qiniuapp/QiniuManagerApp.dll
4.设置crond 实现自动将备份文件上传至七牛云
- 创建定时任务使备份App能定时运行,命令如下:
- 重启crontab使命令生效,命令如下:
systemctl restart crond
至此,阿里云CentOS自动备份MySql 8.0并上传至七牛云 已经结束;
如果这篇博文对你有所帮助,麻烦动动手指点个赞^-^
作者:微沙
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。