mysql 數(shù)據(jù)備份的幾種常用方法

數(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備份這里不詳講,大概意思就是:

  1. 數(shù)據(jù)庫所有表添加讀鎖
    flush tables with read lock;
  2. cp命令拷貝mysql源數(shù)據(jù)文件
  3. rm命令刪除數(shù)據(jù)庫所有文件
  4. 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)期待

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容