本文主要給大家簡單講講MySQL應(yīng)該如何備份與恢復(fù),相關(guān)專業(yè)術(shù)語大家可以上網(wǎng)查查或者找一些相關(guān)書籍補(bǔ)充一下,這里就不涉獵了,我們就直奔主題吧,希望MySQL應(yīng)該如何備份與恢復(fù)這篇文章可以給大家?guī)硪恍?shí)際幫助。
10年的蘭考網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整蘭考建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“蘭考網(wǎng)站設(shè)計(jì)”,“蘭考網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
在進(jìn)行熱備時,備份操作和應(yīng)用服務(wù)在同時運(yùn)行,這樣十分消耗系統(tǒng)資源,導(dǎo)致數(shù)據(jù)庫服務(wù)性能下降,這就要求我們選擇一個合適的時間(一般在應(yīng)用負(fù)擔(dān)很小的時候)再來進(jìn)行備份操作。
需要注意的是,不是備份就萬事大吉了,最好確認(rèn)備份是否可用,所以備份之后的恢復(fù)測試是非常有必要的。同時備份時間也要靈活調(diào)整,如:
數(shù)據(jù)更新頻繁,則應(yīng)該頻繁地備份。
數(shù)據(jù)的重要性,在有適當(dāng)更新時進(jìn)行備份。
在數(shù)據(jù)庫壓力小的時間段進(jìn)行備份,如一周一次完全備份,每天進(jìn)行增量備份。
中小公司,完全備份一般一天一次即可。
大公司可每周進(jìn)行一次完全備份,每天進(jìn)行一次增量備份。
盡量為企業(yè)實(shí)現(xiàn)主從復(fù)制架構(gòu),以增加數(shù)據(jù)的可用性。
數(shù)據(jù)庫備份類型可以從兩個角度來看待:
1、從物理與邏輯的角度:
物理備份是對數(shù)據(jù)庫操作系統(tǒng)的物理文件(如數(shù)據(jù)文件、日志文件等)的備份。這種類型的備份適用于在出現(xiàn)問題時需要快速恢復(fù)的大型重要數(shù)據(jù)庫。
物理備份有可以分為以下幾種類型:
①、冷備份:在數(shù)據(jù)庫關(guān)閉狀態(tài)下進(jìn)行備份操作;
②、熱備份:在數(shù)據(jù)庫處于運(yùn)行狀態(tài)時進(jìn)行備份操作,該備份方法依賴數(shù)據(jù)庫的日志文件;
③、溫備份:數(shù)據(jù)庫鎖定表格(不可寫入,但可讀取)的狀態(tài)下進(jìn)行備份;
邏輯備份是對數(shù)據(jù)庫邏輯組件(如表等數(shù)據(jù)庫對象)的備份,表示為邏輯數(shù)據(jù)庫結(jié)構(gòu)(create database、create table語句)和內(nèi)容(insert語句或分隔文本文件)的信息。這種類型的備份使用于可以編輯數(shù)據(jù)值或表結(jié)構(gòu)較小的數(shù)據(jù)量,或者在不同的機(jī)器體系上重新創(chuàng)建數(shù)據(jù)。
2、從數(shù)據(jù)庫的備份策略角度:
從數(shù)據(jù)庫的備份策略角度,數(shù)據(jù)庫的備份可分為完全備份、差異備份和增量備份。其中呢,完整備份是實(shí)現(xiàn)差異、增量備份的基礎(chǔ)。
完整備份:每次對數(shù)據(jù)進(jìn)行完整的備份,即對整個數(shù)據(jù)庫的備份。備份與恢復(fù)的操作非常簡單,但是數(shù)據(jù)存在大量的重復(fù),會占用大量的磁盤空間,備份的時間也很長。
差異備份:備份那些自從上次完全備份之后被修改過的所有文件,備份的時間點(diǎn)是從上次完整備份起,備份數(shù)據(jù)會越來越大,恢復(fù)數(shù)據(jù)時,只需恢復(fù)上次的完全備份和最近的一次差異備份。
增量備份:只有在那些在上次完全備份或增量備份后被修改的文件才會被備份,以上次完整備份或上次增量備份的時間為時間點(diǎn),僅僅備份這之間的數(shù)據(jù)變化,因而備份的數(shù)據(jù)量也小,占用空間小,備份速度快,但恢復(fù)時,需要從上一次的完整備份開始到最后一次增量備份之間的所有增量依次恢復(fù),一旦中間的數(shù)據(jù)發(fā)生損壞,將導(dǎo)致數(shù)據(jù)的丟失。
備份實(shí)例:
1、物理冷備份與恢復(fù):
[root@mysql /]# systemctl stop mysqld #先停掉服務(wù) [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)當(dāng)前日期 [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ù)庫存放目錄移動到另一個目錄
恢復(fù)數(shù)據(jù)庫:
[root@mysql /]# mkdir /restore/ [root@mysql /]# tar zxf /backup/mysql_all-2019-08-02.tar.gz -C /restore/ # 要先將備份文件釋放到一個空目錄中,然后將需要的恢復(fù)到原位置 [root@mysql /]# mv /restore/usr/local/mysql/data/ /usr/local/mysql/ # 將數(shù)據(jù)庫目錄恢復(fù)到原位置 [root@mysql /]# systemctl restart mysqld # 重啟服務(wù)驗(yàn)證
2、mysqldump 備份與恢復(fù):
備份數(shù)據(jù)庫
備份指定庫中的表:
mysqldump [選項(xiàng)] 庫名 表名 表名2 …… > /備份路徑/備份文件名 [root@mysql /]# mysqldump -u root -p test user > /backup/user-table.sql # 將test庫中的user表備份到backup目錄中 Enter password: # 輸入密碼
備份一個或多個完整的庫:
mysqldump [選項(xiàng)] --databases 庫名1 庫名2 …… > /備份路徑/備份文件名 [root@mysql /]# mysqldump -u root -p --databases test mysql > /backup/databases.sql # 將 test 和 mysql 庫備份到backup中 Enter password: # 輸入密碼
備份 MySQL 中的所有庫:
mysqldump [選項(xiàng)] --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
恢復(fù)數(shù)據(jù)庫:
恢復(fù)庫中的表
mysql [選項(xiàng)] 庫名 < /備份路徑/備份文件名 [root@mysql /]# mysql -u root -p test < /backup/user-table.sql Enter password: [root@mysql /]# mysql -u root -p -e ' show tables from test;' // 驗(yàn)證導(dǎo)入結(jié)果 Enter password: +----------------+ | Tables_in_test | +----------------+ | user | +----------------+
恢復(fù)單個或多個庫:
[root@mysql /]# mysql -u root -p -e ' drop database test;' // 刪除 test 數(shù)據(jù)庫,模擬故障 Enter password: [root@mysql /]# mysql -u root -p -e ' show databases;' // 驗(yàn)證 test 數(shù)據(jù)庫是否存在 Enter password: +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ [root@mysql /]# mysql -u root -p < /backup/databases.sql // 執(zhí)行導(dǎo)入恢復(fù)操作 Enter password: [root@mysql /]# mysql -u root -p -e ' show databases;' // 確認(rèn)恢復(fù)后結(jié)果 Enter password: +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+
MySQL 增量備份與恢復(fù):
與完全備份不同,增量備份沒有重復(fù)數(shù)據(jù),備份量不大,時間段,但其恢復(fù)比較麻煩,需要上次完全備份及完全備份之后的所有增量備份之后才能恢復(fù),而且要對所有增量備份逐個反推恢復(fù)。MySQL沒有提供直接的增量備份辦法,所以一般是通過MySQL提供的二進(jìn)制日志來間接實(shí)現(xiàn)增量備份。
要進(jìn)行MySQL的增量備份,首先需要開啟二進(jìn)制日志功能:
[root@mysql /]# mkdir /usr/local/mysql/logs # 創(chuàng)建一個存放二進(jìn)制日志文件的目錄 [root@mysql /]# cd /usr/local/mysql/ [root@mysql mysql]# chown mysql:mysql logs/ # 設(shè)置目錄歸屬,使其能夠?qū)懭? [root@mysql /]# vim /etc/my.cnf # 編寫配置文件 [mysqld] log-bin=/usr/local/mysql/logs/mysql-bin [root@mysql /]# systemctl restart mysqld # 重啟服務(wù),使配置生效 [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文件中,當(dāng)執(zhí)行“mysqladmin -u root -p flush-logs”刷新二進(jìn)制日志后,將會繼續(xù)生成一個名為mysql-bin.000002的文件,之后所有的更改又將存在mysql-bin.000002文件中,以此類推,每刷新一次,就會生成一個新文件!
首先我們在表中先錄入一些信息,然后進(jìn)行一次完整備份:
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 # 進(jìn)行完整備份 Enter password: [root@mysql /]# ls /mysql_bak/ # 驗(yàn)證備份結(jié)果 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ù),并進(jìn)行增量備份:
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/ # 將日志文件復(fù)制到備份目錄中
模擬user_info 這個表被誤刪除了,恢復(fù):
[root@mysql /]# mysql -u root -p test < /mysql_bak/test_userinfo2019-08-02.sql # 先恢復(fù)完整備份 Enter password: [root@mysql /]# mysql -u root -p -e ' select * from test.user_info;' # 查看一下確認(rèn),恢復(fù)成功 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 # 恢復(fù)增量備份,--no-defaults 選項(xiàng)必須要有 [root@mysql /]# mysql -u root -p -e ' select * from test.user_info;' # 確認(rèn),增量備份恢復(fù)成功 Enter password: +------+----------+----------+ | id | xingming | nianling | +------+----------+----------+ | 001 | zhangsan | 20 | | 002 | lisi | 25 | | 003 | wangwu | 20 | | 004 | zhaoliu | 20 | | 005 | sunqi | 30 | +------+----------+----------+
下來就是基于位置恢復(fù)和基于時間點(diǎn)恢復(fù)了,這兩種恢復(fù)是有很大的相同之處的,想要實(shí)現(xiàn),必需先查看二進(jìn)制日志文件來確認(rèn)恢復(fù)的位置或時間點(diǎn)。
[root@mysql /]# mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002 …… // 省略部分內(nèi)容 #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/*!*/; # 操作確認(rèn)標(biāo)記 謹(jǐn)記一條操作在此才算結(jié)束 #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 # 恢復(fù)操作ID‘456’ 之前的操作 Enter password:
--start-position='456':表示為從操作456開始恢復(fù),該日志文件456之前的數(shù)據(jù)不會恢復(fù);
以上選項(xiàng)可更改為下面類型:
--stop-position='456':表示恢復(fù)到操作456就停止,該日志文件456之后的數(shù)據(jù)不會恢復(fù);
基于時間點(diǎn)的恢復(fù):
--start-datetime='2019-08-2 17:22:09':表示恢復(fù)該時間之后的數(shù)據(jù);
--stop-datetime='2019-08-2 17:22:09':表示僅恢復(fù)該時間之前的數(shù)據(jù);
MySQL應(yīng)該如何備份與恢復(fù)就先給大家講到這里,對于其它相關(guān)問題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會捕捉一些行業(yè)新聞及專業(yè)知識分享給大家的。