徹底備份有兩種方式,一種是使用tar打包數據文件,另外一種是使用mysqldump進行徹底備份。徹底備份存在的問題很容易看到,每次都是把全部的數據內容進行備份,備份數據中有大量的重複數據,而且徹底備份的時間和恢復的時間很長。解決徹底備份存在的問題就是使用增量備份的方式,增量備份就是備份自上一次備份以後增長或改變的文件或者內容。mysql
增量備份的優勢是沒有重複數據,備分量不大,時間短。缺點也很明顯,須要上次徹底備份及徹底備份以後全部的增量備份才能恢復,並且對全部增量備份進行逐個反推恢復,操做較爲繁瑣。
MySQL沒有提供直接的增量備份方法,可是能夠經過MySQL的二進制日誌(binary logs)簡介間接實現增量備份。二進制日誌對備份的意義以下:sql
CentOS7.3上的MySQL-5.7.17數據庫
#systemctl stop firewalld.service //關閉防火牆 #setenforce 0 //關閉加強安全功能 #systemctl restart mysqld.service //重啓mysql #mysql –u root –p //登陸進入mysql >create database school; //建立數據庫school >use school; //進入school >create table info (name varchar(10),score decimal(5,2)); //建立數據表info >insert into info (name,score) values (‘zhangsan’,88); //向info中插入數據 >insert into info (name,score) values (‘lisi’,88); >select * from info; //查看數據表info中數據 >exit
#vim /etc/my.cnf [mysqld] user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock server-id = 1 log-bin=mysql-bin //添加二進制日誌功能 #systemctl restart mysql.service //重啓mysql服務
#mysqldump –u root –p school > /opt/school.sql
#mysqladmin –u root –p flush-logs #ls /usr/local/mysql/data //生成了新的二進制文件mysql-bin.000002
#mysql –u root –p >use school; >insert into info (name,score) values (‘test01’,60); >exit #mysqladmin –u root –p flush-logs #ls
#mysql –u root –p >use school; >insert into info (name,score) values (‘test02’,60); >exit #mysqladmin –u root –p flush-logs #ls
#mysql –u root –p >use school; >delete from info where name=’test01’; >delete from info where name=’test02’; >exit
#mysqlbinlog --no-defaults mysql-bin.000002 | mysql –u root –p #mysql –u root –p >use school; >select * from info; //test01已經恢復,可知test01刪除記錄保存在mysql-bin.000002中 >exit #mysqlbinlog –no-defaults mysql-bin.000003 | mysql –u root –p #mysql -u root –p >use school; >select * from info; //test02已恢復,test02的刪除記錄保存在mysql-bin.000003中 >exit
#mysqlbinlog --no-defaults --base64-output=decode-rows –v mysql-bin.000002
#vim /etc/my.cnf [mysqld] user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock server-id = 1 log-bin=mysql-bin #systemctl restart mysql.service
#mysqldump –u root –p school > /opt/school.sql //進行徹底備份 #mysqladmin –u root –p flush-logs //進行增量備份生成mysql-bin.000002
>insert into info(name,score) values (‘test01’,88); >delete from info where name=’tom’; >insert into info(name,score) values (‘test02’,88);
#mysqladmin –u root –p flush-logs //生成增量備份mysql-bin.000003
#mysqlbinlog --no-defaults --base64-output=decode-rows –v mysql-bin.000002 > /opt/info.txt #vim /opt/info.txt
>drop table info; #mysql –u root –p school < /opt/school.sql >mysql –u root –p >use school; >show tables; >select * from info; >exit
#mysqlbinlog –no-defaults –stop-datetime=’2018-07-05 9:55:42’ /usr/local/mysql/data/mysql-bin.000002 | mysql –u root –p //注意時間格式須要用-鏈接
進入info後能夠發現test01已恢復vim
##mysqlbinlog –no-defaults –start-datetime=’2018-07-05 9:55:49’ /usr/local/mysql/data/mysql-bin.000002 | mysql –u root –p
進入info可發現test02已恢復,從而基於時間點的恢復完成安全
>delete from info where name=’test01’; >delete from info where name=’test02’;
#mysqlbinlog –no-defaults –stop-position =’563’ /usr/local/mysql/data/mysql-bin.000002 | mysql –u root –p //上一次正確操做節點 #mysqlbinlog –no-defaults –start-position=’660’ /usr/local/mysql/data/mysql-bin.000002 | mysql –u root –p //下一次正確操做節點
進入school的info中再次查看,能夠發現test01和test02已經恢復。服務器