前言html
增量備份 是指在一次全備份或上一次增量備份後,之後每次的備份只需備份與前一次相比增長或者被修改的文件。這就意味着,第一次增量備份的對象是進行全備後所產生的增長和修改的文件;第二次增量備份的對象是進行第一次增量備份後所產生的增長和修改的文件,如此類推。這種備份方式最顯著的優勢就是:沒有重複的備份數據,所以備份的數據量不大,備份所需的時間很短。但增量備份的數據恢復是比較麻煩的。您必須具備上一次全備份和全部增量備份磁帶(一旦丟失或損壞其中的一個增量,就會形成恢復的失敗),而且它們必須沿着從全備份到依次增量備份的時間順序逐個反推恢復,所以這就極大地延長了恢復時間。mysql
1、binlog簡介linux
binlog日誌由配置文件的 log-bin 選項負責啓用,MySQL服務器將在數據根目錄建立兩個新文 件XXX-bin.001和xxx-bin.index,若配置選項沒有給出文件名,Mysql將使用主機名稱命名這兩個文件,其中.index文件包含一份全體日誌文件的清單。 sql
Mysql會把用戶對全部數據庫的內容和結構的修改狀況記入XXX-bin.n文件,而不會記錄 SELECT和沒有實際更新的UPDATE語句。數據庫
當MySQL數據庫中止或重啓時,服務器會把日誌文件記入下一個日誌文件,Mysql會在重啓時生成一個新的binlog日誌文件,文件序號遞增,此外,若是日誌文件超過max_binlog_size系統變量配置的上限時,也會生成新的日誌文件。服務器
2、binlog日誌操做微信
1、修改 MySQL 的配置文件my.cnf 以下:.net
[mysqld] log-bin = mysql-bin binlog_format = row
其中:log-bin若不顯示指定存儲目錄,則默認存儲在mysql的data目錄下 命令行
2、一些經常使用操做日誌
mysql> show master logs; #查看數據庫全部日誌文件。 mysql> show binlog events in 'mysql-bin.000007'; #查看當前使用的binlog文件信息。 mysql> show binlog events in 'mysql-bin.000016'; #查看指定的binlog文件信息。 mysql> flush logs; #將內存中log日誌寫磁盤,保存在當前binlog文件中,併產生一個新的binlog日誌文件。 mysql> flush logs; reset master; #刪除全部二進制日誌,並從新(mysql-bin.000001)開始記錄。
3、MySQL備份實例(全備 + 基於 binlog的增備)
示例採用小數據量進行模擬,包含一份全備及兩份增備,主要演示下備份還原過程,工程中可根據數據實際狀況進行備份還原策略調整。
1、查看當前數據庫binlog文件
· 經過mysql客戶端查看:
mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 107 | +------------------+-----------+
· 經過linux命令行直接查看(mysql數據目錄data)
[root@localhost data]# ll -h total 5.1G -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ibdata1 -rw-rw---- 1 mysql mysql 2.0G Jul 18 14:12 ibdata2 -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ib_logfile0 -rw-rw---- 1 mysql mysql 1.0G Jul 23 13:29 ib_logfile1 drwxr-xr-x 2 mysql mysql 4.0K Jul 18 13:52 mysql -rw-rw---- 1 mysql mysql 107 Jul 23 13:29 mysql-bin.000001 -rw-rw---- 1 mysql mysql 19 Jul 23 13:29 mysql-bin.index srwxrwxrwx 1 mysql mysql 0 Jul 18 14:14 mysql.sock drwx------ 2 mysql mysql 4.0K Jul 18 14:01 performance_schema -rw-rw---- 1 mysql mysql 483 Jul 23 13:29 R820-08.err -rw-rw---- 1 mysql mysql 5 Jul 18 14:14 R820-08.pid drwx------ 2 mysql mysql 19 Jul 22 23:15 test 目前只有一個binlog文件mysql-bin.000001。
3.2 準備全量數據
mysql> create database backup_full; mysql> create table full (c1 int(10), c2 varchar(20)) engine=innodb; mysql> insert into full values (1, 'full1'),(2, 'full2'),(3, 'full3'),(4, 'full4'), (5, 'full5'),(6, 'full6'),(7, 'full7'),(8, 'full8'),(9, 'full9'),(10, 'full10');
3.3 將全量數據進行備份
步驟以下:
a.備份前須要將數據庫加讀鎖,防止數據在備份時寫入。
mysql> flush tables with read lock;
b.經過命令flush logs;將log日誌刷盤,寫入當前binlog(mysql-bin.000001),在生成一個新的binlog(mysql-bin.000002)爲增備作準備。
mysql> flush logs;
c.進行數據備份。在linux命令行下執行:
[root]mysqldump -u用戶名 -p密碼 -hIP地址 -P端口 數據庫名 > /tmp/backup_full.sql [root]mysqldump -uroot -pjesse -h127.0.0.1 -P3355 buckup_full > /tmp/backup_full.sql
d.解除表鎖。
mysql> unlock tables;
至此全量備份所有結束,將全量數據文件buckup_full.sql保存便可。數據庫再有新的數據更新會記錄在新的binlog(mysql-bin.000002)裏面。
3.4 準備第一份增量數據
mysql> create database backup_increment; mysql> use backup_increment; mysql> create table increment (c1 int(10), c2 varchar(20)) engine=innodb; mysql> insert into increment values (11, 'increment1'),(12, 'increment2'),(13, 'increment3'),(14, 'increment4'),(15, 'increment5');
3.5 將第一份增量數據進行備份
步驟以下:
a.備份前須要將數據庫加讀鎖,防止數據在備份時寫入。
mysql> flush tables with read lock;
b.經過命令flush logs;將log日誌刷盤,寫入當前binlog(mysql-bin.000002),在生成一個新的binlog(mysql-bin.000003)爲下次增備作準備。
mysql> flush logs;
c.將binlog第一個增備文件mysql-bin.000002直接複製保存便可。 也能夠將二進制文件導出到文本文件保存,在linux命令行下執行
[root ]mysqlbinlog mysql-bin.000002 > /tmp/increment1.txt
d.解除表鎖。
mysql> unlock tables;
至此第一個增量備份所有結束,將增量binlog文件mysql-bin.000002或者有binlog文件導出的文本文件/tmp/increment1.txt保存便可。數據庫再有新的數據更新會記錄在新的binlog(mysql-bin.000003)裏面。
3.6 準備第二份增量數據
mysql> use backup_increment; mysql> insert into increment values (16, 'increment16'),(17, 'increment17'),(18, 'increment18'),(19, 'increment19'),(20, 'increment20');
3.7 將第二份增量數據進行備份
步驟以下:
同上
4、mysql還原實例分析(全備還原+基於binlog的增備還原)
模擬數據庫故障,即刪除全備數據及增備數據庫。
mysql> drop table backup_full.full; mysql> drop database backup_increment;
此時數據庫數據被清空。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | backup_full | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> select * from backup_full.full; ERROR 1146 (42S02): Table 'backup_full.full' doesn't exist mysql> select * from backup_increment.increment; ERROR 1146 (42S02): Table 'backup_increment.increment' doesn't exist
4.1 還原全備數據
· 方法:直接還原數據文件。
mysql -u用戶名 -p密碼 -hIP地址 -P端口 數據庫名 < /tmp/buckup_full.sql mysql -uroot -pjesse -h127.0.0.1 -P3355 backup_full < /tmp/buckup_full.sql mysql> select * from backup_full.full; +------+--------+ | c1 | c2 | +------+--------+ | 1 | full1 | | 2 | full2 | | 3 | full3 | | 4 | full4 | | 5 | full5 | | 6 | full6 | | 7 | full7 | | 8 | full8 | | 9 | full9 | | 10 | full10 | +------+--------+
4.2 還原第一個增備文件
· 方法:經過binlog直接還原
在linux命令行下執行:
[root]mysqlbinlog binlog文件名 | mysql -u用戶名 -p密碼 -hIP地址 -P端口 [root]mysqlbinlog mysql-bin.000002 | mysql -uroot -pjesse -h127.0.0.1 -P3355
查看數據:
mysql> select * from backup_increment.increment; +------+------------+ | c1 | c2 | +------+------------+ | 11 | increment1 | | 12 | increment2 | | 13 | increment3 | | 14 | increment4 | | 15 | increment5 | +------+------------+
第一份增量數據還原成功!
4.3 還原第二個增備文件(方法同上)
在linux命令行下執行:
[root]mysqlbinlog binlog文件名 | mysql -u用戶名 -p密碼 -hIP地址 -P端口 [root]mysqlbinlog mysql-bin.000003 | mysql -uroot -pjesse -h127.0.0.1 -P3355
查看數據:
mysql> select * from backup_increment.increment; +------+-------------+ | c1 | c2 | +------+-------------+ | 11 | increment1 | | 12 | increment2 | | 13 | increment3 | | 14 | increment4 | | 15 | increment5 | | 16 | increment16 | | 17 | increment17 | | 18 | increment18 | | 19 | increment19 | | 20 | increment20 | +------+-------------+
至此數據所有還原成功!
4.4 按時間點和位置點恢復
按位置點信息恢復
[root@bogon ~]# mysqlbinlog --start-position=259 --stop-position=561 /data/mysql/mysql3306/logs/mysql-bin.000003 |mysql -uroot -p123456
按時間點恢復
[root@bogon ~]# mysqlbinlog --start-datetime="2016-11-18 6:10:34" --stop-datetime="2016-11-18 6:11:13" /data/mysql/mysql3306/logs/mysql-bin.000003 |mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure.
參考文檔:
http://www.cnblogs.com/luoyx/p/5896419.html
http://blog.csdn.net/jesseyoung/article/details/41211841
爲了方便你們交流,本人開通了微信公衆號,和QQ羣291519319。喜歡技術的一塊兒來交流吧