您好,登錄后才能下訂單哦!
前言
為什么需要備份數據?
數據的備份類型
MySQL備份數據的方式
備份需要考慮的問題
設計合適的備份策略
使用cp進行備份
使用mysqldump+復制BINARY LOG備份
使用lvm2快照備份數據
使用Xtrabackup備份
試著想一想, 在生產環境中什么最重要?如果我們服務器的硬件壞了可以維修或者換新, 軟件問題可以修復或重新安裝, 但是如果數據沒了呢?這可能是最恐怖的事情了吧, 我感覺在生產環境中應該沒有什么比數據跟更為重要. 那么我們該如何保證數據不丟失、或者丟失后可以快速恢復呢?只要看完這篇, 大家應該就能對MySQL中實現數據備份和恢復能有一定的了解。
其實在前言中也大概說明了為什么要備份數據, 但是我們還是應該具體了解一下為什么要備份數據
在生產環境中我們數據庫可能會遭遇各種各樣的不測從而導致數據丟失, 大概分為以下幾種.
硬件故障
軟件故障
自然災害
黑客攻擊
誤操作 (占比最大)
所以, 為了在數據丟失之后能夠恢復數據, 我們就需要定期的備份數據, 備份數據的策略要根據不同的應用場景進行定制, 大致有幾個參考數值, 我們可以根據這些數值從而定制符合特定環境中的數據備份策略
能夠容忍丟失多少數據
恢復數據需要多長時間
需要恢復哪一些數據
數據的備份類型根據其自身的特性主要分為以下幾組
完全備份
部分備份
完全備份指的是備份整個數據集( 即整個數據庫 )、部分備份指的是備份部分數據集(例如: 只備份一個表)
而部分備份又分為以下兩種
增量備份
差異備份
增量備份指的是備份自上一次備份以來(增量或完全)以來變化的數據; 特點: 節約空間、還原麻煩
差異備份指的是備份自上一次完全備份以來變化的數據 特點: 浪費空間、還原比增量備份簡單示意圖
在MySQl中我們備份數據一般有幾種方式
熱備份
溫備份
冷備份
熱備份指的是當數據庫進行備份時, 數據庫的讀寫操作均不是受影響
溫備份指的是當數據庫進行備份時, 數據庫的讀操作可以執行, 但是不能執行寫操作
冷備份指的是當數據庫進行備份時, 數據庫不能進行讀寫操作, 即數據庫要下線MySQL中進行不同方式的備份還要考慮存儲引擎是否支持
MyISAM
熱備 ×
溫備 √
冷備 √
InnoDB
熱備 √
溫備 √
冷備 √
我們在考慮完數據在備份時, 數據庫的運行狀態之后還需要考慮對于MySQL數據庫中數據的備份方式
物理備份一般就是通過tar,cp等命令直接打包復制數據庫的數據文件達到備份的效果
邏輯備份一般就是通過特定工具從數據庫中導出數據并另存備份(邏輯備份會丟失數據精度)
物理備份
邏輯備份
定制備份策略前, 我們還需要考慮一些問題
我們要備份什么?
一般情況下, 我們需要備份的數據分為以下幾種
數據
二進制日志, InnoDB事務日志
代碼(存儲過程、存儲函數、觸發器、事件調度器)
服務器配置文件
備份工具
這里我們列舉出常用的幾種備份工具
mysqldump : 邏輯備份工具, 適用于所有的存儲引擎, 支持溫備、完全備份、部分備份、對于InnoDB存儲引擎支持熱備
cp, tar 等歸檔復制工具: 物理備份工具, 適用于所有的存儲引擎, 冷備、完全備份、部分備份
lvm2 snapshot: 幾乎熱備, 借助文件系統管理工具進行備份
mysqlhotcopy: 名不副實的的一個工具, 幾乎冷備, 僅支持MyISAM存儲引擎
xtrabackup: 一款非常強大的InnoDB/XtraDB熱備工具, 支持完全備份、增量備份, 由percona提供
針對不同的場景下, 我們應該制定不同的備份策略對數據庫進行備份, 一般情況下, 備份策略一般為以下三種
直接cp,tar復制數據庫文件
mysqldump+復制BIN LOGS
lvm2快照+復制BIN LOGS
xtrabackup
以上的幾種解決方案分別針對于不同的場景
如果數據量較小, 可以使用第一種方式, 直接復制數據庫文件
如果數據量還行, 可以使用第二種方式, 先使用mysqldump對數據庫進行完全備份, 然后定期備份BINARY LOG達到增量備份的效果
如果數據量一般, 而又不過分影響業務運行, 可以使用第三種方式, 使用lvm2的快照對數據文件進行備份, 而后定期備份BINARY LOG達到增量備份的效果
如果數據量很大, 而又不過分影響業務運行, 可以使用第四種方式, 使用xtrabackup進行完全備份后, 定期使用xtrabackup進行增量備份或差異備份
我們這里使用的是使用yum安裝的mysql-5.1的版本, 使用的數據集為從網絡上找到的一個員工數據庫
查看數據庫的信息
mysql> SHOW DATABASES; #查看當前的數據庫, 我們的數據庫為employees +set (USE employees; Database changed mysql> SHOW TABLES; #查看當前庫中的表 +set (SELECT COUNT(*) FROM employees; #由于篇幅原因, 我們這里只看一下employees的行數為300024 +set (FLUSH TABLES WITH READ LOCK; #向所有表施加讀鎖 Query OK, 0 rows affected (0.00 sec)
備份數據文件
[root/* #這一步可以不做
[root@node1 ~]# cp -a /backup/* /var/lib/mysql/ #將備份的數據文件拷貝回去
[root@node1 ~]# service mysqld restart #重啟MySQL
#重新連接數據并查看
mysql> SHOW DATABASES; #數據庫已恢復
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> USE employees;
mysql> SELECT COUNT(*) FROM employees; #表的行數沒有變化
+----------+
| COUNT(*) |
+----------+
| 300024 |
+----------+
1 row in set (0.06 sec)
##完成
我們這里使用的是使用yum安裝的mysql-5.1的版本, 使用的數據集為從網絡上找到的一個員工數據庫
我們通過mysqldump進行一次完全備份, 再修改表中的數據, 然后再通過binary log進行恢復 二進制日志需要在mysql配置文件中添加 log_bin=on 開啟
mysqldump命令介紹
mysqldump是一個客戶端的邏輯備份工具, 可以生成一個重現創建原始數據庫和表的SQL語句, 可以支持所有的存儲引擎, 對于InnoDB支持熱備
官方文檔介紹
shell> mysqldump [options] db_name [tbl_name ...] 恢復需要手動CRATE DATABASES shell> mysqldump [options] shell> mysqldump [options] SHOW DATABASES; #查看當前的數據庫, 我們的數據庫為employees
+set (USE employees; Database changed
mysql> SHOW TABLES; #查看當前庫中的表
+set (SELECT COUNT(*) FROM employees; #由于篇幅原因, 我們這里只看一下employees的行數為300024
+set (SHOW MASTER STATUS@node1 ~]@node1 ~]@node1 ~]@node1 ~]@node1 ~]@node1 ~]or OSF disklabel
Building a new DOS disklabel with disk identifier in memory only, until you decide to write them.
After of course, the previous content wonto switch and change display units to sectors (command for help): n
Command action
e extended
p primary partition (default default value or +size{K,M,G} (default for help): t
Selected partition to list codes): of partition to for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
You have new mail in /var/spool/mail/root
[root@node1 ~]BLKPG: Device or resource busy
error adding partition @node1 ~]@node1 ~]@node1 ~]@node1 ~]@node1 ~]@node1 ~]@node1 ~]@node1 ~]SHOW DATABASES; #查看當前的數據庫, 我們的數據庫為employees
+set (USE employees; Database changed
mysql> SHOW TABLES; #查看當前庫中的表
+set (SELECT COUNT(*) FROM employees; #由于篇幅原因, 我們這里只看一下employees的行數為300024
+set (@node1 lvm_data]@node1 lvm_data]@node1 lvm_data]write-protected, mounting read-only
[root@node1 lvm_data]@node1 lvm_snap]index test
[root@node1 lvm_snap]@node1 ~]@node1 ~]
備份過程快速、可靠;
備份過程不會打斷正在執行的事務;
能夠基于壓縮等功能節約磁盤空間和流量;
自動實現備份檢驗;
還原速度快;
摘自馬哥的文檔
xtrabackup實現完全備份
我們這里使用xtrabackup的前端配置工具innobackupex來實現對數據庫的完全備份
使用innobackupex備份時, 會調用xtrabackup備份所有的InnoDB表, 復制所有關于表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件, 同時還會備份觸發器和數據庫配置文件信息相關的文件, 這些文件會被保存至一個以時間命名的目錄.
備份過程
[rootlog sequence number ***不用啟動數據庫也可以還原************* [rootdata/* #刪除數據 [root@node1 ~]# innobackupex R mysql.mysql /data/ [root@node1 ~]# ls /data/ -l MariaDB [(none)]> SHOW DATABASES; #數據還原
+Database |
+TEST1 |
| TEST2 |
| employees |
| mysql |
| performance_schema |
| test |
+in set (0.00 sec) #關于xtrabackup還有很多強大的功能沒有敘述、有興趣可以去看官方文檔
總結
備份方法
備份速度
恢復速度
便捷性
功能
一般用于
cp
快
快
一般、靈活性低
很弱
少量數據備份
mysqldump
慢
慢
一般、可無視存儲引擎的差異
一般
中小型數據量的備份
lvm2快照
快
快
一般、支持幾乎熱備、速度快
一般
中小型數據量的備份
xtrabackup
較快
較快
實現innodb熱備、對存儲引擎有要求
強大
較大規模的備份
其實我們還可以通過Master-Slave Replication 進行數據備份
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。