1、增量備份mysql
原理:Mysql中沒有直接提供增量本分的方法,但能夠經過二進制文件間接的進行增量備份。sql
操做:第一步先開啓二進制文件數據庫
[root@localhost data]# vim /etc/my.cnf [mysqld] log-bin=mysql_bin[root@localhost data]# systemctl restart mysqld.service [root@localhost data]# ls auto.cnf ibdata1 ib_logfile1 mysql mysql_bin.index performance_schema sys ib_buffer_pool ib_logfile0 ibtmp1 mysql_bin.000001 mysql-slow_query.log school
此時查看 /usr/local/mysql/data 中存在二進制文件mysql_bin.000001vim
查看二進制文件mysql_bin.000001session
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000001
生成新的二進制文件mysql_bin.000002 ide
[root@localhost data]# mysqladmin -uroot -p flush-logs Enter password: [root@localhost data]# ls auto.cnf ibdata1 ib_logfile1 mysql mysql_bin.000002 mysql-slow_query.log school ib_buffer_pool ib_logfile0 ibtmp1 mysql_bin.000001 mysql_bin.index performance_schema sys
2、增量備份的恢復post
首先,在生成二進制文件mysql_bin.000002 後,咱們進去mysql作一些簡單的操做來完成這個恢復的實驗。ui
[root@localhost data]# mysql -uroot -p mysql> create database myschool; Query OK, 1 row affected (0.01 sec) mysql> use myschool;Database changed mysql> create table info(id int not null primary key auto_increment,name char(10),age int(2)); Query OK, 0 rows affected (0.38 sec) mysql> insert into info(name,age) values('tom',21); Query OK, 1 row affected (0.01 sec) mysql> insert into info(name,age) values('jerry',22); Query OK, 1 row affected (0.00 sec) mysql> select * from info;+----+-------+------+| id | name | age |+----+-------+------+| 1 | tom | 21 || 2 | jerry | 22 |+----+-------+------+2 rows in set (0.00 sec)
而後,咱們執行刷新命令生成新的二進制文件mysql_bin.000003,以便後續刪除庫後進行恢復操做this
[root@localhost data]# mysqladmin -uroot -p flush-logs[root@localhost data]# mysql -uroot -p mysql> use myschool; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -ADatabase changed mysql> drop ; Query OK, 0 rows affected (0.02 sec)
mysql> show databases;spa
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
此時,數據庫中的庫mychool已經不存在了,最後,咱們執行恢復操做
[root@localhost data]# mysqlbinlog --no-defaults mysql_bin.000002 | mysql -uroot -pEnter password: [root@localhost data]# mysql -uroot -p mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || myschool || mysql || performance_schema || school || sys |+--------------------+6 rows in set (0.00 sec)
myschool數據庫已完成恢復
3、增量備份的異常操做恢復
在上面操做中,若是咱們沒有執行刷新命令生成新的二進制文件mysql_bin.000003,直接mysql> drop database myschool;時,再進行上述恢復操做是沒法恢復數據庫myschool的,這是咱們就須要經過跳過異常操做來進行恢復。
跳過異常操做有兩種方法:
①第一種是基於時間點
首先進入mysql刪除myschool數據庫後查看二進制文件mysql_bin.000003
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000003# at 1523#180903 16:54:28 server id 1 end_log_pos 1627 CRC32 0x9637c595 Query thread_id=11 exec_time=0 error_code=0SET TIMESTAMP=1535964868/*!*/;SET @@session.sql_mode=1437073414/*!*/;drop database myschool/*!*/;SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ;
找到在16:54:28時進行的刪除命令,執行如下操做進行恢復到錯誤操做以前
[root@localhost data]# mysqlbinlog --no-defaults --stop-datetime='201-09-03 16:54:28' /usr/local/mysql/data/mysql_bin.000003 | mysql -uroot -pEnter password:
而後在執行如下操做從正確操做點繼續開始恢復
[root@localhost data]# mysqlbinlog --no-defaults --start-datetime='201-09-03 16:55:10' /usr/local/mysql/data/mysql_bin.000003 | mysql -uroot -pEnter password:
②基於位置點
如上所示:# at 1523爲異常位置起始點, 執行如下操做進行恢復到錯誤操做以前
[root@localhost data]# mysqlbinlog --no-defaults --stop-postion='1523' /usr/local/mysql/data/mysql-bin.000003 | mysql -u root -pEnter password:
而後在執行如下操做從正確操做點繼續開始恢復
[root@localhost data]# mysqlbinlog --no-defaults --start-postion='1555' /usr/local/mysql/data/mysql-bin.000003 | mysql -u root -pEnter password: