在公司中備份的策略并不是千篇一律的,而是根據(jù)每個企業(yè) 的實際生產(chǎn)環(huán)境與業(yè)務(wù)需求制定合適的備份策略。無論是選擇完全備份還是增量備份,都需要考慮它們的優(yōu)缺點,是否適合當(dāng)前的生產(chǎn)環(huán)境。同時為了保證恢復(fù)的完整性,建議開啟二進(jìn)制日志功能,二進(jìn)制日志文件給恢復(fù)工作帶來了很大的靈活性,可以基于時間點或位置進(jìn)行恢復(fù),考慮到數(shù)據(jù)庫性能,可以將二進(jìn)制日志文件保存在其他安全的硬盤中。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、七星關(guān)區(qū)網(wǎng)站維護(hù)、網(wǎng)站推廣。
在進(jìn)行熱備時,備份操作和應(yīng)用服務(wù)在同時運行,這樣十分消耗系統(tǒng)資源,導(dǎo)致數(shù)據(jù)庫服務(wù)性能下降,這就要求我們選擇一個合適的時間(一般在應(yīng)用負(fù)擔(dān)很小的時候)再來進(jìn)行備份操作。
需要注意的是,不是備份就萬事大吉了,最好確認(rèn)備份是否可用,所以備份之后的恢復(fù)測試是非常有必要的。同時備份時間也要靈活調(diào)整,如:
數(shù)據(jù)庫備份類型可以從兩個角度來看待:
1、從物理與邏輯的角度:
物理備份是對數(shù)據(jù)庫操作系統(tǒng)的物理文件(如數(shù)據(jù)文件、日志文件等)的備份。這種類型的備份適用于在出現(xiàn)問題時需要快速恢復(fù)的大型重要數(shù)據(jù)庫。
物理備份有可以分為以下幾種類型:
①、冷備份:在數(shù)據(jù)庫關(guān)閉狀態(tài)下進(jìn)行備份操作;
②、熱備份:在數(shù)據(jù)庫處于運行狀態(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ù)量,或者在不同的機器體系上重新創(chuàng)建數(shù)據(jù)。
2、從數(shù)據(jù)庫的備份策略角度:
從數(shù)據(jù)庫的備份策略角度,數(shù)據(jù)庫的備份可分為完全備份、差異備份和增量備份。其中呢,完整備份是實現(xiàn)差異、增量備份的基礎(chǔ)。
來幾個備份實例:
1、物理冷備份與恢復(fù):
[root@localhost ~]# tar zcf /backup/MySQL_$(date +%F).tar.gz /usr/local/mysql/data #直接tar打包數(shù)據(jù)庫文件
[root@localhost ~]# cd /backup/
[root@localhost backup]# ls
mysql_2019-05-16.tar.gz #備份后的文件
[root@localhost backup]#
2、mysqldump備份與恢復(fù):
1)備份某一個表:
[root@localhost backup]# mysqldump -u root -p mysql user > mysql-user.sql #備份mysql庫中的user表
Enter password: #輸入密碼
[root@localhost backup]# ls #查看備份文件
mysql-user.sql
2)恢復(fù)mysql數(shù)據(jù)庫中的user表(注意路徑問題):
[root@localhost backup]# mysql -u root -p mysql < mysql-user.sql
Enter password:
3)備份mysql庫:
[root@localhost backup]# mysqldump -u root -p --databases mysql > mysql.sql #備份mysql庫
Enter password: #輸入密碼
[root@localhost backup]# ls #查看備份文件
mysql.sql
4)恢復(fù)mysql庫:
[root@localhost backup]# mysql -u root -p < mysql.sql
Enter password:
5)備份所有的庫(當(dāng)導(dǎo)出的數(shù)據(jù)量較大時,可以添加“--opt”選項以優(yōu)化執(zhí)行速度):
[root@localhost backup]# mysqldump -u root -p --opt --all-databases > all-data.sql #備份所有庫
Enter password: #輸入密碼
[root@localhost backup]# ls #查看備份文件
all-data.sql
3、MySQL增量備份與恢復(fù):
與完全備份不同,增量備份沒有重復(fù)數(shù)據(jù),備份量不大,時間段,但其恢復(fù)比較麻煩,需要上次完全備份及完全備份之后的所有增量備份之后才能恢復(fù),而且要對所有增量備份逐個反推恢復(fù)。MySQL沒有提供直接的增量備份辦法,所以一般是通過MySQL提供的二進(jìn)制日志來間接實現(xiàn)增量備份。
要進(jìn)行MySQL的增量備份,那么首先需要開啟二進(jìn)制日志功能:
[root@localhost ~]# mkdir /usr/local/mysql/logs #創(chuàng)建專門存放二進(jìn)制日志文件的目錄
[root@localhost ~]# chown mysql:mysql /usr/local/mysql/logs #更改目錄歸屬,使其擁有寫入權(quán)限
[root@localhost ~]# vim /etc/my.cnf #編輯MySQL的主配文件
[mysqld]
log-bin=/usr/local/mysql/logs/mysql-bin #寫入該行,指定二進(jìn)制日志的存放位置
[root@localhost ~]# systemctl restart mysqld #重啟服務(wù)
[root@localhost ~]# ls -l /usr/local/mysql/logs #然后即可看到目錄下自動生成的日志文件
-rw-rw----. 1 mysql mysql 120 5月 16 14:16 mysql-bin.000001
-rw-rw----. 1 mysql mysql 39 5月 16 14:16 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文件中,以此類推.......
接下來對下面test庫中的user_info這個表進(jìn)行備份:
mysql> select * from user_info;
+---------+----------+---------+
| gonghao | xingming | xingbie |
+---------+----------+---------+
| 1 | zhangsan | nan |
| 2 | lisi | nan |
| 3 | wangwu | nan |
+---------+----------+---------+
1)先進(jìn)行一次完全備份:
[root@localhost ~]# mysqldump -u root -p test user_info >/backup/user_info_$(date +%F).sql; #完全備份
Enter password: #輸入密碼
[root@localhost ~]# ls /backup/ #查看備份生成的文件
user_info_2019-05-16.sql
2)刷新二進(jìn)制文件:
[root@localhost ~]# mysqladmin -u root -p flush-logs #刷新日志文件
Enter password:
[root@localhost ~]# ls -l /usr/local/mysql/logs/ 查看,每次刷新后,都會多出一個日志文件,
之后所有的修改,都將保存在這個日志文件中
-rw-rw----. 1 mysql mysql 1007 5月 16 14:36 mysql-bin.000001
-rw-rw----. 1 mysql mysql 120 5月 16 14:36 mysql-bin.000002
-rw-rw----. 1 mysql mysql 78 5月 16 14:36 mysql-bin.index
3)現(xiàn)在數(shù)據(jù)庫中又多了兩條數(shù)據(jù):
mysql> select * from user_info;
+---------+----------+---------+
| gonghao | xingming | xingbie |
+---------+----------+---------+
| 1 | zhangsan | nan |
| 2 | lisi | nan |
| 3 | wangwu | nan |
| 4 | zhaoliu | nan |
| 5 | sunqi | nan |
+---------+----------+---------+
4)如果現(xiàn)在這個表被誤刪了,那么可以這樣恢復(fù):
[root@localhost ~]# mysqladmin -u root -p flush-logs #刷新日志
Enter password:
[root@localhost ~]# mysql -u root -p test < /backup/user_info_2019-05-16.sql #先恢復(fù)完全備份
Enter password:
[root@localhost ~]# mysql -u root -p -e ' select * from test.user_info;' #完全備份的內(nèi)容恢復(fù)成功
Enter password:
+---------+----------+---------+
| gonghao | xingming | xingbie |
+---------+----------+---------+
| 1 | zhangsan | nan |
| 2 | lisi | nan |
| 3 | wangwu | nan |
+---------+----------+---------+
在恢復(fù)增量備份時,--no-defaults選項必須要有,否則會報錯:
[root@localhost ~]# mysqlbinlog --no-defaults /usr/local/mysql/logs/mysql-bin.000002 | mysql -u root -p #恢復(fù)增量備份
Enter password:
[root@localhost ~]# mysql -u root -p -e ' select * from test.user_info;' #查看是否恢復(fù)成功
Enter password:
+---------+----------+---------+
| gonghao | xingming | xingbie |
+---------+----------+---------+
| 1 | zhangsan | nan |
| 2 | lisi | nan |
| 3 | wangwu | nan |
| 4 | zhaoliu | nan |
| 5 | sunqi | nan |
+---------+----------+---------+
恢復(fù)成功了,那么還有基于位置、時間的恢復(fù),命令格式如下:
[root@localhost ~]# mysqlbinlog --no-defaults /usr/local/mysql/logs/mysql-bin.000002 #使用工具查看日志文件
........................
# at 199 #199即為一個動作的位置,接下來就是這個動作的時間
#190516 14:39:47 server id 1 end_log_pos 322 CRC32 0x5339b5bd Query thread_id=5 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1557988787/*!*/;
insert into user_info values('4','zhaoliu','nan')
/*!*/;
# at 322
#190516 14:39:47 server id 1 end_log_pos 353 CRC32 0x873df67e Xid = 54
COMMIT/*!*/; #該字樣表示為提交
# at 353
#190516 14:39:57 server id 1 end_log_pos 432 CRC32 0xcd2543f7 Query thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1557988797/*!*/;
BEGIN
/*!*/;
# at 432
#190516 14:39:57 server id 1 end_log_pos 553 CRC32 0xc1300526 Query thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1557988797/*!*/;
insert into user_info values('5','sunqi','nan')
/*!*/;
# at 553
#190516 14:39:57 server id 1 end_log_pos 584 CRC32 0xebb496fb Xid = 55
COMMIT/*!*/;
......................
[root@localhost ~]# mysqlbinlog --no-defaults --start-position='353' /usr/local/mysql/logs/mysql-bin.000002 | mysql -u root -p
Enter password:
--start-position='353':表示為從位置353開始恢復(fù),該日志文件353之前的數(shù)據(jù)不會恢復(fù);
以上選項可更改為下面類型:
--stop-position='353':表示恢復(fù)到位置353就停止,該日志文件353之后的數(shù)據(jù)不會恢復(fù);
基于時間點的恢復(fù):
--start-datetime='2019-05-16 14:39:47':表示恢復(fù)該時間之后的數(shù)據(jù);
--stop-datetime='2019-05-16 14:39:47':表示僅恢復(fù)該時間之前的數(shù)據(jù);
切記,所有類型的增量恢復(fù)之前,都必須先執(zhí)行最近一次的完全恢復(fù)。