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