Mysql备份恢复(xtrabackup)
| 備份的方案 | ||
| 完整/完全備份 | full mysqldump | 每次都將所有數據(不管自第一次備份以來有沒有修改過),進行一次完整的復制 |
| 增量備份 | incremental backup | 每次備份都是基于上一次的時間 一天備份一次 |
| 差異備份 | differential backup | 從上一次完整備份開始,接下來的每一天都是從上一次完整備份開始 |
| 在公司用的最多的就是完整備份,增量備份 | ||
這三種方案,xtrabackup全部都支持。像binlog日志最適合做增量備份,因為可以在要一天結束之后開始下一天之前,先讓它產生一個全新的日志文件,刷新一個全新的日志文件,開始第二天新的備份。
mysqldump里的-A就是完整備份,能不能用mysqldump做增量備份?
能做,不好做,假裝有數據庫,正在運行,昨天周一晚上24點已經把昨天的備份完了,不管你用什么方法,從今天凌晨0點到今天晚上24點,到24點的時候做備份這一天內的數據,很難做,不好定位時間,因為mysqldump備份的是表和庫,還得去查一下,早上0點開始做了哪些操作,修改了哪個表,再去備份表里開始的位置,太難了,能做是可以,但是沒有人做這種選擇。
能不能用mysqldump做差異備份?
差異備份是從你上一次完整備份后的新數據,接下來的每一天都是從上一次完整備份開始,周一備份的是周一整天的,周二備份的是周一和周二的,周三備份的是周一周二周三的。但是它就是沒備份周一之前的,要做完整備份它連周一之前的都備份上了,只備份周二的,拿mysqldump不好做,太難了。就周一周二的。
所以mysqldump不適合做差異備份和增量備份。它適合做完整備份。(表的備份,庫的備份)
到了公司會做出選擇,像mysqldump最爽,方便簡單,缺點就是慢。
完整備份流程
首先創建備份目錄: 在哪創建都行,
創建備份目錄:
[root@k full]# mkdir -pv /xtrabackup/full
備份:
[root@k full]# innobackupex --user=root --password='Helloworld123!@' /xtrabackup/full
(innobackupex這個命令可以補全不需要提前做環境變量)/xtrabackup/full(備份的目錄)
?它在指定的目錄下創建了一個目錄。 ls查看多了一個目錄,備份的文件就在那里。
?一般情況下做備份的時候不關閉數據庫,讓數據庫同時給客戶端可以提供服務,只不過會影響客戶端的訪問,因為它在操作文件的同時,可能會把操作的表稍微鎖一下,等拷完之后再把鎖打開,但是恢復數據的時候肯定要把數據庫先關掉。
什么情況下才會恢復一個完整的備份?
數據庫已經不能用增量備份,差異備份恢復數據了,它壞的已經不能用了。現在有一臺全新的數據庫,全新的環境,只需要把數據恢復回去就行。
可以換臺全新的服務器,把備份目錄打個包拷過去再解壓,再恢復。這樣就不需要,停止數據庫?,清理環境這兩步了。
完整備份恢復流程
1. 先停止數據庫 systemctl stop mysqld
2. 清理環境 (清配置文件,數據目錄,日志文件。)要想清理配置文件,最好做個備份,等恢復回來再拷貝過來?
3. 重演回滾--> 恢復數據
4. 修改權限
5. 啟動數據庫
關閉數據庫:
# systemctl stop mysqld??停止數據庫,如果報錯關了防火墻再看?
# rm -rf /var/lib/mysql/*? ?刪除存儲數據的目錄,清庫
# rm -rf /var/log/mysqld.log? ?刪除日志文件
# rm -rf /var/log/mysql-slow/slow.log??刪除慢查詢日志
恢復之前的驗證恢復:?
# innobackupex --apply-log /xtrabackup/full/2022-09-06_11-19-07//?就是把備份的東西全都記錄一下,(模擬的不會真正的恢復數據)--apply-log +備份的目錄
確認數據庫目錄:
已經把測試做好了,感覺沒什么問題,但我要把數據恢復到哪個目錄下,配置文件下可以改這個目錄,恢復之前需要確認配置文件內有數據庫目錄指定,不然xtrabackup不知道恢復到哪里
vim ?/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql???
?恢復數據:
# innobackupex --copy-back /xtrabackup/full/2022-09-06_11-19-07/
?copy-back后面跟目錄
修改權限:
# chown mysql.mysql /var/lib/mysql -R
這個文件是從別處拷過來的,文件的權限全部都是root所有,需要把所有者所有組都改成mysql。
啟動數據庫:??
# systemctl start mysqld
?登進去mysql看看自己創建的庫和mysql庫還在不在,其他的沒了換一個就行。
增量備份流程
原理:每次備份上一次備份到現在產生的新數據(不管和上一次備份隔了多長時間,都是增量)
準備測試庫和表:假如今天是周一,
?創建了一個新庫,新庫里面創建了一張新表,新表里添加了一些新的記錄,產生了一些全新的數據。增量備份就是備份這些全新的數據。
假如周一結束了,我開始做備份,
先做一個完整備份:周一
innobackupex --user=root --password='(Helloworld123)' /xtrabackup
做完完整備份,cd到/xtrabackup,觀察一下
增量備份:周二 —— 周六 讓它產生一些新的數據,
到周二了,先讓它產生一些新的數據,mysql連接進去
?innobackupex --user=root --password='(Helloworld123)' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2022-09-06_11-43-33
?incremental /xtrabackup(增量備份數據存儲的位置)
incremental-basedir (基準目錄)因為每一次增量備份是基于上一次完整備份,或者是增量備份,上一次還沒有增量,上一次是完整備份,所以這里是上一次完整備份的目錄。
現在是模擬的一整天,真的想模擬一整天應該改時間 9.7號下一次備份改到9.8? 現在改不改沒什么太大關系,有分鐘有秒。現在再要做備份把上面那條命令改一改。基于上一次增量備份
備完之后,觀察一下
第一次增量備份備完了,再插入新的數據,又開始產生新的數據,又過了一天,又要開始做增量備份,接下來的過程都是這,一直持續一周,持續到周六,周六做完那一天的增量備份之后,我又開始做完整備份,就是一個輪回。
?如果現在再做增量備份,要把上一條命令改一下
?基于上一次增量備份
?接下來就一直重復。備份就一直持續下去,過了幾天數據庫壞了,得恢復數據
看想恢復哪一天的數據,比如前兩天的數據壞了,先恢復倒數第二天再恢復倒數第一天的
如果前面的數據這幾天的數據都掛了,要恢復最前面的再恢復倒數第二的,不能從最近的恢復
增量備份恢復流程
1. 停止數據庫
2. 清理環境
3. 依次重演回滾redo log--> 恢復數據
4. 修改權限
5. 啟動數據庫
6. binlog恢復 (今天這一天還沒過完,今天的增量備份還沒有做,如果沒啟用binlog,那我從上一次增量備份結束到現在這幾個小時的數據就丟了)所以平時就算用xtrabackup,還得把binlog啟動起來。
增量備份每天的固定的時間點,24小時過完了,開始做增量備份,備份上面24個小時的,但是在24小時中間數據庫壞了,中間12小時還沒有做數據備份。這里就丟了,這里就是第六步binlog恢復,和上一期講的是一樣的,找到開始的位置從早上0點,到最后結束,恢復就完了。
清理環境
?指定自己完整備份的目錄
?第一次增量和完整備份合到一起了。
?改時間
?假如還有第三次,第四次,每一次都要在這兒給它合一次,前面的步驟不變,前面永遠都是我的第一次完整備份的目錄。
恢復數據
# innobackupex --copy-back /xtrabackup/2022-09-06_11-43-33/
?檢查一下恢復沒有
?但是權限都是root
?chown -R mysql.mysql /var/lib/mysql? ? ?-R 遞歸? 這里面所有的文件所有的目錄都修改
# systemctl start mysqld? ?啟動服務
mysql去訪問一下,最好去查一下表
?差異備份流程
增量備份和差異備份的區別:
增量備份每次備份都是基于上一次的結尾開始的,上一次結束的時間。差異備份每次都是從最后一次完整備份開始。
1、完整備份:周一
create database testdb;
use testdb;
create table test2(id int);
insert into test values(1);
select * from test;
創建了一個新庫,新庫里面創建了一張新表,新表里添加了一些新的記錄,產生了一些全新的數據。做完整備份innobackupex --user=root --password=888 /xtrabackup
2.差異備份:周二 —— 周六
insert into testdb.test2 values(2);
# innobackupex --user=root --password=888 --incremental /xtrabackup --incremental-basedir=/xtrabackup/完全備份目錄(周一) 第一次差異備份,指定一下備份到哪個地方去,基準目錄每次都是完整備份的目錄
insert into testdb.test2 values(3); 在每一次差異備份之前,需要先插入點新數據
# innobackupex --user=root --password=888 --incremental /xtrabackup --incremental-basedir=/xtrabackup/完全備份目錄(周二)
insert into testdb.test values(4);
# innobackupex --user=root --password=888 --incremental /xtrabackup --incremental-basedir=/xtrabackup/完全備份目錄(周三)
差異備份恢復流程
1. 停止數據庫
2. 清理環境
3. 重演回滾redo log(周一,某次差異)--> 恢復數據
4. 修改權限
5. 啟動數據庫
6. binlog恢復
1.恢復全量的redo log
指定一下完備目錄,先恢復完備目錄
# innobackupex --apply-log --redo-only /xtrabackup/完全備份目錄(周一)
2.恢復差異的redo log
恢復差異,第一個目錄還是完備目錄,第二個目錄直接指定一個,恢復到哪一天,就指定哪一天的目錄就完了。
# innobackupex --apply-log --redo-only /xtrabackup/完全備份目錄(周一)--incremental-dir=/xtrabacku/? ?
想恢復到哪里就指定哪個就行,不用有那么多次的恢復了,就兩次恢復,第一次恢復完備,完備之后,想恢復到哪就指定一個目錄就行。
其實像差異備份也是把指定的那一天前面到完整備份之前所有的東西和完整備份合在了一起。一樣的原理。
3.復制數據文件(cp,rsync),修改權限
備份數據肯定是備份到遠程機器或移動硬盤,哪天想恢復了,得把它拷回來(cp,rsync)但是得用這條指令innobackupex --copy-back /xtrabackup/給它恢復數據(copy-back)。
4.啟動mysqld
改權限,start
5.通過binlog增量恢復
(今天這一天還沒過完,今天的增量備份還沒有做,如果沒啟用binlog,那我從上一次增量備份結束到現在這幾個小時的數據就丟了)所以平時就算用xtrabackup,還得把binlog啟動起來。
總之,這三種方式,都需要用binlog去恢復最后的小數據。
總結
以上是生活随笔為你收集整理的Mysql备份恢复(xtrabackup)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页数据抓取工具-数据采集软件
- 下一篇: APM飞控软件在环SITL仿真