數據庫應用——MySQL備份與恢復

                                                      MySQL備份與恢復

一、備份方式
1、數據庫備份的重要性
(1)提高系統高可用性和災難可恢復性
(2)備份和還原數據庫,是數據庫崩潰時提供數據恢復最小代價的最優方案
(3)數據庫備份是一種防範災難的強力手段
(4)數據丟失原因
①程序錯誤
②人爲錯誤
③計算機失敗
④磁盤失敗
⑤災難
2、數據庫備份的分類
(1)物理備份
冷備份:關閉數據庫後進行備份,能較好的保證數據完整性
熱備份:數據庫運行時進行的備份,依賴於數據庫的日誌文件
溫備份:鎖定表格後進行備份
(2)邏輯備份
完全備份:對數據進行完整備份
差異備份:備份在完全備份後被修改過的數據
增量備份:備份上次完全備份或增量備份之後被修改過的數據
3、常用備份方法
(1)物理類備
①備份時數據庫處於關閉狀態,直接打包數據庫文件
②備份速度快,恢復時也最簡單
(2)專用備份工具mydump或mysqlhotcopy
mysqldump:邏輯備份工具
mysqlhotcopy:僅擁有備份MyISAM和ARCHIVE表
(3)啓用二進制日誌進行增量備份
①增量備份需要刷新二進制日誌
(4)第三方工具備份
①Percona、XtraBackup等

二、完全備份
1、使用tar打包文件備份
(1)數據庫文件很大,可以使用壓縮率較大的xz格式壓縮,需要先安裝xz壓縮格式工具:yum install -y xz
(2)打包:tar -Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/
(3)數據恢復:tar -Jxvf /opt/mysql-2020-03-04.tar.xzf /usr/local/mysql/data/
2、mydump工具
(1)表的完全備份:mysqldump -u 用戶名 -p [密碼] [選項] [數據庫名] [表名]>/備份路徑/文件名
(2)庫的完全備份:mysqldump -u 用戶名 -p [密碼] [選項] [數據庫名]>/備份路徑/文件名
(3)多個庫備份:mysqldump -u 用戶名 -p [密碼] [選項] --databases [庫名1] [庫名2]>/備份路徑/文件名
(4)備份所有庫:mysqldump -u 用戶名 -p [密碼] [選項] --all-databases>/備份路徑/文件名
(5)表結構備份:mysqldump -u 用戶名 -p [密碼] -d [數據庫名] [表1] [表2]>/備份路徑/文件名

三、完全備份的數據恢復
1、恢復整庫
(1)source命令恢復整庫(登錄mysql)
備份庫:mysqldump -uroot -p111111 test > /opt/test.sql
②刪除庫:drop database test;
恢復庫:source /opt/test.sql
(2)mysql命令恢復整庫(無需登錄mysql)
創建庫:create database test;(需要先創建相應庫)
mysql -uroot -p111111 test</opt/test.sql
2、恢復表
(1)source命令
備份表:mysqldump -uroot -p111111 test user > /opt/test-user.sql
②刪除表:drop table test.user;
恢復表:source /opt/test-user.sql;
(2)mysql命令
msql -uroot -p111111 test < /opt/test-user.sql

四、增量備份
1、通過二進制日誌備份
(1)二進制日誌保存了所有更新或者可能跟新數據庫的操作
(2)二進制日誌在啓動mysql服務後開始記錄,並在文件達到max_binlog_size時或者接收到flush log命令後重新創建新的日誌文件
(3)只需要定時執行flush log方法重新創建日誌,生成二進制文件序列,並及時把這些日誌保存到安全的地方就完成了一個時間段的增量備份
2、備份實例
(1)開啓二進制日誌功能
①修改配置文件的[myslqd]項,加入log-bin=mysql-bin,然後重啓服務
/etc/init.d/mysqld restart --log-bin=mysql-bin
(2)確定字符集使用utf-8格式:show variables like ‘%char%’
(3)創建備份文件夾:mkdir /opt/bak_sql
(4)每週使用mysqldump備份庫或表(完全備份)
(5)每天進行增量備份:mysqladmin -uroot -p111111 flush-logs
(6)把二進制日誌保存到備份目錄:cp mysql-bin.00001 /opt/bak_sql/

五、增量恢復
1、增量恢復適用場景
(1)人爲的SQL語句破壞了數據庫
(2)在進行下一次全備份之前發生系統故障導致數據庫丟失
(3)在主從架構中,主庫數據發生了故障
(4)數據丟失分類
①之丟失了完全備份之後更改的數據
②完全備份之後丟失所有數據
2、丟失完全備份之後更改的數據的恢復實例
(1)完全備份:mysqldump -uroot -p111111 test > /opt/bak_sql/test_$(date +%F).sql
(2)使用flush-logs生成的二進制日誌文件,用於增量備份
①mysqladmin -uroot -p111111 flush-logs
(3)使用二進制日誌文件恢復數據(注意恢復順序,要先恢復最先生成的二進制文件,然後依次恢復)
mysqlbinlog /user/local/mysql/data/mysql-bin.000001 | mysql -uroot -p111111
②mysqlbinlog /user/local/mysql/data/mysql-bin.000002 | mysql -uroot -p111111
3、完全備份後丟失所有數據的恢復實例
(1)使用mysql命令恢復完整備份
①創建丟失的庫:create database test;
②恢復完整備份:mysql -uroot -p111111 test < /opt/bak_sql/test_2020-03-04.sql
(2)使用二進制文件恢復數據
①mysqlbinlog /user/local/mysql/data/mysql-bin.000001 | mysql -uroot -p111111
②mysqlbinlog /user/local/mysql/data/mysql-bin.000002 | mysql -uroot -p111111
4、基於時間點與位置的恢復
(1)二進制日誌文件中除了保存數據庫修改命令以外,還保存了執行命令的時間和位置。可通過mysqlbinlog /usr/local/mysql/data/mysql-bin.000001查看

(2)基於時間點的恢復
①通過mysqlbinlog --stop-datetime與--start-datetime,使恢復過程跳過指定時間段。
1)mysqlbinlog --stop-datetime=’20-03-04 0:04:09’ /usr/local/mysql/adta/mysql-bin.000001 | mysql -uroot -p111111
2)mysqlbinlog --stop-datetime=’20-03-04 0:05:09’ /usr/local/mysql/adta/mysql-bin.000001 | mysql -uroot -p111111
②注意
1)執行時間點精確到秒
2)二進制文件中保存到日期格式需要調整爲用“-”分割
(3)基於位置的恢復
通過--stop-position及--start-position進行比時間點更加精確的恢復,具體命令格式與時間點類似

六、備份腳本
1、全備份腳本(mysqldump)

2、增量備份腳本(二進制日誌)

3、添加計劃
(1)crontab -e
①0 1 * * 6 /root/qbf.sh
②0 1 */1 * * /root/zlbf.sh

七、備份思路
1、數據庫需要定期實施備份
2、除了完全備份,開啓日誌功能也很重要,完全備份加上日誌,可以對數據庫進行最大還原
3、備份文件名需要使用同一和易理解的名稱,推薦使用庫名或表名加上時間的命名規則
4、企業備份策略思路
(1)數據更新頻繁,則應該進行較爲頻繁的備份
(2)數據較爲重要,則在有適當更新時進行備份
(3)在數據庫壓力小的時間段進行備份,如一週一次,然後每天增量備份
(4)根據公司規模,中小公司可一天一次全備,大公司可每週一次全備,每天進行增量,並儘量爲企業實現主從複製架構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章