阿里云CentOS自动备份MySql 8.0并上传至七牛云

时间:2022-09-20 00:22:55

本文主要介绍一下阿里云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  /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并上传至七牛云 已经结束;

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

作者:微沙

    

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

阿里云CentOS自动备份MySql 8.0并上传至七牛云的更多相关文章

  1. 上传文件到Ubuntu阿里云服务器(windows到Linux的文件上传)

    上传文件到Ubuntu阿里云服务器(windows到Linux的文件上传) 最近在阿里云上面租了一个轻量级服务器玩玩,学习学习怎么在服务器部署网站.然后嘞,在想要将本地文件上传到服务器的时候,自己研究 ...

  2. 图片上传到七牛云&sol;阿里云的OSS

    1.准备 七牛云/阿里云OSS https://github.com/pfinal/storage 2.composer安装包 安装 composer require pfinal/storage 本 ...

  3. CentOS自动备份MySql

    1.确认Crontab是否安装 service crond startcrontab -l 2.编写备份脚本 cd mkdir backup cd backup vim auto.sh /usr/bi ...

  4. 阿里云centos远程连接mysql

    首先在服务器管理控制台设置防火墙规则 添加规则 使用root登录到mysql 添加一个用户名,权限为%的远程连接用户 grant all on *.* to 'yuancheng'@'%' ident ...

  5. 170208、用Navicat自动备份mysql数据库

    数据库备份很重要,很多服务器经常遭到黑客的恶意攻击,造成数据丢失,如果没有及时备份的话,后果不堪设想. 一:备份的目的: 做灾难恢复:对损坏的数据进行恢复和还原 需求改变:因需求改变而需要把数据还原到 ...

  6. 用Navicat自动备份mysql数据库

    以下文章转载自https://blog.csdn.net/u013628152/article/details/54909885,放在自己的博客园以供后面方便查询 —————————————————— ...

  7. 定时备份 MySQL 并上传到七牛

    多数应用场景下,我们需要对重要数据进行备份.并放置到一个安全的地方,以备不时之需. 常见的 MySQL 数据备份方式有,直接打包复制对应的数据库或表文件(物理备份).mysqldump 全量逻辑备份. ...

  8. 阿里云 如何减少备份使用量? mysql数据库的完整备份、差异备份、增量备份

    RDS for MySQL备份.SQL审计容量相关问题_MYSQL使用_技术运维问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/4 ...

  9. 在CentOS下自动备份mysql

    在CentOS下自动备份mysql数据库,并差异同步到其它网络主机上 1.在/root/mysql_backup/下添加backup.sh:vim /root/mysql_backup/backup. ...

随机推荐

  1. &excl;&plus;&quot&semi;&bsol;v1&quot&semi; 能判断浏览器类型吗?

    我在 http://www.iefans.net/ie-setattribute-bug/ 中看到如此判断是否是IE,if(!+"\v1"){IE代码}else{其他浏览器代码}, ...

  2. PHP简介

    PHP PHP是运行在服务器端的脚本,可以运行在UNIX.LINUX.WINDOWS.Mac OS下.PHP的特性包括:1. PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语 ...

  3. Tomcat启动报错:Failed to initialize end point associated with ProtocolHandler &lbrack;&quot&semi;http-apr-8080&quot&semi;&rsqb;

    在用MyEclipse做开发,启动Tomcat的时候,控制台老是报错Failed to initialize end point associated with ProtocolHandler [&q ...

  4. 搭建yum源服务器

    在生产环境中,受到网络环境的影响,服务器可能带宽有限,连外网速度较慢或者局域网内的某些机器由于安全的限制,本身就不允许和外网和任何的连接.而这时候现在通过yum安装包或update包时就是一件比较麻烦 ...

  5. VBox 一款基于vue开发的音乐盒 序章

    己基于vue写了一个 Mplayer, github地址:https://github.com/xiangwenhu/MPlaer, 演示地址:http://babydairy2017.cloudap ...

  6. LOJ6001 - 「网络流 24 题」太空飞行计划

    原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...

  7. React 中无用但可以装逼的知识

    最近看了Dan Abramov的一些博客,学到了一些React的一些有趣的知识.决定结合自己的理解总结下.这些内容可能对你实际开发并没有什么帮助,不过这可以让你了解到更多React底层实现的内容以及为 ...

  8. js跨域请求jsonp解决方案-最简单的小demo

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  9. Spring Cloud开发实践 - 03 - 接口实现和下游调用

    接口实现 Scot Commons Impl 接口实现模块 scot-commons-impl, 一方面实现了 scot-commons-api 的接口, 一方面将自己暴露为 REST 服务. 有4个 ...

  10. jsoupa-解析遍历一个HTML

    解析个遍历一个HTML文档 String html ="<html><head><title>First parse</title></ ...