1. 程式人生 > >淺談Mysql數據庫的備份方案

淺談Mysql數據庫的備份方案

all data dmi 51cto 刪除 redo 關於 skip date

自從入行幹IT互聯網已經有些年頭了,以前自己確實比較懶,從來不寫博文,從來不總結工作經驗,導致自身的技術提升的很慢,成長也是很慢,正兒八經的開始寫博文也是從去年才開始的,寫點東西,總結下,確實挺好,這樣回顧自己的過往,感覺自己還是多多少少留下了點東西,不至於回想起來太過空虛,太過遺憾。好了廢話不多說了,接下來分享點自己近4年來接觸MySQL數據備份這一塊的小經驗。

數據是一個互聯網公司的命脈,數據庫的安全以及備案的完整性是至關重要的,所以我們需要在工作中要很熟練的掌握數據的備份與恢復,這也是一個合格的運維DBA必須具有的職業技能

我這裏簡單總結MySQL的備份分為3種
分為冷備份,邏輯備份,熱備份

1、冷備份:

一般主要用於非核心業務,這類業務一般都是允許業務中斷的,冷備份的特點就是數度快,恢復時也最為簡單。通常直接復物理文件來實現冷備份

1.1備份過程:

第一關閉mysql服務
第二步就是把datas數據目錄(包含ibdata1)和日誌目錄(包含ib_logfile0,ib_logfile1,ib_logfile2)復制到磁盤,或者本地的另一塊磁盤裏

1.2恢復過程:

第一使用復制的數據目錄和日誌目錄替換原有的目錄
第二就是啟動mysql

2、邏輯備份MySQLdump

生產場景備份的命令:
生產場景不同引擎mysqldump備份命令
myisam引擎企業生產備份命令(適合所有引擎或混合引擎):

mysqldump -uroot -p123456 -A -B -F -R --master-data=2 -x --events|gzip >/opt/all.sql.gz

提示:-F也可以不用,與--master-data有些重復。
innodb引擎企業生產備份命令:推薦使用的

mysqldump -uroot -p123456 -A -B -F -R --master-data=2  --default-character-set=utf8  --events --single-transaction |gzip >/opt/all.sql.gz

提示:-F也可以不用。與--master-data有些重復。


--default-character-set=utf8 指定備份出的sql數據的字符集為utf8,當然,這個要提前知道線上的mysql庫全部采用的字符集都是utf8,否則在恢復到線上的庫會出現字符集不一致的問題出現亂碼

提示:邏輯備份一般是數據遷移或者數據量很小時采用,邏輯備份采用的是數據導出的方式

2.1mysqldump庫表等備份說明:

全備:

Mysqldump –uroot –p  -q –single-transaction –A >>all.sql

導出多個數據庫:

Mysqldump –uroot –p  -q –single-transaction –B  test01 wjw01 test02 >test01_wjw01_test02.sql

導出一個test庫的某張wjw01表:

Mysqldump –uroot –p  -q –single-transaction –b  test  wjw01>>test_wjw01.sql

只導出表結構:

Mysqldump –uroot –q –d  --skip-triggers

只需要導出儲存過程時:

Mysqldump –uroot –q -Rtdn  --skip-triggers 

只需要導出觸發器:

Mysqldump –uroot –p –q –tdn –triggers

只需要導出事件:

Mysqldump –uroot –p –q –Etdn –skip-triggers

只需要導出數據:

Mysqldump –uroot –p –q  --skip-transaction --skip-triggers –t

要想在線上建立一臺新的slave,則在master上執行如下命令:

Mysqldump –uroot –p –q –single-transaction –master-data=2 -A >>all.sql

提示:在mysql5.5裏增加了一個新的參數:--dump-slave,使用該參數可在slave端dump數據,建立新的slave,其目的是為了防止對主庫造成過大的壓力。

在slave上執行以下命令:

Mysqldump  -uroot –p  -A –dump-slave=2 –q –single-transaction >/tmp/all.sql
查看alls.sql 裏面會記錄slave上的那個點。

註意:--dump-slave用於在slave上dump數據,建立新的slave

2.2Mysqldump優缺點以及使用場景

優點:
1、恢復簡單,可以使用管道將他們輸入到mysql
2、與存儲引擎無關,因為是從MySQL服務器中提取數據而生成的,所以消除了底層數據存儲的不同
3、有助於避免數據損壞。若磁盤驅動器有故障而要復制原始文件時,此時將得到一個損壞的備份
缺點:
1、 必須有數據庫服務器完成邏輯工作,需要更多地cpu周期
2、 邏輯備份還原速度慢:需要MySQL加載和解釋語句、轉化存儲格式、重建引擎

使用場景:對於MySQL數據庫數據量不是很大的場景,建議使用。因為備份方便,簡單靈活,易操作
當數據庫特別的時候,比如30G以上時,備份MySQL數據時,也就建議不要采用mysqldump了,因為備份的時間以及恢復數據庫的時間太長了,會對庫表造成鎖,對線上的業務影響還是比較大的

2.3簡單介紹下MySQL全量備份+增量備份binlog

註意:生產上強烈建議MySQL開啟Row格式來記錄binlog,盡管這樣對磁盤的IO以及磁盤的空間的消耗是比較大,但是和數據的安全性、完整性相比,磁盤資源那都是小事

全量備份腳本內容:

#!/bin/bash
#mysql全量備份腳本建議在slave從庫上運行,從庫slave上建議開啟參數log_slave_updates=1
mkdir /backup
cd /backup
dateDIR=$(date +"%Y-%m-%d")
mkdir -p $dateDIR/data
path=/data/mysql/data
for n in `mysql -uroot -p123456 -e "show databases"|grep -v "Database"`
do
mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B $n|gzip >/backup/$dateDIR/data/${n}_$dateDIR.sql.gz
done
binlog_rm=$(tail -n 1 $path/mysql-bin.index|sed ‘s/.\///‘)
mysql -uroot -p123456 -e "purge binary logs to ‘$binlog_rm‘"
說明:這個全量備份腳本,會在導出的時候鎖住全局表,並且此時刷新產生一個新的bin-log,期間會產生寫操作的等待,直到導出結束後才會寫入新產生的bin-log文件,然後舊的bin-log 文件會被刪除刪除掉,一般在晚上2:00業務低峰期執行操作

進行本地bin-log增量備份

在執行完全量備份腳本後,就可以執行增量備份腳本了.
增量備份腳本思路很簡單:

先mysqladmin -uroot -p123456 flush-logs 刷新新的binlog文件,此時mysql寫入到新的binlog文件中。
然後把當前mysql數據庫存放binlog的目錄中拋去剛才最新生成的binlog文件,其余舊的binlog文件全部cp到本地服務器/backup/binlog  binlog的備份目錄下。
最後在登錄MySQL清除當前的binlog文件數減一
mysql -uroot -p123456 -e "purge binary logs to ‘mysql-bin.(n-1)‘"

3.熱備份與恢復

熱備份的方式也是直接復制數據物理文件,和冷備份一樣,但是熱備份可以不停機直接復制,一般用於7*24小時不間斷的重要核心業務。Mysql的社區版本熱備份工具InnoDB Hot Backup是付費的,只能試用30天,商業版才可以永久的使用,
Percona公司發布一個xtrabackup熱備工具,和付費的工具一樣,支持在線熱備(備份時不影響數據的讀寫)是商業工具InnoDB Hot Backup的一個很好的替代。
xtrabackup熱備工具是一個開源的工具,他可以非常快速的備份和恢復mysql數據庫。由於Xtrabackup支持備份innodb表,實際生產環境中我們使用的工具是innobackupex,它是對xtrabackup的一層封裝。innobackupex腳本用來備份非 InnoDB 表,同時會調用 xtrabackup命令來備份 InnoDB 表,innobackupex的基本流程如下:

1.開啟redo日誌拷貝線程,從最新的檢查點開始順序拷貝redo日誌;
2.開啟idb文件拷貝線程,拷貝innodb表的數據
3.idb文件拷貝結束,通知調用FTWRL,獲取一致性位點
4.備份非innodb表(系統表)和frm文件
5.由於此時沒有新事務提交,等待redo日誌拷貝完成
6.最新的redo日誌拷貝完成後,相當於此時的innodb表和非innodb表數據都是最新的
7.獲取binlog位點,此時數據庫的狀態是一致的。
8.釋放鎖,備份結束。

具體使用請參考博文:http://blog.51cto.com/wujianwei/1934084

關於Mysql數據庫的備份方案到此處就介紹完了,博主技術水平有限,如有不對,請及時指出。歡迎一起交流學習

淺談Mysql數據庫的備份方案