mysql分別在windows和linux下的備份策略

嗟乎!

一、概述

mysql數據庫該怎么備份呢?

數據庫備份有幾個概念:全量備份、增量備份、差異備份。當然啦,數據庫備份又有冷備份和熱備份,即物理備份和邏輯備份之分。冷備份就是將mysql停了,然后直接拷貝它的數據文件,簡單粗暴。問題是,數據庫怎可輕易停止或重啟?所以我們通常說的備份都是指熱備份,即邏輯備份。邏輯備份包括全量備份、增量備份、差異備份。

全量備份就是整個庫備份。增量備份是將上一次全量備份或增量備份后的變化備份。差異備份是將上次全量備份后的變化備份。所以增量備份和差異備份有重疊。由于mysql中,并不直接支持所謂增量備份或差異備份,所謂的加過濾條件簡直就是瞎掰,根本不屬于自動備份的概念,毫無意義。mysql只能通過拷貝二進制日志文件(BinLog)來實現增量備份的效果,聊勝于無。BinLog里面,記錄了對mysql的增刪改,而沒有記錄查,所以重新執行這個BinLog就可以達到增量備份的效果。有關BinLog,可以參考拙作(mysql的日志文件)

二、備份思路

將備份命令寫到批處理文件,然后定期運行它們。windows的可以用操作系統的任務計劃來定期執行批處理;linux可以設置定時器crontab。

另外,備份文件一般比較大,為長久計,備份之后,應將備份文件壓縮。

三、windows

1、全量備份

@echo off
rem 設置 MySQL 用戶名和密碼
set MYSQL_USER=數據庫賬號
set MYSQL_PASSWORD=密碼
set DATABASE=待備份的數據庫名稱
rem mysql數據文件路徑。一般在mysql安裝路徑,可在mysql.ini里設置。
set MYSQL_BIN=e:\mysql\data\
rem 設置備份文件路徑
set BACKUP_PATH=C:\temp\backuprem 獲取當前時間戳作為備份文件名
for /f "delims=" %%a in ('powershell -command "Get-Date -Format 'yyyyMMdd_HHmmss'"') do set TIMESTAMP=%%aset FULL_BACKUP_FILE=%BACKUP_PATH%\full_backup_%TIMESTAMP%.sql
set COMPRESSED_FULL_BACKUP_FILE=%FULL_BACKUP_FILE%.ziprem 檢查是否已存在該時刻的備份文件,如果存在則不備份
if not exist %COMPRESSED_FULL_BACKUP_FILE% (rem 執行全量備份mysqldump -u%MYSQL_USER% -p%MYSQL_PASSWORD% %DATABASE% --single-transaction --routines --triggers > %FULL_BACKUP_FILE%echo Full Backup completed: %FULL_BACKUP_FILE%rem 壓縮備份文件。這里使用360zip360zip -ar %FULL_BACKUP_FILE% %COMPRESSED_FULL_BACKUP_FILE% rem 刪除備份文件del %FULL_BACKUP_FILE%
) else (echo Full Backup file already exists: %COMPRESSED_FULL_BACKUP_FILE%
)

2、增量備份

rem 設置 MySQL 用戶名和密碼
set MYSQL_USER=數據庫賬號
set MYSQL_PASSWORD=密碼
set DATABASE=待備份的數據庫名稱
rem mysql數據文件路徑。一般在mysql安裝路徑,可在mysql.ini里設置。
set MYSQL_BIN=e:\mysql\data\
rem 設置備份文件路徑
set BACKUP_PATH=C:\temp\backuprem 獲取當前時間戳作為備份文件名
for /f "delims=" %%a in ('powershell -command "Get-Date -Format 'yyyyMMdd_HHmmss'"') do set TIMESTAMP=%%arem 生成的備份文件名稱
set BINLOG_FILE=%BACKUP_PATH%\mysql-bin.%TIMESTAMP%
rem 壓縮后的備份文件名稱
set COMPRESSED_BINLOG_FILE=%BINLOG_FILE%.zip
rem 增量備份對應的position
set BINLOG_POSITION_FILE=%BACKUP_PATH%\binlog_position.txtrem 檢查是否已存在該時刻的二進制日志文件,如果存在則不備份
if not exist %COMPRESSED_BINLOG_FILE% (rem 獲取當前二進制日志文件名和位置for /f "tokens=1,2" %%i in ('mysql -u%MYSQL_USER% -p%MYSQL_PASSWORD% -e "SHOW MASTER STATUS" ^| find " " /v') do (set CURRENT_BINLOG_FILE=%%iset CURRENT_BINLOG_POSITION=%%j)rem 拷貝二進制日志文件到備份目錄copy /Y %MYSQL_BIN%%CURRENT_BINLOG_FILE% %BINLOG_FILE%rem 壓縮360zip -ar %BINLOG_FILE% %COMPRESSED_BINLOG_FILE%rem 刪除備份文件del %BINLOG_FILE%rem 將二進制日志信息保存到文件,增量備份恢復時使用echo %COMPRESSED_BINLOG_FILE% %BINLOG_POSITION% > %BINLOG_POSITION_FILE%       
) else (echo Compressed Binary log file already exists: %COMPRESSED_BINLOG_FILE%
)

四、linux

1、全量備份

#!/bin/bash# 設置 MySQL 用戶名和密碼
MYSQL_USER=數據庫賬號
MYSQL_PASSWORD=密碼
DATABASE=待備份的數據庫名稱
MYSQL_PORT=mysql端口
MYSQL_HOST=mysqlIP地址# 設置備份文件路徑
BACKUP_PATH="/home/admin/db-backup/files"# 獲取當前時間戳作為備份文件名
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")# 備份文件名
FULL_BACKUP_FILE="$BACKUP_PATH/full_backup_$TIMESTAMP.sql"# 檢查是否已存在備份文件,如果存在則不再創建
if [ ! -f "$FULL_BACKUP_FILE" ]; then# 執行全量備份mysqldump -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$DATABASE" --single-transaction --routines --triggers > "$FULL_BACKUP_FILE"# 壓縮全量備份文件gzip "$FULL_BACKUP_FILE"echo "Full Backup completed: $FULL_BACKUP_FILE"
elseecho "Full Backup file already exists: $FULL_BACKUP_FILE"
fi

2、增量備份

獲取當前二進制日志文件名和位置的時候,要使用mysql命令。由于該命令在bash文件中執行,可能系統會找不到mysql,提示未知命令,所以要指定mysql路徑。如果不清楚mysql安裝在什么地方,可以敲入:

which mysql

這樣可以得到mysql所在路徑,如:/usr/local/mysql/mysql-8.0/bin/mysql,
然后據此修改bash文件。

#!/bin/bash# 設置 MySQL 用戶名和密碼
MYSQL_USER=數據庫賬號
MYSQL_PASSWORD=密碼
DATABASE=待備份的數據庫名稱
MYSQL_PORT=mysql端口
MYSQL_HOST=mysqlIP地址# MySQL 數據文件路徑
MYSQL_BIN="/home/admin/mysql/data/"
# 設置備份文件路徑
BACKUP_PATH="/home/admin/db-backup/files"
# 獲取當前時間戳作為備份文件名
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")BINLOG_FILE="$BACKUP_PATH/mysql-bin.$TIMESTAMP"
COMPRESSED_BINLOG_FILE="$BINLOG_FILE.gz"
BINLOG_POSITION_FILE="$BACKUP_PATH/binlog_position.txt"# 檢查是否已存在二進制日志文件,如果存在則不再創建
if [ ! -f "$COMPRESSED_BINLOG_FILE" ]; then# 獲取當前二進制日志文件名和位置read -r CURRENT_BINLOG_FILE CURRENT_BINLOG_POSITION <<<$(/usr/local/mysql/mysql-8.0/bin/mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SHOW MASTER STATUS" | awk 'NR==2{print $1, $2}')# 拷貝并壓縮二進制日志文件到備份目錄cp "$MYSQL_BIN$CURRENT_BINLOG_FILE" "$BINLOG_FILE"gzip "$BINLOG_FILE"# 將二進制日志信息保存到文件,以備增量備份時使用echo "$COMPRESSED_BINLOG_FILE $BINLOG_POSITION" > "$BINLOG_POSITION_FILE"
elseecho "Compressed Binary log file already exists: $COMPRESSED_BINLOG_FILE"
fi

3、定時執行

1)首先將shell文件賦權為可執行文件。這一步好像不是必要的。

chmod 777 backup.sh

2)切換為超級管理員

su

3)設置定時器
輸入命令

crontab -e

在打開的界面中輸入

0 3 * * 6 sh /home/admin/db-backup/backup.sh

意思是每周六凌晨3點執行。

五、小結

mysql并不天然支持增量備份,這是我沒想到的。之前sql server不論是全量、差異備份,都有直接的命令,可以交替執行。mysql吹得天上有,地上無,感覺有些基本的配套功能都沒有。另外,mysql應該是國內最流行的數據庫了,按說相關教程、方案都非常完備了,稍微搜一下,資料就會一大把,但事實上好像并非如此。尤其這個差異備份、增量備份,我還真沒看到多少。這里面,原因可能是多方面的,一是mysql多用于互聯網,互聯網的特點就是迭代快,趕工厲害,很少有時間停下來總結一下。二是國內互聯網日益封閉,質量越來越差,搜索引擎都沒什么好搜的,也搜不到什么有價值的東西。如果不是chatGPT的指導,還真不容易寫出上面的批處理。

相關文章
mysql備份及還原
linux下設置定期執行需要root權限的sh文件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213460.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python入門第2篇

pip包管理器 包管理器類似.NET下的nuget&#xff0c;主要用于管理引用依賴項。 安裝Python的時候&#xff0c;已經默認安裝了pip包管理器&#xff0c;因此無需單獨安裝 cmd&#xff0c;輸入&#xff1a;pip --version 顯示pip版本號信息&#xff0c;即代表pip安裝成功&…

前端知識筆記(四十二)———http和https詳細解析

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一種用于在計算機網絡中傳輸超文本的協議。它是一個客戶端-服務器協議&#xff0c;用于從 Web 服務器傳輸超文本到本地瀏覽器。HTTP 使用 TCP/IP 協議作為底層傳輸協議&#xff0c;并使用默認端口號80。 HTTPS&…

8-tornado中模板的使用(通過字符串返回、通過模板Template返回、通過模板render返回)、模板案例

1 Template 1.1 通過字符串返回 import tornado class IndexHandler(web.RequestHandler):def get(self):arg Templateself.finish(f<h1>Hello {arg}!!</h1>)1.2 通過模板Template返回 tornado.template 一個簡單的模板系統&#xff0c;將模板編譯為Python代碼。…

c 一,二,三維數組的定義和賦值

1. 定義數組必須指定數組的大小&#xff0c;也就是用多少存儲空間來存儲此數組 2.定義數組必須用數組的標準格式定義&#xff1a;數組名下標的形式 3.只有字符串可以用指針來定義 4.可以把c 中一切數和struct 理解為char 數組 比如int 就是4字節的char數組 #include <…

編程語言的演進歷程與未來發展趨勢

第一代 編程語言的發展歷程起源于早期的機器語言階段&#xff0c;這是一種由二進制代碼構成的計算機能夠直接解讀并執行的語言。然而&#xff0c;鑒于其過于復雜且難以理解&#xff0c;故這一時代的語言并不常為人類所采納。 第二代 緊接著產生的第二代語言旨在簡化編程過程…

1001 害死人不償命的(3n+1)猜想

卡拉茲(Callatz)猜想&#xff1a; 對任何一個正整數 n&#xff0c;如果它是偶數&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇數&#xff0c;那么把 (3n1) 砍掉一半。這樣一直反復砍下去&#xff0c;最后一定在某一步得到 n1。卡拉茲在 1950 年的世界數學家大會上公布了…

C++ //習題2.5 請寫出下列表達式的值。

C程序設計 &#xff08;第三版&#xff09; 譚浩強 習題2.5 習題2.5 請寫出下列表達式的值。 (1) 3.5 * 3 2 * 7 - ‘a’ (2) 26 / 3 34 % 3 2.5 (3) 45 / 2 (int)3.14159 / 2 (4) a b (c a 6) 設a的初值為3 (5) a 3 * 5, a b 3 * 2 (6) (int)(a 6.5) % 2 …

UI自動化測試工具的定義及重要性

UI自動化測試工具在現代軟件開發中起著不可或缺的作用。它們能夠提高測試效率、減少人為錯誤、提供全面的測試覆蓋&#xff0c;并支持持續集成。通過有效使用UI自動化測試工具&#xff0c;開發團隊可以提高軟件質量&#xff0c;提供更可靠的應用程序&#xff0c;滿足用戶的需求…

C語言之數組精講(2)

目錄 數組的復制 輸入數組元素的值 對數組的元素進行倒序排列 使用數組進行成績處理 對象式宏 數組元素的最大值和最小值 賦值表達式的判斷 數組的元素個數 結語 數組的復制 我們把數組中的元素全部復制到另一個數組中。 #include<stdio.h>int main() {int i;int…

SwinIR: Image Restoration Using Swin Transformer

SwinIR 簡介 論文地址&#xff1a;SwinIR: Image Restoration Using Swin Transformer 代碼&#xff1a;SwinIR ? 本文提出了一個基于swin transformer的圖像超分模型swinIR。其中SwinIR分為三部分&#xff1a;淺層特征提取、深層特征提取和高質量圖像重建模塊。 現階段問…

WordPress如何通過header給頁面發送原生HTTP頭

在WordPress中&#xff0c;你可以使用header() 函數來發送原生HTTP頭。這個函數通常在主題文件&#xff08;例如header.php&#xff09;或者插件中使用。以下是一個簡單的例子&#xff0c;演示如何在WordPress中使用header() 函數發送原生HTTP頭&#xff1a; <?php // 在主…

19.java程序設計-基于SpringBoot的博客管理系統的設計與實現

摘要 隨著信息技術的迅速發展&#xff0c;博客作為一種重要的信息傳播和交流工具&#xff0c;逐漸在互聯網上占據重要地位。為了滿足用戶對個性化博客管理的需求&#xff0c;本研究設計并實現了一種基于Spring Boot框架的博客管理系統。 本系統通過采用前后端分離的架構&…

【算法題】密鑰格式化 (js)

!](https://img-blog.csdnimg.cn/direct/bf9a3d781a8043c997593260c0a8306f.png) 第一部分的字符可以少于… const str "5F3Z-2e-9w"; const str1 "2-5g-3-J"; function solution(num, str) {const arr str.split("-");const head arr[0];…

【C++11(三)】智能指針詳解--RAII思想循環引用問題

&#x1f493;博主CSDN主頁:杭電碼農-NEO&#x1f493; ? ?專欄分類:C從入門到精通? ? &#x1f69a;代碼倉庫:NEO的學習日記&#x1f69a; ? &#x1f339;關注我&#x1faf5;帶你學習C ? &#x1f51d;&#x1f51d; C11 1. 前言2. 為什么要有智能指針?3. RAII思想…

30.如何在Spring所有Bean創建完后做擴展?

如何在Spring所有Bean創建完后做擴展? 哪里才算所有的bean創建完了。 首先是所有的配置bean會注冊成BeanDefinition 然后根據BeanDefinition進行循環調用一個一個的getBean進行生產。 循環完所有的BeanDefiniton,通過BeanFactory的getBean方法生成所有的Bean 這個循環結…

LightDB - 支持substring_index 函數[mysql兼容]

從 23.4 版本開始&#xff0c; LightDB 支持 mysql 的substring_index 函數。下面對這個函數進行介紹 substring_index(str, delim, count ) 這個函數用于從指定字符串str中返回到達分隔符delim出現次數(count)之前的子字符串。。具體見之后用例&#xff1a; mysql 中介紹&a…

【BUG】微信小程序image不會隨著url動態變化

問題描述&#xff1a; 第一次打開界面&#xff0c;顯示的是默認頭像而不是用戶頭像&#xff0c;似乎image里面的src只要第一次有值就不會再更新了 解決 不要給src里面的變量設置初始值&#xff0c;而是直接賦空值

信息安全、網絡安全和數據安全的相互關系

最近正在開展安全方面的相關工作&#xff0c;因此就對這些概念做了一些分析&#xff0c;參考各種介紹和書籍&#xff0c;結合自身的認識&#xff0c;總結起來如下&#xff0c;信息安全、網絡安全、數據安全和基礎設施安全的關系究竟是什么&#xff0c;信息安全概念最大&#xf…

DevOps搭建(七)-安裝Jenkins詳細步驟

這里我們用Docker進行安裝 1、拉取Jenkins鏡像 Jenkins download and deployment 選擇LTS長期支持的版本,接著點擊Docker鏈接進入 找到上面的版本,并copy拉取鏡像的命令 docker pull jenkins/jenkins:2.426.1-lts 2、docker-compose安裝Jenkins 首先創建安裝目錄/home/f…

STM32 cubeMX 呼吸燈實驗

文章代碼使用 HAL 庫。 文章目錄 一、1.PWM原理二、LED 原理圖三、使用cubemx 配置 led四、PWM 相關函數五、PWM占空比占空比計算六、PWM 呼吸燈重要代碼總結 呼吸燈 一、1.PWM原理 PWM全稱為脈沖寬度調制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一種常…