前言
成都創(chuàng)新互聯(lián)公司服務(wù)項目包括舞陽網(wǎng)站建設(shè)、舞陽網(wǎng)站制作、舞陽網(wǎng)頁制作以及舞陽網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,舞陽網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到舞陽省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
為什么需要備份數(shù)據(jù)?
數(shù)據(jù)的備份類型
MySQL備份數(shù)據(jù)的方式
備份需要考慮的問題
設(shè)計合適的備份策略
使用cp進行備份
使用mysqldump+復(fù)制BINARY LOG備份
使用lvm2快照備份數(shù)據(jù)
使用Xtrabackup備份
試著想一想, 在生產(chǎn)環(huán)境中什么最重要?如果我們服務(wù)器的硬件壞了可以維修或者換新, 軟件問題可以修復(fù)或重新安裝, 但是如果數(shù)據(jù)沒了呢?這可能是最恐怖的事情了吧, 我感覺在生產(chǎn)環(huán)境中應(yīng)該沒有什么比數(shù)據(jù)跟更為重要. 那么我們該如何保證數(shù)據(jù)不丟失、或者丟失后可以快速恢復(fù)呢?只要看完這篇, 大家應(yīng)該就能對MySQL中實現(xiàn)數(shù)據(jù)備份和恢復(fù)能有一定的了解。
其實在前言中也大概說明了為什么要備份數(shù)據(jù), 但是我們還是應(yīng)該具體了解一下為什么要備份數(shù)據(jù)
在生產(chǎn)環(huán)境中我們數(shù)據(jù)庫可能會遭遇各種各樣的不測從而導(dǎo)致數(shù)據(jù)丟失, 大概分為以下幾種.
硬件故障
軟件故障
自然災(zāi)害
黑客攻擊
誤操作 (占比最大)
所以, 為了在數(shù)據(jù)丟失之后能夠恢復(fù)數(shù)據(jù), 我們就需要定期的備份數(shù)據(jù), 備份數(shù)據(jù)的策略要根據(jù)不同的應(yīng)用場景進行定制, 大致有幾個參考數(shù)值, 我們可以根據(jù)這些數(shù)值從而定制符合特定環(huán)境中的數(shù)據(jù)備份策略
能夠容忍丟失多少數(shù)據(jù)
恢復(fù)數(shù)據(jù)需要多長時間
需要恢復(fù)哪一些數(shù)據(jù)
數(shù)據(jù)的備份類型根據(jù)其自身的特性主要分為以下幾組
完全備份
部分備份
完全備份指的是備份整個數(shù)據(jù)集( 即整個數(shù)據(jù)庫 )、部分備份指的是備份部分?jǐn)?shù)據(jù)集(例如: 只備份一個表)
而部分備份又分為以下兩種
增量備份
差異備份
增量備份指的是備份自上一次備份以來(增量或完全)以來變化的數(shù)據(jù); 特點: 節(jié)約空間、還原麻煩
差異備份指的是備份自上一次完全備份以來變化的數(shù)據(jù) 特點: 浪費空間、還原比增量備份簡單示意圖
在MySQl中我們備份數(shù)據(jù)一般有幾種方式
熱備份
溫備份
冷備份
熱備份指的是當(dāng)數(shù)據(jù)庫進行備份時, 數(shù)據(jù)庫的讀寫操作均不是受影響
溫備份指的是當(dāng)數(shù)據(jù)庫進行備份時, 數(shù)據(jù)庫的讀操作可以執(zhí)行, 但是不能執(zhí)行寫操作
冷備份指的是當(dāng)數(shù)據(jù)庫進行備份時, 數(shù)據(jù)庫不能進行讀寫操作, 即數(shù)據(jù)庫要下線MySQL中進行不同方式的備份還要考慮存儲引擎是否支持
MyISAM
熱備 ×
溫備 √
冷備 √
InnoDB
熱備 √
溫備 √
冷備 √
我們在考慮完數(shù)據(jù)在備份時, 數(shù)據(jù)庫的運行狀態(tài)之后還需要考慮對于MySQL數(shù)據(jù)庫中數(shù)據(jù)的備份方式
物理備份一般就是通過tar,cp等命令直接打包復(fù)制數(shù)據(jù)庫的數(shù)據(jù)文件達到備份的效果
邏輯備份一般就是通過特定工具從數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)并另存?zhèn)浞?/strong>(邏輯備份會丟失數(shù)據(jù)精度)
物理備份
邏輯備份
定制備份策略前, 我們還需要考慮一些問題
我們要備份什么?
一般情況下, 我們需要備份的數(shù)據(jù)分為以下幾種
數(shù)據(jù)
二進制日志, InnoDB事務(wù)日志
代碼(存儲過程、存儲函數(shù)、觸發(fā)器、事件調(diào)度器)
服務(wù)器配置文件
備份工具
這里我們列舉出常用的幾種備份工具
mysqldump : 邏輯備份工具, 適用于所有的存儲引擎, 支持溫備、完全備份、部分備份、對于InnoDB存儲引擎支持熱備
cp, tar 等歸檔復(fù)制工具: 物理備份工具, 適用于所有的存儲引擎, 冷備、完全備份、部分備份
lvm2 snapshot: 幾乎熱備, 借助文件系統(tǒng)管理工具進行備份
mysqlhotcopy: 名不副實的的一個工具, 幾乎冷備, 僅支持MyISAM存儲引擎
xtrabackup: 一款非常強大的InnoDB/XtraDB熱備工具, 支持完全備份、增量備份, 由percona提供
針對不同的場景下, 我們應(yīng)該制定不同的備份策略對數(shù)據(jù)庫進行備份, 一般情況下, 備份策略一般為以下三種
直接cp,tar復(fù)制數(shù)據(jù)庫文件
mysqldump+復(fù)制BIN LOGS
lvm2快照+復(fù)制BIN LOGS
xtrabackup
以上的幾種解決方案分別針對于不同的場景
如果數(shù)據(jù)量較小, 可以使用第一種方式, 直接復(fù)制數(shù)據(jù)庫文件
如果數(shù)據(jù)量還行, 可以使用第二種方式, 先使用mysqldump對數(shù)據(jù)庫進行完全備份, 然后定期備份BINARY LOG達到增量備份的效果
如果數(shù)據(jù)量一般, 而又不過分影響業(yè)務(wù)運行, 可以使用第三種方式, 使用lvm2的快照對數(shù)據(jù)文件進行備份, 而后定期備份BINARY LOG達到增量備份的效果
如果數(shù)據(jù)量很大, 而又不過分影響業(yè)務(wù)運行, 可以使用第四種方式, 使用xtrabackup進行完全備份后, 定期使用xtrabackup進行增量備份或差異備份
我們這里使用的是使用yum安裝的mysql-5.1的版本, 使用的數(shù)據(jù)集為從網(wǎng)絡(luò)上找到的一個員工數(shù)據(jù)庫
查看數(shù)據(jù)庫的信息
mysql> SHOW DATABASES; #查看當(dāng)前的數(shù)據(jù)庫, 我們的數(shù)據(jù)庫為employees +set (USE employees; Database changed mysql> SHOW TABLES; #查看當(dāng)前庫中的表 +set (SELECT COUNT(*) FROM employees; #由于篇幅原因, 我們這里只看一下employees的行數(shù)為300024 +set (FLUSH TABLES WITH READ LOCK; #向所有表施加讀鎖 Query OK, 0 rows affected (0.00 sec)
備份數(shù)據(jù)文件
[root/* #這一步可以不做 [root@node1 ~]# cp -a /backup/* /var/lib/mysql/ #將備份的數(shù)據(jù)文件拷貝回去 [root@node1 ~]# service mysqld restart #重啟MySQL #重新連接數(shù)據(jù)并查看 mysql> SHOW DATABASES; #數(shù)據(jù)庫已恢復(fù) +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> USE employees; mysql> SELECT COUNT(*) FROM employees; #表的行數(shù)沒有變化 +----------+ | COUNT(*) | +----------+ | 300024 | +----------+ 1 row in set (0.06 sec) ##完成
我們這里使用的是使用yum安裝的mysql-5.1的版本, 使用的數(shù)據(jù)集為從網(wǎng)絡(luò)上找到的一個員工數(shù)據(jù)庫
我們通過mysqldump進行一次完全備份, 再修改表中的數(shù)據(jù), 然后再通過binary log進行恢復(fù) 二進制日志需要在mysql配置文件中添加 log_bin=on 開啟
mysqldump命令介紹
mysqldump是一個客戶端的邏輯備份工具, 可以生成一個重現(xiàn)創(chuàng)建原始數(shù)據(jù)庫和表的SQL語句, 可以支持所有的存儲引擎, 對于InnoDB支持熱備
官方文檔介紹
shell> mysqldump [options] db_name [tbl_name ...] 恢復(fù)需要手動CRATE DATABASES shell> mysqldump [options] shell> mysqldump [options] SHOW DATABASES; #查看當(dāng)前的數(shù)據(jù)庫, 我們的數(shù)據(jù)庫為employees +set (USE employees; Database changed mysql> SHOW TABLES; #查看當(dāng)前庫中的表 +set (SELECT COUNT(*) FROM employees; #由于篇幅原因, 我們這里只看一下employees的行數(shù)為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; #查看當(dāng)前的數(shù)據(jù)庫, 我們的數(shù)據(jù)庫為employees +set (USE employees; Database changed mysql> SHOW TABLES; #查看當(dāng)前庫中的表 +set (SELECT COUNT(*) FROM employees; #由于篇幅原因, 我們這里只看一下employees的行數(shù)為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 ~]
備份過程快速、可靠;
備份過程不會打斷正在執(zhí)行的事務(wù);
能夠基于壓縮等功能節(jié)約磁盤空間和流量;
自動實現(xiàn)備份檢驗;
還原速度快;
摘自馬哥的文檔
xtrabackup實現(xiàn)完全備份
我們這里使用xtrabackup的前端配置工具innobackupex來實現(xiàn)對數(shù)據(jù)庫的完全備份
使用innobackupex備份時, 會調(diào)用xtrabackup備份所有的InnoDB表, 復(fù)制所有關(guān)于表結(jié)構(gòu)定義的相關(guān)文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關(guān)文件, 同時還會備份觸發(fā)器和數(shù)據(jù)庫配置文件信息相關(guān)的文件, 這些文件會被保存至一個以時間命名的目錄.
備份過程
[rootlog sequence number ***不用啟動數(shù)據(jù)庫也可以還原************* [rootdata/* #刪除數(shù)據(jù) [root@node1 ~]# innobackupex R mysql.mysql /data/ [root@node1 ~]# ls /data/ -l MariaDB [(none)]> SHOW DATABASES; #數(shù)據(jù)還原 +Database | +TEST1 | | TEST2 | | employees | | mysql | | performance_schema | | test | +in set (0.00 sec) #關(guān)于xtrabackup還有很多強大的功能沒有敘述、有興趣可以去看官方文檔
備份方法 | 備份速度 | 恢復(fù)速度 | 便捷性 | 功能 | 一般用于 |
---|---|---|---|---|---|
cp | 快 | 快 | 一般、靈活性低 | 很弱 | 少量數(shù)據(jù)備份 |
mysqldump | 慢 | 慢 | 一般、可無視存儲引擎的差異 | 一般 | 中小型數(shù)據(jù)量的備份 |
lvm2快照 | 快 | 快 | 一般、支持幾乎熱備、速度快 | 一般 | 中小型數(shù)據(jù)量的備份 |
xtrabackup | 較快 | 較快 | 實現(xiàn)innodb熱備、對存儲引擎有要求 | 強大 | 較大規(guī)模的備份 |
其實我們還可以通過Master-Slave Replication 進行數(shù)據(jù)備份