溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL應該如何備份與恢復

發(fā)布時間:2020-05-07 14:02:04 來源:億速云 閱讀:196 作者:三月 欄目:MySQL數(shù)據(jù)庫

本文主要給大家簡單講講MySQL應該如何備份與恢復,相關專業(yè)術語大家可以上網(wǎng)查查或者找一些相關書籍補充一下,這里就不涉獵了,我們就直奔主題吧,希望MySQL應該如何備份與恢復這篇文章可以給大家?guī)硪恍嶋H幫助。

在進行熱備時,備份操作和應用服務在同時運行,這樣十分消耗系統(tǒng)資源,導致數(shù)據(jù)庫服務性能下降,這就要求我們選擇一個合適的時間(一般在應用負擔很小的時候)再來進行備份操作。

需要注意的是,不是備份就萬事大吉了,最好確認備份是否可用,所以備份之后的恢復測試是非常有必要的。同時備份時間也要靈活調整,如:

數(shù)據(jù)更新頻繁,則應該頻繁地備份。
數(shù)據(jù)的重要性,在有適當更新時進行備份。
在數(shù)據(jù)庫壓力小的時間段進行備份,如一周一次完全備份,每天進行增量備份。
中小公司,完全備份一般一天一次即可。
大公司可每周進行一次完全備份,每天進行一次增量備份。
盡量為企業(yè)實現(xiàn)主從復制架構,以增加數(shù)據(jù)的可用性。
數(shù)據(jù)庫備份類型可以從兩個角度來看待:

MySQL應該如何備份與恢復

1、從物理與邏輯的角度:

物理備份是對數(shù)據(jù)庫操作系統(tǒng)的物理文件(如數(shù)據(jù)文件、日志文件等)的備份。這種類型的備份適用于在出現(xiàn)問題時需要快速恢復的大型重要數(shù)據(jù)庫。

物理備份有可以分為以下幾種類型:

①、冷備份:在數(shù)據(jù)庫關閉狀態(tài)下進行備份操作;

②、熱備份:在數(shù)據(jù)庫處于運行狀態(tài)時進行備份操作,該備份方法依賴數(shù)據(jù)庫的日志文件;

③、溫備份:數(shù)據(jù)庫鎖定表格(不可寫入,但可讀取)的狀態(tài)下進行備份;

邏輯備份是對數(shù)據(jù)庫邏輯組件(如表等數(shù)據(jù)庫對象)的備份,表示為邏輯數(shù)據(jù)庫結構(create database、create table語句)和內容(insert語句或分隔文本文件)的信息。這種類型的備份使用于可以編輯數(shù)據(jù)值或表結構較小的數(shù)據(jù)量,或者在不同的機器體系上重新創(chuàng)建數(shù)據(jù)。

2、從數(shù)據(jù)庫的備份策略角度:

從數(shù)據(jù)庫的備份策略角度,數(shù)據(jù)庫的備份可分為完全備份、差異備份和增量備份。其中呢,完整備份是實現(xiàn)差異、增量備份的基礎。

完整備份:每次對數(shù)據(jù)進行完整的備份,即對整個數(shù)據(jù)庫的備份。備份與恢復的操作非常簡單,但是數(shù)據(jù)存在大量的重復,會占用大量的磁盤空間,備份的時間也很長。
差異備份:備份那些自從上次完全備份之后被修改過的所有文件,備份的時間點是從上次完整備份起,備份數(shù)據(jù)會越來越大,恢復數(shù)據(jù)時,只需恢復上次的完全備份和最近的一次差異備份。
增量備份:只有在那些在上次完全備份或增量備份后被修改的文件才會被備份,以上次完整備份或上次增量備份的時間為時間點,僅僅備份這之間的數(shù)據(jù)變化,因而備份的數(shù)據(jù)量也小,占用空間小,備份速度快,但恢復時,需要從上一次的完整備份開始到最后一次增量備份之間的所有增量依次恢復,一旦中間的數(shù)據(jù)發(fā)生損壞,將導致數(shù)據(jù)的丟失。
備份實例:
1、物理冷備份與恢復:

[root@mysql /]# systemctl stop mysqld        #先停掉服務
[root@mysql /]# mkdir /backup            # 創(chuàng)建一個備份目錄
[root@mysql /]# tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/         # 將整個數(shù)據(jù)庫文件夾打包備份,(date +%F)當前日期
[root@mysql /]# ls -l /backup/      # 查看備份文件
total 732         # 總用量
-rw-r--r-- 1 root root 746839 Aug  2 14:48 mysql_all-2019-08-02.tar.gz     # 備份文件

來模擬數(shù)據(jù)庫文件丟失:

[root@mysql /]# mkdir /diushi
[root@mysql /]# mv /usr/local/mysql/data/ /diushi/         # 將數(shù)據(jù)庫存放目錄移動到另一個目錄

恢復數(shù)據(jù)庫:

[root@mysql /]# mkdir /restore/
[root@mysql /]# tar zxf /backup/mysql_all-2019-08-02.tar.gz -C   /restore/     # 要先將備份文件釋放到一個空目錄中,然后將需要的恢復到原位置
[root@mysql /]# mv /restore/usr/local/mysql/data/   /usr/local/mysql/         # 將數(shù)據(jù)庫目錄恢復到原位置
[root@mysql /]# systemctl restart mysqld             # 重啟服務驗證

2、mysqldump 備份與恢復:
備份數(shù)據(jù)庫
備份指定庫中的表:

mysqldump    [選項]    庫名   表名  表名2   ……  > /備份路徑/備份文件名
[root@mysql /]# mysqldump -u root -p test user   >   /backup/user-table.sql          # 將test庫中的user表備份到backup目錄中
Enter password:                   # 輸入密碼

備份一個或多個完整的庫:

mysqldump   [選項]   --databases      庫名1   庫名2   ……  >  /備份路徑/備份文件名
[root@mysql /]# mysqldump -u root -p  --databases  test mysql    >   /backup/databases.sql            # 將 test 和 mysql 庫備份到backup中
Enter password:                       # 輸入密碼

備份 MySQL 中的所有庫:

mysqldump   [選項]     --all-databases   >    /備份路徑/備份文件名
[root@mysql /]# mysqldump -u root -p   --opt   --all-databases   >   all-data.sql          # --opt:優(yōu)化執(zhí)行速度
Enter password:          # 輸入密碼
[root@mysql /]# ls backup/            # 查看備份文件
all-data.sql      databases.sql       user-table.sql

恢復數(shù)據(jù)庫:
恢復庫中的表

mysql     [選項]   庫名   <   /備份路徑/備份文件名
[root@mysql /]# mysql -u root -p  test   <   /backup/user-table.sql    
Enter password: 
[root@mysql /]# mysql -u root -p -e ' show  tables  from  test;'           // 驗證導入結果
Enter password: 
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+

恢復單個或多個庫:

[root@mysql /]# mysql -u root -p -e ' drop database test;'     // 刪除 test 數(shù)據(jù)庫,模擬故障
Enter password: 
[root@mysql /]# mysql -u root -p -e ' show databases;'        // 驗證 test 數(shù)據(jù)庫是否存在
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
[root@mysql /]# mysql -u root -p   <   /backup/databases.sql     // 執(zhí)行導入恢復操作
Enter password: 
[root@mysql /]# mysql -u root -p -e ' show databases;'       // 確認恢復后結果
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

MySQL 增量備份與恢復:
與完全備份不同,增量備份沒有重復數(shù)據(jù),備份量不大,時間段,但其恢復比較麻煩,需要上次完全備份及完全備份之后的所有增量備份之后才能恢復,而且要對所有增量備份逐個反推恢復。MySQL沒有提供直接的增量備份辦法,所以一般是通過MySQL提供的二進制日志來間接實現(xiàn)增量備份。

要進行MySQL的增量備份,首先需要開啟二進制日志功能:

[root@mysql /]# mkdir /usr/local/mysql/logs            # 創(chuàng)建一個存放二進制日志文件的目錄
[root@mysql /]# cd /usr/local/mysql/                       
[root@mysql mysql]# chown mysql:mysql logs/       # 設置目錄歸屬,使其能夠寫入
[root@mysql /]# vim /etc/my.cnf                # 編寫配置文件
[mysqld]
log-bin=/usr/local/mysql/logs/mysql-bin
[root@mysql /]# systemctl restart mysqld          # 重啟服務,使配置生效
[root@mysql /]# ll /usr/local/mysql/logs/mysql-bin.*         # 目錄下自動生成日志文件
-rw-rw---- 1 mysql mysql 120 Aug  2 17:04 /usr/local/mysql/logs/mysql-bin.000001
-rw-rw---- 1 mysql mysql  39 Aug  2 17:04 /usr/local/mysql/logs/mysql-bin.index

現(xiàn)在所有對數(shù)據(jù)庫的修改,都將記錄mysql-bin.000001文件中,當執(zhí)行“mysqladmin -u root -p flush-logs”刷新二進制日志后,將會繼續(xù)生成一個名為mysql-bin.000002的文件,之后所有的更改又將存在mysql-bin.000002文件中,以此類推,每刷新一次,就會生成一個新文件!
首先我們在表中先錄入一些信息,然后進行一次完整備份:

mysql> select * from user_info;
+------+----------+----------+
| id   | xingming | nianling |
+------+----------+----------+
| 001  | zhangsan |       20 |
| 002  | lisi     |       25 |
| 003  | wangwu   |       20 |
+------+----------+----------+
[root@mysql /]# mkdir /mysql_bak                # 創(chuàng)建一個備份存放位置
[root@mysql /]# mysqldump -u root -p   test user_info   > /mysql_bak/test_userinfo$(date +%F).sql           # 進行完整備份
Enter password: 
[root@mysql /]# ls /mysql_bak/               # 驗證備份結果
test_userinfo2019-08-02.sql
[root@mysql /]# mysqladmin -u root -p flush-logs            # 刷新日志文件
Enter password: 
[root@mysql /]# ll /usr/local/mysql/logs/mysql-bin.*         # 生成新的日志文件000002
-rw-rw---- 1 mysql mysql 1192 Aug  2 17:18 /usr/local/mysql/logs/mysql-bin.000001
-rw-rw---- 1 mysql mysql  120 Aug  2 17:18 /usr/local/mysql/logs/mysql-bin.000002
-rw-rw---- 1 mysql mysql   78 Aug  2 17:18 /usr/local/mysql/logs/mysql-bin.index

繼續(xù)錄入新的數(shù)據(jù),并進行增量備份:

mysql> select * from user_info;
+------+----------+----------+
| id   | xingming | nianling |
+------+----------+----------+
| 001  | zhangsan |       20 |
| 002  | lisi     |       25 |
| 003  | wangwu   |       20 |
| 004  | zhaoliu  |       20 |
| 005  | sunqi    |       30 |
+------+----------+----------+
[root@mysql /]# mysqladmin -u root -p flush-logs            # 刷新日志文件,這樣在000002中只有兩條數(shù)據(jù)的操作
Enter password: 
[root@mysql /]# cp /usr/local/mysql/logs/mysql-bin.000002 /mysql_bak/       # 將日志文件復制到備份目錄中

模擬user_info 這個表被誤刪除了,恢復:

[root@mysql /]# mysql -u root -p test   <   /mysql_bak/test_userinfo2019-08-02.sql    # 先恢復完整備份
Enter password: 
[root@mysql /]# mysql -u root -p -e ' select * from test.user_info;'      # 查看一下確認,恢復成功
Enter password: 
+------+----------+----------+
| id   | xingming | nianling |
+------+----------+----------+
| 001  | zhangsan |       20 |
| 002  | lisi     |       25 |
| 003  | wangwu   |       20 |
+------+----------+----------+
[root@mysql /]# mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002 | mysql -u root -p                              # 恢復增量備份,--no-defaults 選項必須要有
[root@mysql /]# mysql -u root -p -e ' select * from test.user_info;'       # 確認,增量備份恢復成功
Enter password: 
+------+----------+----------+
| id   | xingming | nianling |
+------+----------+----------+
| 001  | zhangsan |       20 |
| 002  | lisi     |       25 |
| 003  | wangwu   |       20 |
| 004  | zhaoliu  |       20 |
| 005  | sunqi    |       30 |
+------+----------+----------+

下來就是基于位置恢復和基于時間點恢復了,這兩種恢復是有很大的相同之處的,想要實現(xiàn),必需先查看二進制日志文件來確認恢復的位置或時間點。

[root@mysql /]# mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002 
……      // 省略部分內容
#at 199               # 這一行就是操作ID號了
#190802 17:21:40 server id 1  end_log_pos 346 CRC32 0xc61c38c9  Query   thread_id=4 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1564737700/*!*/;
insert into user_info (id,xingming,nianling) values('004','zhaoliu','20')
/*!*/;
#at 346
#190802 17:21:40 server id 1  end_log_pos 377 CRC32 0xea2c7707  Xid = 50
COMMIT/*!*/;                   # 操作確認標記  謹記一條操作在此才算結束
#at 377
#190802 17:22:09 server id 1  end_log_pos 456 CRC32 0x6265a2a6  Query   thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1564737729/*!*/;
BEGIN
/*!*/;
#at 456
#190802 17:22:09 server id 1  end_log_pos 601 CRC32 0x3727aeb7  Query   thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1564737729/*!*/;
insert into user_info (id,xingming,nianling) values('005','sunqi','30')
/*!*/;
#at 601
#190802 17:22:09 server id 1  end_log_pos 632 CRC32 0x17c4779a  Xid = 51
COMMIT/*!*/;
#at 632
#190802 17:24:05 server id 1  end_log_pos 679 CRC32 0x9c698f03  Rotate to mysql-bin.000003  pos: 4
DELIMITER ;
#End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@mysql /]# mysqlbinlog --no-defaults --stop-position='456' /mysql_bak/mysql-bin.000002 | mysql -u root -p               # 恢復操作ID‘456’ 之前的操作
Enter password: 

--start-position='456':表示為從操作456開始恢復,該日志文件456之前的數(shù)據(jù)不會恢復;
以上選項可更改為下面類型:
--stop-position='456':表示恢復到操作456就停止,該日志文件456之后的數(shù)據(jù)不會恢復;
基于時間點的恢復:
--start-datetime='2019-08-2 17:22:09':表示恢復該時間之后的數(shù)據(jù);
--stop-datetime='2019-08-2 17:22:09':表示僅恢復該時間之前的數(shù)據(jù);

MySQL應該如何備份與恢復就先給大家講到這里,對于其它相關問題大家想要了解的可以持續(xù)關注我們的行業(yè)資訊。我們的板塊內容每天都會捕捉一些行業(yè)新聞及專業(yè)知識分享給大家的。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI