MYSQL增量備份和全量備份腳本分享

mysql的全量備份與增量備份

全量備份:可以使用mysqldump直接備份整個庫或者是備份其中某一個庫或者一個庫中的某個表。

增量備份:增量備份是針對于數據庫的bin-log日志進行備份的,需要開始數據庫的bin-log日志。增量備份是在全量的基礎上進行操作的。增量備份主要是靠mysql記錄的bin-log日志。(可以把二進制日志保存成每天的一個文件)。

生產環境:
建議一周或者三天進行一次全量備份,一天一次增量備份。

?

首先配置下mysql增量備份:

server-id ? ? ? ? ? ? ?= 1
log_bin ? ? ? ? ? ? ? ?= /var/log/mysql/mysql-bin.log
binlog-ignore-db ? ? ? = sys, mysql, information_schema, performance_schema
#設置日志格式
binlog_format = mixed

#設置日志路徑,注意路經需要mysql用戶有權限寫
log-bin = /data/mysql/logs/mysql-bin.log

#設置binlog清理時間
expire_logs_days = 7
#binlog每個日志文件大小
max_binlog_size = 100m

#binlog緩存大小
binlog_cache_size = 4m

#最大binlog緩存大小
max_binlog_cache_size = 512m

innodb_buffer_pool_size=64m
innodb_thread_concurrency = 8

?

?

1.MySQLdump增量備份
假定星期日下午1點執行全量備份,適用于MyISAM存儲引擎。
[root@test-huanqiu ~]# MySQLdump --lock-all-tables --flush-logs --master-data=2 -u root -p test > backup_sunday_1_PM.sql

對于InnoDB將--lock-all-tables替換為--single-transaction
--flush-logs為結束當前日志,生成新日志文件;
--master-data=2 選項將會在輸出SQL中記錄下完全備份后新日志文件的名稱,

用于日后恢復時參考,例如輸出的備份SQL文件中含有:
CHANGE MASTER TO MASTER_LOG_FILE=’MySQL-bin.000002′, MASTER_LOG_POS=106;

2.MySQLdump增量備份其他說明:
如果MySQLdump加上–delete-master-logs 則清除以前的日志,以釋放空間。但是如果服務器配置為鏡像的復制主服務器,用MySQLdump –delete-master-logs刪掉MySQL二進制日志很危險,因為從服務器可能還沒有完全處理該二進制日志的內容。在這種情況下,使用 PURGE MASTER LOGS更為安全。

每日定時使用 MySQLadmin flush-logs來創建新日志,并結束前一日志寫入過程。并把前一日志備份,例如上例中開始保存數據目錄下的日志文件 MySQL-bin.000002 , ...

1.恢復完全備份
mysql -u root -p < backup_sunday_1_PM.sql

2.恢復增量備份
mysqlbinlog MySQL-bin.000002 … | MySQL -u root -p注意此次恢復過程亦會寫入日志文件,如果數據量很大,建議先關閉日志功能

結合Linux的cron命令實現定時備份
比如需要在每天凌晨1:30備份某個主機上的所有數據庫并壓縮dump文件為gz格式
30 1 * * * mysqldump -u root -pPASSWORD --all-databases | gzip > /mnt/disk2/database_`date '+%m-%d-%Y'`.sql.gz

mysqldump全量備份+mysqlbinlog二進制日志增量備份
1)從mysqldump備份文件恢復數據會丟失掉從備份點開始的更新數據,所以還需要結合mysqlbinlog二進制日志增量備份。
首先確保已開啟binlog日志功能。在my.cnf中包含下面的配置以啟用二進制日志:
[mysqld]
log-bin=mysql-bin

2)mysqldump命令必須帶上--flush-logs選項以生成新的二進制日志文件:
mysqldump --single-transaction --flush-logs --master-data=2 > backup.sql
其中參數--master-data=[0|1|2]
0: 不記錄
1:記錄為CHANGE MASTER語句
2:記錄為注釋的CHANGE MASTER語句

?

下面分享一下自己用過的mysqldump全量和增量備份腳本

應用場景:
1)增量備份在周一到周六凌晨3點,會復制mysql-bin.00000*到指定目錄;
2)全量備份則使用mysqldump將所有的數據庫導出,每周日凌晨3點執行,并會刪除上周留下的mysq-bin.00000*,然后對mysql的備份操作會保留在bak.log文件中。

腳本實現:
1)全量備份腳本(假設mysql登錄密碼為123456;注意腳本中的命令路徑):

#!/bin/bash
# Program
# use mysqldump to Fully backup mysql data per week!
# History
# Path
today=`date +%Y%m%d`
whichday=`date -d $today +%w`
monday=`date -d "$today -$[${whichday}-1] days" +%Y%m%d`
Date=$monday
BakDir=/home/mysql/backup/$Date
LogFile=/home/mysql/backup/bak.log
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
if [ ! -d $BakDir ];thenmkdir -p $BakDir && mkdir -p $BakDir/daily
fi
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
mysqldump -uroot -phello123456 --quick --events --databases gaoke  --flush-logs --delete-master-logs --single-transaction > $DumpFile
/bin/tar -zvcf $GZDumpFile $DumpFile
/bin/rm $DumpFile
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 開始全量備份:$Begin 結束:$Last $GZDumpFile SUCC >> $LogFile
cd $BakDir/daily
/bin/rm -f *

如果備份多個數據庫那么:

mysqldump -u root -p --databases mysql stady > /opt/mysql-stady.sql

2)增量備份腳本(腳本中mysql的數據存放路徑是/home/mysql/data,具體根據自己的實際情況進行調整)

#!/bin/bash
# Program
# use cp to backup mysql data everyday!
# History
# Path
today=`date +%Y%m%d`
whichday=`date -d $today +%w`
monday=`date -d "$today -$[${whichday}-1] days" +%Y%m%d`
Date=$monday
BakDir=/home/mysql/backup/$Date/daily  #                   //增量備份時復制mysql-bin.00000*的目標目錄,提前手動創建這個目錄
BinDir=/var/lib/mysql           #                        //mysql的數據目錄
LogFile=/home/mysql/backup/bak.log
BinFile=$BinDir/mysql-bin.index  #         //mysql的index文件路徑,放在數據目錄下的
mysqladmin -uroot -phello123456 flush-logs        #這個是用于產生新的mysql-bin.00000*文件
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#這個for循環用于比對$Counter,$NextNum這兩個值來確定文件是不是存在或最新的
for file in `cat $BinFile`
dobase=`basename $file`#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./NextNum=`expr $NextNum + 1`if [ $NextNum -eq $Counter ]thenecho $base skip! >> $LogFileelsedest=$BakDir/$baseif(test -e $dest)#test -e用于檢測目標文件是否存在,存在就寫exist!到$LogFile去thenecho $base exist! >> $LogFileelseecho $base copying >> $LogFilecp $BinDir/$base $BakDirecho `date +"%Y年%m月%d日 %H:%M:%S"` $base  新的增量備份 Bakup succ! >> $LogFilefifi
done

3)設置crontab任務,執行備份腳本。先執行的是增量備份腳本,然后執行的是全量備份腳本:

[root@test-huanqiu ~]# crontab -e
#每個星期1凌晨3:00執行完全備份腳本
0 3 * * 1 /bin/bash -x /root/mysqlbackup/full_backup.sh >/dev/null 2>&1
#周2-7凌晨3:00做增量備份
0 3 * * 2-7 /bin/bash -x /root/mysqlbackup/binlog_backup.sh >/dev/null 2>&1

4)手動執行上面兩個腳本,測試下備份效果

[root@test-huanqiu backup]# pwd
/home/mysql/backup
[root@test-huanqiu backup]# mkdir daily
[root@test-huanqiu backup]# ll
total 4
drwxr-xr-x. 2 root root 4096 Nov 29 11:29 daily
[root@test-huanqiu backup]# ll daily/
total 0
先執行增量備份腳本
[root@test-huanqiu backup]# sh /root/Mysql-DailyBak.sh
[root@test-huanqiu backup]# ll
total 8
-rw-r--r--. 1 root root 121 Nov 29 11:29 bak.log
drwxr-xr-x. 2 root root 4096 Nov 29 11:29 daily
[root@test-huanqiu backup]# ll daily/
total 8
-rw-r-----. 1 root root 152 Nov 29 11:29 mysql-binlog.000030
-rw-r-----. 1 root root 152 Nov 29 11:29 mysql-binlog.000031
[root@test-huanqiu backup]# cat bak.log
mysql-binlog.000030 copying
mysql-binlog.000031 copying
mysql-binlog.000032 skip!
2016年11月29日 11:29:32 Bakup succ!
然后執行全量備份腳本
[root@test-huanqiu backup]# sh /root/Mysql-FullyBak.sh
20161129.sql
[root@test-huanqiu backup]# ll
total 152
-rw-r--r--. 1 root root 145742 Nov 29 11:30 20161129.sql.tgz
-rw-r--r--. 1 root root 211 Nov 29 11:30 bak.log
drwxr-xr-x. 2 root root 4096 Nov 29 11:30 daily
[root@test-huanqiu backup]# ll daily/
total 0
[root@test-huanqiu backup]# cat bak.log
mysql-binlog.000030 copying
mysql-binlog.000031 copying
mysql-binlog.000032 skip!
2016年11月29日 11:29:32 Bakup succ!
開始:2016年11月29日 11:30:38 結束:2016年11月29日 11:30:38 20161129.sql.tgz succ

5.增量備份恢復:

mysqlbinlog --no-defaults --start-datetime='18-07-03 21:56:11' --stop-datetime='18-07-03 21:56:04' mysql-bin.000003 | mysql -u root -p   #結束節點

?

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

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

相關文章

leetcode48. 旋轉圖像

給定一個 n n 的二維矩陣表示一個圖像。 將圖像順時針旋轉 90 度。 說明&#xff1a; 你必須在原地旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉圖像。 示例 1: 給定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋轉…

(一)nodejs循序漸進-nodejs環境安裝(基礎篇)

目錄 Node Node的優點 Node.js 安裝配置 使用nvm管理不同版本的 node 與 npm nvm 與 n 的區別 卸載全局安裝的 node/npm Windows 安裝 Linux 安裝 安裝多版本 node/npm 在不同版本間切換 列出已安裝實例 在多環境中&#xff0c;npm該如何使用呢&#xff1f; 其他命…

leetcode49. 字母異位詞分組

給定一個字符串數組&#xff0c;將字母異位詞組合在一起。字母異位詞指字母相同&#xff0c;但排列不同的字符串。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"], 輸出: [ ["ate",&quo…

(二)nodejs循序漸進-nodejs基本類型和循環條件語法篇(基礎篇)

目錄 入門之helloworld 進階之helloworld http服務器 步驟一、引入 required 模塊 步驟二、創建服務器 基本語法篇 變量聲明 基礎類型 if else 循環語句 for for ... in while do和do while 運算符 加減乘除 , , !, ! typeof null&#xff0c;undefine…

(三)nodejs循序漸進-值傳遞和引用傳遞,深拷貝和淺拷貝(基礎篇)

值傳遞和引用傳遞 值類型變量&#xff1a; 存在內存的堆中&#xff0c;比如:a1引用類型變量 &#xff1a; 1.指針存在于棧中&#xff0c;2.引用類型的具體內容存在于堆中 ex:let a{b:1} a的指針指向 堆中的地址0xffac0ec 正如我在 第二章 說的&#xff0c; numberstringbo…

(四)nodejs循序漸進-函數,類和對象(基礎篇)

上一篇文章講到了基本數據類型和運算符&#xff0c;相信大家都能做簡單的運算&#xff0c;本篇文章將講述函數&#xff0c;類&#xff0c;對象。 函數 在nodejs中&#xff0c;一個函數可以作為另一個函數的參數。我們可以先定義一個函數&#xff0c;然后傳遞&#xff0c;也可…

leetcode38. 外觀數列

「外觀數列」是一個整數序列&#xff0c;從數字 1 開始&#xff0c;序列中的每一項都是對前一項的描述。前五項如下&#xff1a; 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被讀作 "one 1" ("一個一") , 即 11。 11 被讀作 "two …

(五)nodejs循序漸進-回調函數和異常處理(基礎篇)

上篇文章我們講完了類和對象&#xff0c;接下來我們將要說回調函數. 我在第一篇說到nodejs的一個優勢是異步IO&#xff0c;實際上異步IO直接體現就是使用回調函數&#xff0c;當然不是用了回調函數&#xff0c;他就一定是異步IO的&#xff0c;因為inodejs是一個單線程函數&…

(六)nodejs循序漸進-數據流和文件操作(基礎篇)

Buffer JS 語言自身只有字符串數據類型&#xff0c;沒有二進制數據類型&#xff0c;因此 NodeJS 提供了一個與 String 對等的全局構造函數 Buffer 來提供對二進制數據的操作。除了可以讀取文件得到 Buffer 的實例外&#xff0c;還能夠直接構造&#xff0c;Buffer 與字符串類似…

leetcode171. Excel表列序號

給定一個Excel表格中的列名稱&#xff0c;返回其相應的列序號。 例如&#xff0c; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 輸入: "A" 輸出: 1 示例 2: 輸入: "AB" 輸出: 28 …

(七)nodejs循序漸進-模塊系統(進階篇)

模塊系統 為了讓Node.js的文件可以相互調用&#xff0c;Node.js提供了一個簡單的模塊系統。 模塊是Node.js 應用程序的基本組成部分&#xff0c;文件和模塊是一一對應的。換言之&#xff0c;一個 Node.js 文件就是一個模塊&#xff0c;這個文件可能是JavaScript 代碼、JSON 或…

(八)nodejs循序漸進-事件驅動(進階篇)

事件驅動程序 Node.js 使用事件驅動模型&#xff0c;當web server接收到請求&#xff0c;就把它關閉然后進行處理&#xff0c;然后去服務下一個web請求。 當這個請求完成&#xff0c;它被放回處理隊列&#xff0c;當到達隊列開頭&#xff0c;這個結果被返回給用戶。 這個模型…

leetcode304. 二維區域和檢索 - 矩陣不可變

給定一個二維矩陣&#xff0c;計算其子矩形范圍內元素的總和&#xff0c;該子矩陣的左上角為 (row1, col1) &#xff0c;右下角為 (row2, col2)。 上圖子矩陣左上角 (row1, col1) (2, 1) &#xff0c;右下角(row2, col2) (4, 3)&#xff0c;該子矩形內元素的總和為 8。 示例…

(九)nodejs循序漸進-Express框架(進階篇)

Express 框架 Express 是一個簡潔而靈活的 node.js Web應用框架, 提供了一系列強大特性幫助你創建各種 Web 應用&#xff0c;和豐富的 HTTP 工具。 使用 Express 可以快速地搭建一個完整功能的網站。 Express 框架核心特性&#xff1a; 可以設置中間件來響應 HTTP 請求。 定…

leetcode326. 3的冪 如此6的操作你想到了嗎

給定一個整數&#xff0c;寫一個函數來判斷它是否是 3 的冪次方。 示例 1: 輸入: 27 輸出: true 示例 2: 輸入: 0 輸出: false 示例 3: 輸入: 9 輸出: true 示例 4: 輸入: 45 輸出: false 進階&#xff1a; 你能不使用循環或者遞歸來完成本題嗎&#xff1f; 注意最后一句…

(十)nodejs循序漸進-高性能游戲服務器框架pomelo之介紹和安裝篇

目錄 Pomelo 安裝Pomelo 創建demoserver項目 pomelo命令 項目結構說明 pomelo框架 架構 服務器實現 客戶端請求與響應、廣播的抽象介紹 Pomelo pomelo是一個快速、可擴展、Node.js分布式游戲服務器框架&#xff0c;對游戲服務器開發感興趣的同學可以關注關注。 之前…

leetcode344. 反轉字符串 史上最簡單力扣題

編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 char[] 的形式給出。 不要給另外的數組分配額外的空間&#xff0c;你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 你可以假設數組中的所有字符都是 ASCII 碼表中的可打印字符。…

(十一)nodejs循序漸進-高性能游戲服務器框架pomelo之啟動流程和組件

游戲啟動過程 啟動入口 在使用pomelo進行游戲開發時&#xff0c;工程目錄下的app.js是整個游戲服務器的啟動運行入口。app.js中創建項目&#xff0c;進行默認配置并啟動服務器的代碼如下&#xff1a; var pomelo require(pomelo); var app pomelo.createApp(); app.set(na…

(十二)nodejs循序漸進-高性能游戲服務器框架pomelo之創建一個游戲聊天服務器

上個章節我們簡單介紹了下pomelo的安裝和目錄結構&#xff0c;有讀者可能覺得有點吃不消&#xff0c;為什么不再深入講一講目錄結構和里邊的庫&#xff0c;這里我就不費口舌了&#xff0c;大家可以去官網參考文檔說明&#xff0c;本文只告訴大家如何利用這個框架來開發自己的東…

看這玩意復習你還會掛科?《軟件工程篇》

軟件工程&#xff1a;是指導軟件開發和維護的一門工程學科 三要素方法/工具/開發過程 價值&#xff1a;促進項目成功 現代產品開發三原則&#xff1a;功用性、可行性、稱許性 軟件過程是軟件工程的核心組成部分。 迭代 &#xff1a;反復求精 增量&#xff1a;逐塊建造 需…