數(shù)據(jù)備份是容災(zāi)的基礎(chǔ),是指為防止系統(tǒng)出現(xiàn)操作失誤或系統(tǒng)故障導(dǎo)致數(shù)據(jù)丟失,而將全部或部分?jǐn)?shù)據(jù)集合從應(yīng)用主機(jī)的硬盤或陣列復(fù)制到其它的存儲(chǔ)介質(zhì)的過程。備份數(shù)據(jù)庫非常重要,這樣您就可以恢復(fù)數(shù)據(jù),并在發(fā)生問題時(shí)重新啟動(dòng)并運(yùn)行,例如系統(tǒng)崩潰,硬件故障或用戶錯(cuò)誤地刪除數(shù)據(jù)。本文主要介紹mysqldump+binlog、lvm、abackup幾種常用方法的使用。
原文地址:代碼匯個(gè)人博客 http://www.codehi.top/info/67.html
為什么需要備份數(shù)據(jù)
在生產(chǎn)環(huán)境中我們數(shù)據(jù)庫可能會(huì)遭遇各種各樣的不測從而導(dǎo)致數(shù)據(jù)丟失, 大概分為以下幾種.
- 硬件故障
- 軟件故障
- 自然災(zāi)害
- 黑客攻擊
- 誤操作 (占比最大)
所以, 為了在數(shù)據(jù)丟失之后能夠恢復(fù)數(shù)據(jù), 我們就需要定期的備份數(shù)據(jù), 備份數(shù)據(jù)的策略要根據(jù)不同的應(yīng)用場景進(jìn)行定制, 大致有幾個(gè)參考數(shù)值, 我們可以根據(jù)這些數(shù)值從而定制符合特定環(huán)境中的數(shù)據(jù)備份策略
- 能夠容忍丟失多少數(shù)據(jù)
- 恢復(fù)數(shù)據(jù)需要多長時(shí)間
- 需要恢復(fù)哪一些數(shù)據(jù)
數(shù)據(jù)的備份類型
數(shù)據(jù)的備份類型根據(jù)其自身的特性主要分為以下幾組
- 完全備份
- 部分備份
完全備份指的是備份整個(gè)數(shù)據(jù)集( 即整個(gè)數(shù)據(jù)庫 )、部分備份指的是備份部分?jǐn)?shù)據(jù)集(例如: 只備份一個(gè)表)
而部分備份又分為以下兩種
- 增量備份
- 差異備份
增量備份指的是備份自上一次備份以來(增量或完全)以來變化的數(shù)據(jù); 特點(diǎn): 節(jié)約空間、還原麻煩
差異備份指的是備份自上一次完全備份以來變化的數(shù)據(jù) 特點(diǎn): 浪費(fèi)空間、還原比增量備份簡單

MySQL備份數(shù)據(jù)的方式
在MySQl中我們備份數(shù)據(jù)一般有幾種方式
- 熱備份
- 溫備份
- 冷備份
熱備份指的是當(dāng)數(shù)據(jù)庫進(jìn)行備份時(shí), 數(shù)據(jù)庫的讀寫操作均不是受影響
溫備份指的是當(dāng)數(shù)據(jù)庫進(jìn)行備份時(shí), 數(shù)據(jù)庫的讀操作可以執(zhí)行, 但是不能執(zhí)行寫操作
冷備份指的是當(dāng)數(shù)據(jù)庫進(jìn)行備份時(shí), 數(shù)據(jù)庫不能進(jìn)行讀寫操作, 即數(shù)據(jù)庫要下線
MySQL中進(jìn)行不同方式的備份還要考慮存儲(chǔ)引擎是否支持
- MyISAM
- 熱備 ×
- 溫備 √
- 冷備 √
- InnoDB
- 熱備 √
- 溫備 √
- 冷備 √
我們在考慮完數(shù)據(jù)在備份時(shí), 數(shù)據(jù)庫的運(yùn)行狀態(tài)之后還需要考慮對(duì)于MySQL數(shù)據(jù)庫中數(shù)據(jù)的備份方式
物理備份一般就是**通過tar,cp等命令直接打包復(fù)制數(shù)據(jù)庫的數(shù)據(jù)文件**達(dá)到備份的效果
邏輯備份一般就是**通過特定工具從數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)并另存?zhèn)浞?*(邏輯備份會(huì)丟失數(shù)據(jù)精度)
- 物理備份
- 邏輯備份
備份需要考慮的問題
定制備份策略前, 我們還需要考慮一些問題
我們要備份什么?
一般情況下, 我們需要備份的數(shù)據(jù)分為以下幾種
- 數(shù)據(jù)
- 二進(jìn)制日志, InnoDB事務(wù)日志
- 代碼(存儲(chǔ)過程、存儲(chǔ)函數(shù)、觸發(fā)器、事件調(diào)度器)
- 服務(wù)器配置文件
備份方法
這里我們列舉出常用的幾種備份方法,詳細(xì)可參見 官網(wǎng)數(shù)據(jù)備份介紹
mysqldump : 邏輯備份工具, 適用于所有的存儲(chǔ)引擎, 支持溫備、完全備份、部分備份、對(duì)于InnoDB存儲(chǔ)引擎支持熱備
cp, tar 等歸檔復(fù)制工具: 物理備份工具, 適用于所有的存儲(chǔ)引擎, 冷備、完全備份、部分備份
lvm2 snapshot: 幾乎熱備, 借助文件系統(tǒng)管理工具進(jìn)行備份
xtrabackup: 一款非常強(qiáng)大的InnoDB/XtraDB熱備工具, 支持完全備份、增量備份, 由percona提供
設(shè)計(jì)合適的備份策略
針對(duì)不同的場景下, 我們應(yīng)該制定不同的備份策略對(duì)數(shù)據(jù)庫進(jìn)行備份, 一般情況下, 備份策略一般為以下ji種
- 直接cp,tar復(fù)制數(shù)據(jù)庫文件
- mysqldump+復(fù)制BIN LOGS
- lvm2快照+復(fù)制BIN LOGS
- xtrabackup
- 以上的幾種解決方案分別針對(duì)于不同的場景
- 如果數(shù)據(jù)量較小, 可以使用第一種方式, 直接復(fù)制數(shù)據(jù)庫文件
- 如果數(shù)據(jù)量還行, 可以使用第二種方式, 先使用mysqldump對(duì)數(shù)據(jù)庫進(jìn)行完全備份, 然后定期備份BINARY LOG達(dá)到增量備份的效果
- 如果數(shù)據(jù)量一般, 而又不過分影響業(yè)務(wù)運(yùn)行, 可以使用第三種方式, 使用lvm2的快照對(duì)數(shù)據(jù)文件進(jìn)行備份, 而后定期備份BINARY LOG達(dá)到增量備份的效果
- 如果數(shù)據(jù)量很大, 而又不過分影響業(yè)務(wù)運(yùn)行, 可以使用第四種方式, 使用xtrabackup進(jìn)行完全備份后, 定期使用xtrabackup進(jìn)行增量備份或差異備份
實(shí)戰(zhàn)測試
使用cp進(jìn)行備份
cp備份這里不詳講,大概意思就是:
- 數(shù)據(jù)庫所有表添加讀鎖
flush tables with read lock; - cp命令拷貝mysql源數(shù)據(jù)文件
- rm命令刪除數(shù)據(jù)庫所有文件
- cp命令再把拷貝的源文件拷貝回去
使用mysqldump+復(fù)制BINARY LOG備份
binlog二進(jìn)制日志的詳細(xì)使用請(qǐng)參見:mysql binlog介紹以及通過binlog實(shí)現(xiàn)數(shù)據(jù)恢復(fù)
mysqldump命令介紹
mysqldump是一個(gè)客戶端的邏輯備份工具, 可以生成一個(gè)重現(xiàn)創(chuàng)建原始數(shù)據(jù)庫和表的SQL語句, 可以支持所有的存儲(chǔ)引擎, 對(duì)于InnoDB支持熱備 官方文檔介紹
#基本語法格式,詳細(xì)參數(shù)太多,詳細(xì)請(qǐng)查看官方文檔介紹
shell> mysqldump [options] db_name [tbl_name ...] 恢復(fù)需要手動(dòng)CRATE DATABASES
shell> mysqldump [options] --databases db_name ... 恢復(fù)不需要手動(dòng)創(chuàng)建數(shù)據(jù)庫
shell> mysqldump [options] --all-databases 恢復(fù)不需要手動(dòng)創(chuàng)建數(shù)據(jù)庫
其他選項(xiàng):
-B:指定數(shù)據(jù)庫
-F:刷新日志
-x:鎖表
-E, --events: 備份事件調(diào)度器
-R, --routines: 備份存儲(chǔ)過程和存儲(chǔ)函數(shù)
--triggers: 備份表的觸發(fā)器; --skip-triggers
--master-date[=value]
1: 記錄為CHANGE MASTER TO 語句、語句不被注釋
2: 記錄為注釋的CHANGE MASTER TO語句
基于二進(jìn)制還原只能全庫還原
--flush-logs: 日志滾動(dòng)
鎖定表完成后執(zhí)行日志滾動(dòng)
查看數(shù)據(jù)庫的信息
# 查看當(dāng)前的數(shù)據(jù)庫,測試用的是codehui庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| codehui |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.03 sec)
mysql> use information_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
# 查看codehui庫中所有的表的記錄數(shù)
mysql> select table_name,table_rows from tables where TABLE_SCHEMA = 'codehui' order by table_rows desc;
+------------+------------+
| table_name | table_rows |
+------------+------------+
| test | 5 |
| proxy | 2 |
| demo | 1 |
+------------+------------+
3 rows in set (0.00 sec)
使用mysqldump備份數(shù)據(jù)庫
# 查看當(dāng)前二進(jìn)制文件的狀態(tài), 并記錄下position的數(shù)字
root@ba586179fe4b:/# mysql -u root -p123456 -e 'show master status'
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 107 | | |
+------------------+----------+--------------+------------------+
# 備份數(shù)據(jù)庫到/opt/mysql/backup.sql文件中
root@ba586179fe4b:/opt/mysql# mysqldump -uroot -p123456 -E --all-databases --lock-all-tables > /opt/mysql/backup.sql
# 查看數(shù)據(jù)表備份成功
root@ba586179fe4b:/opt/mysql# ls /opt/mysql
backup.sql
# 創(chuàng)建一個(gè)數(shù)據(jù)庫,一會(huì)導(dǎo)入備份的數(shù)據(jù)
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
# 記下現(xiàn)在的position
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 332 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
# 備份二進(jìn)制文件
root@ba586179fe4b:/# cp /var/lib/mysql/mysql-bin.000005 /opt/mysql
# 停止mysql
# 刪除所有的數(shù)據(jù)文件
root@ba586179fe4b:/# rm -rf /var/lib/mysql/*
# 啟動(dòng)mysql
# 查看數(shù)據(jù)庫 沒了
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
# 暫時(shí)先將二進(jìn)制日志關(guān)閉
mysql> set sql_log_bin=OFF;
Query OK, 0 rows affected (0.01 sec)
# 恢復(fù)數(shù)據(jù),所需時(shí)間根據(jù)數(shù)據(jù)庫時(shí)間大小而定
mysql> source /opt/mysql/backup.sql
# 開啟二進(jìn)制日志
mysql> set sql_log_bin=ON;
# 查看數(shù)據(jù)庫其他恢復(fù)了 備份之后創(chuàng)建的test需要binlog日志進(jìn)行恢復(fù)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| codehui |
| mysql |
+--------------------+
3 rows in set (0.00 sec)
# 通過mysqlbinlog查看mysql-bin.000005日志中的記錄,可以看到創(chuàng)建test表的sql日志
root@ba586179fe4b:/# mysqlbinlog /opt/mysql/mysql-bin.000005
===========================================
# at 249
#190222 2:37:17 server id 1 end_log_pos 332 Query thread_id=20 exec_time=0 error_code=0
SET TIMESTAMP=1550803037/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
create database test
/*!*/;
===========================================
# 恢復(fù)mysql-bin.000005日志中的數(shù)據(jù)
root@ba586179fe4b:/# mysqlbinlog /opt/mysql/mysql-bin.000005 > /opt/mysql/000005.sql
root@ba586179fe4b:/# mysql -uroot -p123456 -v < /opt/mysql/000005.sql
# 查看數(shù)據(jù)庫,test表回來了
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| codehui |
| mysql |
+--------------------+
3 rows in set (0.00 sec)
使用lvm2快照備份數(shù)據(jù)
后面繼續(xù)更新,敬請(qǐng)期待
使用Xtrabackup備份
后面繼續(xù)更新,敬請(qǐng)期待