MySQL的備份的一些策略和方法的總結


1.一般使用的是mysqldump來進行備份,每次dump的數據是1000條,並且在這個過程中會進行鎖表。

(這種方式是邏輯備份,即直接將數據庫中的數據導成sql語句進行備份的過程)

主要的使用方法:

(1).不帶參數的進行備份:

1 備份test數據庫中的所有表數據和表結構
2 mysqldump -uroot -ppassword  test >/tmp/test.sql
3 
4 備份test數據庫中的某個表數據和表結構
5 mysqldump -uroot -ppassword  test student >/tmp/test_student.sql

(2).使用-B參數進行備份:(在SQL文件中自動創建原有的數據庫名和連接數據庫)

1 備份test數據庫中的所有表數據和表結構
2 
3 使用-B會自動的創建數據庫並且使用數據庫
4 
5 mysqldump -uroot -ppassword  -B test >/tmp/test.sql

(3).使用-B參數進行多個數據庫的備份:

1  mysqldump --user root --password=myrootpassword -B db_test db_second db_third > db_test.sql  

(4).使用gzip進行壓縮數據文件進行備份:(使用管道符將數據傳給gzip然后進行壓縮數據成gz的包)

1 mysqldump --user root --password=myrootpassword -B db_test db_second db_third |gzip > db_test.sql.gz  

(5).使用shell進行分庫備份:

1 mysql -uroot -ppasswd  -e "show databases;" |grep -Eiv "database|information|performance"|sed -r 's#^([a-zA-Z_0-9]*$)#mysql -uroot -ppasswd --events -B \1 |gzip> /opt/\1.sql.gz#g'|bash

上面的命令是將mysql中需要的庫進行了分庫的備份,這種是在遇到比較多的庫的時候,我們可以進行分庫的備份。

分庫的意義何在:

有時一個企業的數據庫中會有多個庫,例如(bbs,www,blog),但是出問題的時候很可能往往是一個庫,那如果我們將所有庫的數據保存到一個文件中去,那么將來恢復數據的時候,可能會帶來很大的麻煩,所以我們一般將庫進行分庫備份。

有的時候我們也需要將某個庫中的多個表進行分別編程,思想也是和上面的分庫備份一致的。

(6).備份mysql數據庫的表結構(不包含數據)

1 mysqldump -uroot -ppassword  -d  test 
2 
3 參數 -d 的作用就是備份數據庫的表結構。

(7).備份mysql的數據庫中的數據(不包含表結構)

1 mysqldump -uroot -ppassword  -t  test 
2 
3 參數 -t 的作用就是備份數據庫的表數據(不包含表結構)。

(8).備份的時候切割binlog日志:(進行增量備份的時候可以用到)

1 mysqldump -uroot -ppassword  -t  -B -F test 
2 
3 參數 -F 的作用就是備份數據庫的時候,將binlog日志進行重新刷新。

(9).備份的時候會記錄指定文件的位置以及mysqlbinglog的文件名稱:

1  mysqldump -uroot -ppassword  -t  -B -F --master-data test 
2  
3  參數 --master-data=1 的作用就是備份數據庫的時候,將binlog日志進行重新刷新。

mysqldump的一些關鍵參數總結:

1、-B:表示的是指定多個庫,增加了建庫語句和use數據庫的語句。

2、--compact:去掉注釋,適合調試輸出,不適合在生產環境使用。

3、-A: 表示的是本分所有的庫。

4、-F:刷新binlog日志,方便進行增量的恢復。

5、--master-data:增加binlog日志文件名及其對應的位置點。

6、-x,--lock-all-tables :在備份的時候進行鎖表,保持數據的一致性。

7、-d:只備份表的結構。

8、--single-transaction  適合innodb數據庫的備份。

Innodb表在備份的時候,通常啟用選項--single-transaction 來保證備份的一致性,實際上他的工作原理是設定本次備份的會話級別為:repeattable read ,以確保本次會話dump時,不會看到其他的會話提交了數據。

對於不同的引擎,表的備份數據:

MyISAM:

1 mysqldump -uroot -ppassword --flush-privileges -A -B --master-data=2 -x --flush-logs --triggers --routines --events --hex-blob |gzip > /opt/all.sql.gz

InnoDB:

1 mysqldump -uroot -ppassword --flush-privileges -A -B --master-data=2 --single-transaction --flush-logs --triggers --routines --events --hex-blob |gzip > /opt/all.sql.gz

推薦使用InnoDB的備份方式,備份數據。(--triggers 表示的是觸發器)

企業場景全量和增量的頻率是怎樣做的呢?

1)中小公司,全量一般是每天一次,業務流量低谷執行的是全備,備份時會鎖表。

2)單台數據庫,如和增量。使用rsync(配合定時任務頻率大點或者inotify,主從復制),把所有的binlog備份到遠程服務器,盡量做主從復制。

3)大公司周備,每周六00點一次全量,下周日-下周六00點前都是增量。

優點:節省備份時間,減小備份壓力。缺點:增量的binlog文件副本太多,還原會很麻煩

4)一主五從,會有一個從庫做備份,延遲同步。

 什么情況下會用到備份呢?

1) 需要升級數據庫或者是需要增加一個從庫的時候。

2)主庫或者從庫宕機,需要數據的備份。

3)人為的DDl或者是DML的語句,導致主從庫的數據消失

4)跨機房的災備,需要備份數據到遠端程序。

什么情況下才會用到增量恢復呢?

1)主或者從庫宕機(硬件損壞)是否需要增量恢復?

答:不需要增量恢復,主庫宕機,只需要把其中的一個同步最快的從庫提升為主庫即可。

主庫宕機,只要選擇更新最快的從庫,提升為主庫即可

從庫宕機,直接不用就好了(一般都會陪LVS負載均衡),或者就正常修復即可

2)人為操作數據庫SQL語句破壞主庫是否需要增量恢復?

  在數據庫主庫內部命令行進行誤操作,會導致所有的數據庫(包括主從庫)的數據丟失,例如:在主庫執行了drop database test這樣的刪除語句,這時候所有的從庫也會執行這個drop語句,從而導致所有的數據庫上的數據庫的數據丟失,這樣的場景下面需要進行增量恢復的。

3)只有一個主庫是否需要增量恢復呢?

如果公司只有一個主庫的情況下,首先應該做定時的全量備份(每天一次)以及增量備份(每隔1-10分鍾對binlog日志做切割然后被分到其他的服務器上,或者本地其他硬盤中)或者寫到網絡文件系統中。

使用binlog進行增量備份以及查看文件數據的方法:

1 /data1/mysql/bin/mysqlbinlog -uroot -psina.com mysql-bin.000068 > bin.sql
2 
3 我們也可以同時進行拆庫的分析,使用-d參數即可指定數據庫進行拆分
4 /data1/mysql/bin/mysqlbinlog -uroot -psina.com -d test mysql-bin.000068 > bin.sql

是可以導成SQL語句進行查看的。

增量恢復的前提:

1)人為的SQL造成的誤操作。

2)需要全備和增量的數據。

3)恢復時建議對外停止更新。

4)恢復的時候,先恢復全量,再把增量日志中有問題的SQL語句刪除,然后恢復到數據庫。

增量恢復的核心思想:

1)流程制度的控制。如果不做,面臨服務和數據,魚和熊掌不可得。

2)延遲備份來解決,通過監控,加白名單的方式進行控制。

3)業務需求的容忍度,可量化的目標,根據需求選擇停庫或鎖表或者容忍丟失部分數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM