MySQL ---- 數據的備份與恢復
一: 數據備份的重要性
-
在生產環境中,數據的安全性是至關重要的,任何數據的丟失都可能產生嚴重的後果
-
造成數據丟失的原因:
-
程序錯誤
-
人爲錯誤
-
計算機失敗
-
磁盤失敗
-
災難和偷竊
二:數據庫備份的分類
1、從物理與邏輯的角度
- 物理備份:對數據庫操作系統的物理文件(如 數據文件、日誌文件等)的備份。
【 物理備份分爲:脫機備份(冷備份)和 聯機備份(熱備份)】
— 冷備份:是在關閉數據庫的時候進行
— 熱備份:數據庫處於運行狀態,依賴於數據庫的日誌文件
- 邏輯備份 :對數據庫邏輯組件(如 表等數據庫對象)的備份。
2、從數據庫的備份策略角度
- 完全備份:每次對數據進行完整的備份
優點:備份與恢復操作簡單方便
缺點:數據存在大量的重複 ; 佔用大量的備份空間 ; 備份與恢復時間長
- 差異備份:備份那些自從上次完全備份之後被修改的文件
優點:只需備份差異
缺點:數據冗餘,佔用空間率較大
- 增量備份:只有那些在上次完全備份或增量備份後被修改的文件纔會備份
優點:沒有重複數據,備份量不大,時間短
缺點:恢復麻煩,需要上次完全備份及完全備份之後所有的增量備份才能恢復,而且要對所有增量備份進行逐個反推恢復
三:MySQL數據庫備份可採用多種方式
-
直接打包數據庫文件夾, 如 /usr/local/mysql/data
-
使用專用備份工具 mysqldump
-
#### mysqldump 命令
-
MySQL自帶的備份工具,相當方便對MySQL進行備份
-
通過該命令工具可以將指定的庫、表或全部的庫導出爲SQL腳本,在需要恢復時可進行數據恢復
1、mysqldump 命令 對單個庫進行完全備份
mysqldump -u 用戶名 -p [密碼] [選項] [數據庫名] > /備份路徑/備份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p ku > /opt/ku.sql
2、對多個庫進行完全備份
mysqldump -u 用戶名 -p [密碼] [選項] --databases 庫名1 [庫名2]... > /備份路徑/備份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p --databases ku mysql > /opt/ku_mysql.sql
3、對所有庫進行完全備份
mysqldump -u 用戶名 -p [密碼] [選項] --all-databases > /備份路徑/備份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p --opt --all-databases > /opt/all.sql
4、使用mysqldump 備份表
mysqldump -u 用戶名 -p [密碼] [選項] 數據庫名 表名 > /備份路徑/備份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p ku biao > /opt/ku_biao.sql
5、對某個表結構的備份
mysqldump -u 用戶名 -p [密碼] [選項] -d 數據庫名 表名 > /備份路徑/備份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p -d ku a > /opt/ku_a.sql
在/opt/下 查看,有以上備份的文件名
四:恢復數據庫 、表
-
使用mysqldump 命令導出的SQL備份腳本,在進行數據恢復時可使用以下方法導入:
-
source 命令
-
mysql 命令
-
使用source恢復數據庫的步驟
-
登錄到mysql 數據庫
-
執行source 備份sql腳本的路徑
1、使用mysql 命令恢復數據
mysql -u 用戶名 -p [密碼] < 庫備份腳本的路徑 ‘ < 表示導入’
示例:
基於mysql 命令進行恢復:
[root@localhost ~]# mysql -uroot -p ku < /opt/ku.sql
基於source 腳本恢復:
2、恢復表
-
恢復表時同樣可使用 source 或 mysql 命令進行
-
source 恢復表的操作與恢復庫的操作相同
-
當備份文件中只包含表的備份,而不包括創建庫的語句時,必須指定庫名,且目標庫必須存在
五:MySQL 增量備份 、增量恢復
1、增量備份
-
MySQL沒有提供直接的增量備份方法
-
可以通過MySQL提供的二進制日誌 (binary logs) 間接實現增量備份
-
MySQL二進制日誌對備份的意義
-
二進制日誌保存了所有更新或者可能更新數據庫的操作
-
二進制日誌在啓動MySQL服務器後開始記錄,並在文件達到max_binlog_size所設置的大小或者接收到flush logs命令後重新創建新的日誌文件
-
只需定時執行flush logs方法重新創建新的日誌,生成二進制文件序列,並及時把這些舊的日誌保存到安全的地方就完成了一個時間段的增量備份
-
增量備份依賴二進制日誌文件,首先需要開啓二進制日誌文件: 進入/etc/my.cnf , 添加 log-bin=mysql-bin
[root@localhost ~]# vim /etc/my.cnf
刷新所有日誌後生成一個新的日誌文件 就是 增量備份日誌文件 mysql-bin.00002
修改一些數據
剛剛增加、刪除的信息都存放在00002 日誌文件中,進行查看
用64位解碼器輸出 按行讀取 ,並放在/opt下命名爲rizhi.txt 。( -v 顯示出來 ) 進入rizhi.txt看剛剛修改的數據
2、增量恢復
- 一般恢復
添加數據 ——>進行完全備份 ——>錄入新的數據 ——>進行增量備份 ——>模擬故障 ——>恢復操作
mysqlbinlog [--no-defaults] 增量備份文件 | mysql -u root -p
- 基於位置恢復
就是將某個起始時間的二級制日誌導入數據庫中,從而跳過某個發生錯誤的時間點實現數據的恢復
mysqlbinlog --stop-position='操作id' 二進制日誌 | mysql -u用戶名 -p密碼
[root@localhost data]# --stop-position='1131' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
- 基於時間點恢復
可能會出現在一個時間點裏既同時存在正確的操作又存在錯誤的操作,所以需要一種更爲精確的恢復方式
(1) 從日誌開頭截止到某個時間點的恢復
mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小時:分鐘:秒' 二進制日誌 | mysql -u 用戶名 -p 密碼
mysqlbinlog --no-defaults --stop-datetime='2020-01-09 17:56:36' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
(2)從某個時間點到日誌結尾的恢復
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小時:分鐘:秒' 二進制日誌 | mysql -u 用戶名 -p 密碼
mysqlbinlog --no-defaults --start-datetime='2020-01-09 17:57:03' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
(3)從某個時間點到某個時間點的恢復
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小時:分鐘:秒' --stop-datetime='年-月-日 小時:分鐘:秒’ 二進制日誌| mysql -u用戶名 -p密碼