4. mysql的備份方式。
mysql數據庫按照其服務的運行狀態,即停庫和非停庫,停庫的備份叫冷備,非停庫的叫熱備。熱備份分為邏輯備份和裸文件備份(物理備份)。按備份量又有全量和增量備份。
4.1冷備及其恢復.
Mysql的冷備就是在數據庫停止的狀態下進行備份,好處是可以保證數據庫的完整性,備份和恢復都比較快速,但是數據庫停止會影響業務,無法訪問數據庫,所以冷備一般用於不那么重要的業務使用。
1,首先停止數據庫
/usr/local/mysql/bin/mysqladmin -uroot -p123456 shutdown
確保mysql進程已經關閉
2,備份過程為復制整個數據目錄到遠程的服務器上,或者本地磁盤。為了簡便。只列出步驟。如下:
scp -r /data/mysql/ root@遠程機器IP:/遠程機器目錄
cp -r /data/mysql /本地目錄
恢復:
只需要把備份的數據目錄替換即可,記得源目錄要備份一下,然后重啟mysql。
4.2熱備及恢復
熱備即為在不停庫的狀態下進行備份,其中有邏輯備份和物理備份
邏輯備份即將sql執行語句備份,恢復的時候執行sql語句來恢復。一般有mysqldump,mydumper等工具
物理備份即備份數據文件,一般的工具有percona公司的XtraBackup的熱備軟件進行備份。
4.2.1 mysqldump工具備份與恢復
Mysqldump的備份是從buffer中找到需要備份的數據,buffer沒有就到磁盤找,並調回buffer。
通過mysqldump -help可以看到其用法,下面展示常用參數
--single-transaction
用於保證innodb備份數據時的一致性,配合RR隔離級別一起使用,當發起事務時,讀取一個數據的快照,知道備份結束時,都不會讀取到本事務開始提交的任何數據。
--all-databasess(-A)
備份所有數據庫
--master-data
該參數有1和2兩個值,為1的時候,就會在備份出來的文件中添加一個CHANGE MASTER的語句(主從搭建的時候會用),為2的時候就會在備份文件中添加一個CHANGE MASTER的語句,並在語句前面欠佳注釋符號(主從搭建會用到)
--dump-slave
該參數用於從庫端備份數據,在線搭建新的從庫時會使用,參數為1的時候會在備份文件中添加一個CHANGE MASTER,為2的時候則會在其前添加注釋符號。
--no-create-info(-t)
備份時只備份表數據,不備份表結構。
--no-data(-d)
只備份表結構,不備份表數據
--complete-insert (-c)
使用完整的insert語句會包含表中的列信息,這么做可以提高插入效率。
--databases(-B)
備份多個數據庫,在參數后添加數據庫名即可
--default-character-set
字符集,mysql默認的為UTF8,要與備份出的表的字符集保持一致。
--quick(-q)
相當於加sql_no_query,意味着並不會讀取緩存中的數據。
--where=name(-w)
按條件備份出想要的數據
1.示例:備份全庫,如下
mysqldump --single-transaction --set-gtid-purged=off -uroot -p123456 -A >all_20211109.sql
加上--set-gtid-purged=off 是指關閉保存事務的gtid,不然恢復的時候會顯示錯誤。
恢復示例,先刪除test數據庫,利用mysql命令恢復
上面圖中把test數據庫刪了,在下圖中使用備份將其恢復
2.示例:備份單個數據庫test
mysqldump --single-transaction --setgtid-purged=off -uroot -p123456 test>test_20211109.sql
如果恢復的時候test被刪掉了,要自己創建一個新的test庫,如果存在直接恢復即可。
恢復則是mysql -uroot -p123456 test <test20211109.sql
3.備份數據庫的單個表,示例
mysqldump --single-transaction --set-gtid-purged=off -uroot -p123456 mysql user >user_20211109.sql
恢復就不再示例了。
此外還有備份表數據,表結構,根據where條件備份數據等。與上述大同小異。
注意事項:使用mysqldump備份時,可能會出現數據庫性能抖動問題,出現性能下降的情況,這是因為mysqldump備份是從buffer中找到備份的內容,如果buffer中沒有,就需要訪問磁盤的數據文件,然后把數據調回到內存中,形成備份文件,在磁盤調回內存時候,如果機器的內存不是很大的情況下,是會把內存中的熱數據沖掉,這樣業務訪問數據的時候也需要從磁盤中拿數據,眾所周知磁盤的性能是遠小於物理內存的,這將導致數據返回時間延長,影響業務訪問。
在mysql5.7后,新增了一個innodb_buffer_pool_dumo_pct參數,是用來控制每個innodb buffer中轉儲活躍使用innodb buffer pages的比列,只有當數據在1s內再次被訪問時,才會回到熱區域內,這避免了熱數據被沖走的情況,默認值為25%。