mysql增量備份及恢復(fù)的操作方法
1 簡(jiǎn)介
1.1 增量備份簡(jiǎn)介
增量備份是指在一次全備份或上一次增量備份后,以后每次的備份只需備份與前一次相比增加或者被修改的文件。這就意味著,第一次增量備份的對(duì)象是進(jìn)行全備后所產(chǎn)生的增加和修改的文件;第二次增量備份的對(duì)象是進(jìn)行第一次增量備份后所產(chǎn)生的增加和修改的文件,如此類(lèi)推。這種備份方式最顯著的優(yōu)點(diǎn)就是:沒(méi)有重復(fù)的備份數(shù)據(jù),因此備份的數(shù)據(jù)量不大,備份所需的時(shí)間很短。但增量備份的數(shù)據(jù)恢復(fù)是比較麻煩的。您必須具有上一次全備份和所有增量備份磁帶(一旦丟失或損壞其中的一個(gè)增量,就會(huì)造成恢復(fù)的失?。⑶宜鼈儽仨氀刂鴱娜珎浞莸揭来卧隽總浞莸臅r(shí)間順序逐個(gè)反推恢復(fù),因此這就極大地延長(zhǎng)了恢復(fù)時(shí)間。
假如我們有一個(gè)數(shù)據(jù)庫(kù),有20G的數(shù)據(jù),每天會(huì)增加10M的數(shù)據(jù),數(shù)據(jù)庫(kù)每天都要全量備份一次,這樣的話(huà)服務(wù)器的壓力比較大,因此我們只需要備份增加的這部分?jǐn)?shù)據(jù),這樣減少服務(wù)器的負(fù)擔(dān)。
1.2 binlog簡(jiǎn)介
binlog日志由配置文件的log-bin選項(xiàng)負(fù)責(zé)啟用,Mysql服務(wù)器將在數(shù)據(jù)根目錄創(chuàng)建兩個(gè)新文 件XXX-bin.001和xxx-bin.index,若配置選項(xiàng)沒(méi)有給出文件名,Mysql將使用主機(jī)名稱(chēng)命名這兩個(gè)文件,其中.index文件包含一份全體日志文件的清單。 Mysql會(huì)把用戶(hù)對(duì)所有數(shù)據(jù)庫(kù)的內(nèi)容和結(jié)構(gòu)的修改情況記入XXX-bin.n文件,而不會(huì)記錄 SELECT和沒(méi)有實(shí)際更新的UPDATE語(yǔ)句。
當(dāng)MySQL數(shù)據(jù)庫(kù)停止或重啟時(shí),服務(wù)器會(huì)把日志文件記入下一個(gè)日志文件,Mysql會(huì)在重啟時(shí)生成一個(gè)新的binlog日志文件,文件序號(hào)遞增,此外,如果日志文件超過(guò)max_binlog_size系統(tǒng)變量配置的上限時(shí),也會(huì)生成新的日志文件。
2 binlog日志操作
2.1 開(kāi)啟binlog日志
在my.cnf或my.ini中增加
[mysqld] log-bin=/data/3306/mysql-bin
其中:log-bin若不顯示指定存儲(chǔ)目錄,則默認(rèn)存儲(chǔ)在mysql的data目錄下
binlog_format的幾種格式:(STATEMENT,ROW和MIXED)
STATEMENT:基于SQL語(yǔ)句的復(fù)制(statement-based replication, SBR) 默認(rèn)的格式
ROW:基于行的復(fù)制(row-based replication, RBR)
MIXED:混合模式復(fù)制(mixed-based replication, MBR)
啟動(dòng)后會(huì)產(chǎn)生mysql-bin.*這樣的文件,每啟動(dòng)一次,就會(huì)增加一個(gè)或者多個(gè)。如果全備的時(shí)候加-F參數(shù)的話(huà)也會(huì)增加一個(gè)binlog二進(jìn)制文件或者mysqladmin flush-log也會(huì)增加
[root@moremysql ~]# ll /data/3306/ -rw-rw---- 1 mysql mysql 264 Sep 16 15:31 mysql-bin.000001 -rw-rw---- 1 mysql mysql 616 Sep 17 11:38 mysql-bin.index -rw-rw---- 1 mysql mysql 6 Sep 17 11:29 mysqld.pid -rw-r----- 1 mysql root 23377 Sep 17 11:29 mysql_oldboy3306.err srwxrwxrwx 1 mysql mysql 0 Sep 17 11:29 mysql.sock
查看binlog開(kāi)啟情況和binlog的設(shè)置大小
mysql> show variables like 'log_bin%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | ON | | log_bin_trust_function_creators | OFF | +---------------------------------+-------+
mysql> show variables like 'binlog%'; +-----------------------------------------+-----------+ | Variable_name | Value | +-----------------------------------------+-----------+ | binlog_cache_size | 1048576 | | binlog_direct_non_transactional_updates | OFF | | binlog_format | STATEMENT | | binlog_stmt_cache_size | 32768 | +-----------------------------------------+-----------+
2.2 查看binlog日志內(nèi)容
[root@moremysql ~]# mysqlbinlog /data/3306/mysql-bin.000009 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #170917 11:19:55 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.32-log created 170917 11:19:55 BINLOG ' 2+m9WQ8BAAAAZwAAAGsAAAAAAAQANS41LjMyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA== '/*!*/; # at 107 #170917 11:21:29 server id 1 end_log_pos 150 Rotate to mysql-bin.000010 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*/;
日志內(nèi)容部分是不可查看的,這是因?yàn)閎inlog二進(jìn)制日志格式默認(rèn)是STATEMENT,如果是行級(jí)模式ROW就可以查看了,可以用--base64-output=decode-rows -v參數(shù)臨時(shí)用ROW模式來(lái)查看
[root@moremysql ~]# mysqlbinlog --base64-output=decode-rows -v /data/3306/data/mysql-bin.000009 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; mysqlbinlog: File '/data/3306/data/mysql-bin.000009' not found (Errcode: 2) DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysqlbinlog命令參數(shù):
1、作用:解析binlog日志為sql語(yǔ)句
2、-d 參數(shù)根據(jù)指定庫(kù)拆分binlog(單表通過(guò)關(guān)鍵字過(guò)濾)
3、位置參數(shù):--start-position=365 --stop-position=456,精確定位去內(nèi)容
4、時(shí)間參數(shù) --start-datetime='2017-10-16 17:16:15' --stop-datetime='2017-10-16 17:30:15' 模糊取內(nèi)容,不太精確
5、-r 將語(yǔ)句導(dǎo)入到指定文件名中,相當(dāng)于重定向>
6、解析ROW 級(jí)別binlog日志的方法: mysqlbinlog --base64-output=decode-rows -v mysql-bin.000004
刪除binlog日志文件的方式有:
mysql>reset master;清空bin-log
mysql>PURGE MASTERLOGS TO 'mysql-bim.000005' 刪除mysql-bim.000005之前的bin-log mysql-bim.000005本身保留
3、mysql數(shù)據(jù)庫(kù)備份與恢復(fù)
3.1、備份數(shù)據(jù)庫(kù)
全備之前的binlog文件,只有一個(gè)binlog文件mysql-bin.000001
[root@moremysql ~]# ll /data/3306/ total 72 drwxr-xr-x 5 mysql mysql 4096 Sep 17 11:29 data -rw-r--r-- 1 mysql mysql 1982 Sep 17 11:29 my.cnf -rw-r--r-- 1 root root 1899 Sep 17 00:22 my.cnf.ori -rwx------ 1 mysql mysql 1307 Sep 16 15:29 mysql -rw-rw---- 1 mysql mysql 107 Sep 17 13:01 mysql-bin.000001 -rw-rw---- 1 mysql mysql 28 Sep 17 13:01 mysql-bin.index
全備
[root@moremysql ~]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B -x -F -R --master-data=2 class |gzip >class_$(date +%F).sql.gz
全備參數(shù)說(shuō)明:
-B指定數(shù)據(jù)庫(kù) -F刷新日志 -R備份存儲(chǔ)過(guò)程等 -x鎖表 --master-data在備份語(yǔ)句里添加CHANGEMASTER語(yǔ)句以及binlog文件及位置點(diǎn)信息
全備后的binlog文件,增加了一個(gè)mysql-bin.000002,這個(gè)增加的binlog二進(jìn)制文件就是全備的時(shí)候-F參數(shù)的作用。相當(dāng)于mysqladmin的參數(shù)flush-log或mysql> flush logs;
[root@moremysql ~]# ll /data/3306/ total 76 drwxr-xr-x 5 mysql mysql 4096 Sep 17 11:29 data -rw-r--r-- 1 mysql mysql 1982 Sep 17 11:29 my.cnf -rw-r--r-- 1 root root 1899 Sep 17 00:22 my.cnf.ori -rwx------ 1 mysql mysql 1307 Sep 16 15:29 mysql -rw-rw---- 1 mysql mysql 150 Sep 17 13:04 mysql-bin.000001 -rw-rw---- 1 mysql mysql 107 Sep 17 13:04 mysql-bin.000002
3.2、準(zhǔn)備第一份增量數(shù)據(jù),向庫(kù)class的userinfo表中刪除、插入、更新數(shù)據(jù)
mysql> delete from userinfo where name='hello'; mysql> delete from userinfo where name='world'; mysql> insert into userinfo values(12,'test'); mysql> update userinfo set name='tiantian' where id=6;
這時(shí)候?qū)?shù)據(jù)庫(kù)文件的更改都會(huì)記錄到mysql-bin.000002中,這是全備后的增量文件,在增量恢復(fù)的時(shí)候用得到。
3.3、數(shù)據(jù)恢復(fù)
在數(shù)據(jù)恢復(fù)之前,停止數(shù)據(jù)庫(kù)對(duì)外服務(wù)。如果是在從庫(kù)上恢復(fù)(這個(gè)是事先做好的備份主庫(kù),開(kāi)啟了binlog),還要關(guān)閉slave(因?yàn)殚_(kāi)啟了slave的話(huà),會(huì)從主庫(kù)復(fù)制,那么數(shù)據(jù)恢復(fù)就沒(méi)效果了)
同時(shí)應(yīng)將增量備份文件復(fù)制一份到其他目錄或關(guān)閉sql_log_bin=off,因?yàn)榛謴?fù)過(guò)程中,會(huì)繼續(xù)寫(xiě)入語(yǔ)句到binlog,最終導(dǎo)致增量恢復(fù)數(shù)據(jù)部分變得比較混亂。
查看sql_log_bin狀態(tài)
mysql> show variables like 'sql_log%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_log_bin | ON | | sql_log_off | OFF | +---------------+-------+
臨時(shí)關(guān)閉sql_log_bin,數(shù)據(jù)恢復(fù)的時(shí)候就不會(huì)將恢復(fù)的數(shù)據(jù)寫(xiě)入到binlog中,這樣binlog文件就會(huì)保持很清潔。待完全恢復(fù)完成后,再開(kāi)啟sql_log_bin。
mysql> set sql_log_bin=off; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'sql_log%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_log_bin | OFF | | sql_log_off | OFF | +---------------+-------+
如果是從庫(kù)(備主庫(kù)),要關(guān)掉slave
mysql> stop slave; mysql> show slave status\G Slave_IO_Running: No Slave_SQL_Running: No Seconds_Behind_Master: NULL
現(xiàn)在開(kāi)始還原全量數(shù)據(jù):
[root@moremysql ~]# mysql -uroot -p123456 -S /data/3306/mysql.sock <class_2017-09-17.sql
全量恢復(fù)好后檢查是否恢復(fù)了全量備份時(shí)的數(shù)據(jù):
[root@moremysql ~]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "use class;select * from userinfo;" +----+----------+ | id | name | +----+----------+ | 1 | goser | | 3 | hello | | 5 | world | | 6 | zhangsan | | 8 | lisi | | 10 | wangwu | +----+----------+
全量恢復(fù)沒(méi)問(wèn)題后再進(jìn)行增量恢復(fù),恢復(fù)被刪除的數(shù)據(jù),更改的保留
[root@moremysql ~]# cp /data/3306/mysql-bin.000002 /opt/
將mysqlbinlog -r 生成的文件中的delete語(yǔ)句刪掉即可
[root@moremysql ~]# mysqlbinlog /opt/mysql-bin.000002 -r userinfo.sql
[root@moremysql ~]# vim userinfo.sql delete from userinfo where name='hello' ---刪掉這行 delete from userinfo where name='world'---刪掉這行
將修改好的binlog增量文件導(dǎo)入到數(shù)據(jù)庫(kù)class中
[root@moremysql ~]# mysql -uroot -p123456 -S /data/3306/mysql.sock class < userinfo.sql
最后別忘了開(kāi)啟sql_log_bin
mysql> set sql_log_bin=on;
到此數(shù)據(jù)恢復(fù)全部完成。。。。。
到此這篇關(guān)于mysql增量備份及恢復(fù)的文章就介紹到這了,更多相關(guān)mysql增量備份內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql中xtrabackup全量備份/增量備份及恢復(fù)
- Windows環(huán)境MySQL全量備份+增量備份的實(shí)現(xiàn)
- MySQL數(shù)據(jù)庫(kù)完全備份與增量備份詳解
- mysql備份策略的實(shí)現(xiàn)(全量備份+增量備份)
- mysql增量備份及斷點(diǎn)恢復(fù)腳本實(shí)例
- mysql全量備份、增量備份實(shí)現(xiàn)方法
- Mysql數(shù)據(jù)庫(kù)性能優(yōu)化三(分表、增量備份、還原)
- mysql mysqldump數(shù)據(jù)備份和增量備份
- MySQL中增量備份的幾種實(shí)現(xiàn)方法
相關(guān)文章
Ubuntu系統(tǒng)安裝mysql超詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于Ubuntu系統(tǒng)安裝mysql的相關(guān)資料,現(xiàn)在的軟件越來(lái)越好安裝,尤其是在ubuntu下安裝軟件,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Mysql經(jīng)典的“8小時(shí)問(wèn)題”
MySQL 的默認(rèn)設(shè)置下,當(dāng)一個(gè)連接的空閑時(shí)間超過(guò)8小時(shí)后,MySQL 就會(huì)斷開(kāi)該連接,而 c3p0 連接池則以為該被斷開(kāi)的連接依然有效。2015-04-04Linux下MYSQL 5.7 找回root密碼的問(wèn)題(親測(cè)可用)
這篇文章主要介紹了Linux下MYSQL 5.7 找回root密碼的問(wèn)題(親測(cè)可用),通過(guò) --skip-grant-tables 找回,新增完成后,:wq 保存退出,重啟mysqld服務(wù),具體內(nèi)容詳情跟隨小編一起看看吧2021-10-10MySQL日期格式化yyyy-mm-dd詳解(DATE_FORMAT()函數(shù))
MySQL提供了很多功能強(qiáng)大、方便易用的函數(shù),在進(jìn)行數(shù)據(jù)庫(kù)管理以及數(shù)據(jù)的查詢(xún)和操作時(shí),幫助我們提高對(duì)數(shù)據(jù)庫(kù)的管理效率,下面這篇文章主要給大家介紹了關(guān)于MySQL日期格式化yyyy-mm-dd(DATE_FORMAT()函數(shù))的相關(guān)資料,需要的朋友可以參考下2023-01-01Mysql存儲(chǔ)過(guò)程和函數(shù)區(qū)別介紹
這篇文章主要介紹了Mysql存儲(chǔ)過(guò)程和函數(shù)的區(qū)別,需要的朋友可以參考下2014-03-03云服務(wù)器Ubuntu_Server_16.04.1安裝MySQL并開(kāi)啟遠(yuǎn)程連接的方法
這篇文章主要介紹了云服務(wù)器Ubuntu_Server_16.04.1安裝MySQL并開(kāi)啟遠(yuǎn)程連接的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02