本文主要介紹一下阿里雲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並上傳至七牛雲 已經結束;
如果這篇博文對你有所幫助,麻煩動動手指點個贊^-^
作者:
微沙
本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
