zoukankan      html  css  js  c++  java
  • 阿里云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 -e  //进入调度器编辑窗口
      //编写如下命令
      10 1 * * * /home/software/mysql/backupapp/backupapp.sh
      //注意事项:保证/home/software/mysql/backupapp/backupapp.sh至少有读和可执行权限
    • 重启crontab使命令生效,命令如下:
      systemctl restart crond

    至此,阿里云CentOS自动备份MySql 8.0并上传至七牛云 已经结束;

    如果这篇博文对你有所帮助,麻烦动动手指点个赞^-^

    作者:微沙
             
    本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    艾伟:[WCF中的Binding模型]之六(完结篇):从绑定元素认识系统预定义绑定 狼人:
    艾伟:.NET框架4.0中都有些什么? 狼人:
    艾伟:WM有约(三):下一次是什么时候? 狼人:
    艾伟:为什么微软要推 ADO.NET Data Services Framework 狼人:
    艾伟:WM有约(二):配置信息 狼人:
    艾伟:F4何去何从 大视野观察Framework 4.0 狼人:
    艾伟:[WCF的Binding模型]之三:信道监听器(Channel Listener) 狼人:
    艾伟:.NET : 如何保护内存中的敏感数据? 狼人:
    艾伟:Silverlight 2.0 之旋转木马 狼人:
    艾伟:.NET和J2EE该相互学习什么 狼人:
  • 原文地址:https://www.cnblogs.com/xrzs/p/10651614.html
Copyright © 2011-2022 走看看