MySQL備份通常採用全庫備份加日誌備份的方式,根據業務的須要,能夠採用每週日凌晨1點進行徹底備份以及每小時進行一次增量備份,這樣在MySQL故障後可使用徹底備份和日誌備份儘量的去恢復最完整的數據。
1、binlog日誌恢復
MySQL的二進制日誌記錄着該數據庫全部增刪改的操做日誌(前提是須要本身開啓binlog),還包括了這些操做的執行時間,binlog的使用場景無外乎就是主從同步以及恢復數據庫。開啓binlog功能,須要編輯MySQL的主配置文件,以下:
一、查看二進制功能是否開啓(以下,值爲OFF,則表示未開啓):mysql
mysql>show VARIABLES like 'log_bin';
二、開啓二進制日誌功能:sql
[root@mysql ~]# vim /etc/my.cnf #在mysqld字段下寫入下面配置,以便開啓二進制日誌並指定二進制文件名 #開啓二進制日誌,須要指定server-id,不然服務將會啓動失敗 log-bin=/usr/local/mysql/data/bin_log server-id=1 [root@mysql ~]# systemctl restart mysqld #重啓後,將在指定的目錄下生成兩個文件,以下: [root@mysql data]# pwd /usr/local/mysql/data [root@mysql data]# ls | grep bin_log bin_log.000001 #每次重啓mysql服務或執行flush logs命令,都會生成一個新的這樣的文件,依次爲00000一、000002...... bin_log.index #這個文件存儲全部二進制文件的索引
開啓二進制日誌功能後,全部增刪改的操做都會記錄到二進制日誌文件當中,注意,是增刪改的操做,不包括查操做。
三、肯定二進制日誌功能已開啓數據庫
mysql>show variables like 'log_bin';
四、執行增刪改以便測試bin_log是否有記錄vim
mysql> reset master; #清空全部的二進制文件,從00001開始 #建立一個庫,並在庫中建立一個表 mysql> create database test1; mysql> use test1; mysql> create table tb1(id int primary key auto_increment,name varchar(20)); #向表中插入兩條數據 mysql> insert into tb1(name) values('zhangsan'); mysql> insert into tb1(name) values('lisi'); #從新開始一個新的日誌文件再執行操做。注意,此時上面全部的操做寫入的是第一個二進制日誌文件 mysql> flush logs; mysql> delete from tb1 where name='lisi'; #刪除插入的第二條數據 mysql> insert into tb1(name) values('tom'); #再插入一條新的數據 #以上的操做是寫入了第二個日誌文件
五、MySQL中查看二進制日誌文件及文件內容
查看二進制日誌文件:ide
mysql>show binary logs;
查看二進制日誌文件內容:
完整的命令格式以下:工具
SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] # in:指定要查看的二進制文件; # from:指定從哪一個「pos」位置開始查看 # limit:限制返回的行數,offset是指跳過多少行再顯示
注:若是不指定二進制文件名,那麼默認顯示第一個二進制日誌文件中的事件,文件內容中包含了日誌文件名、事件的開始位置、事件類型、結束位置、信息等內容。post
mysql>show binlog events in 'bin_log.000001';
其餘命令:測試
- show master logs:也是查看二進制日誌文件;
- PURGE BINARY LOGS:用於刪除二進制文件;
.優化
例子:rest
- PURGE BINARY LOGS TO 'mysql-bin.00010'; #把這個文件以前的其餘文件都刪除掉
- PURGE BINARY LOGS BEFORE '2016-08-28 22:46:26'; #把指定時間以前的二進制文件刪除了
六、使用mysqlbinlog本地查看二進制日誌內容
[root@mysql data]# pwd /usr/local/mysql/data [root@mysql data]# mysqlbinlog bin_log.000001 #使用-v選項能夠查看出日誌文件中的詳細信息,兩個v能夠查看出更詳細的信息,可是三個vvv也不會有什麼做用了 [root@mysql data]# mysqlbinlog -v bin_log.000001 [root@mysql data]# mysqlbinlog -vv bin_log.000001
七、經過二進制日誌恢復數據
假設在開始刪除lisi記錄的那條sql語句是誤操做,如今要經過二進制日誌來恢復數據。
1)首先須要找到刪除lisi記錄的sql語句在二進制日誌中的位置,每條sql語句都是一個事務,因此須要從其begin到commit,纔算是完整的sql語句。以下:
[root@mysql data]# mysqlbinlog -v bin_log.000002 | tail -35
從上面能夠看出,delete事件發生position是387,事件結束是650。
2)事件恢復流程:直接用bin-log日誌將數據庫恢復到刪除位置219前,而後跳過故障點,再進行恢復下面全部的操做,具體恢復流程以下:
導出相關binlog文件(將二進制文件轉換爲sql語句生成新的文件):
[root@mysql data]# mysqlbinlog bin_log.000001 > /tmp/01.sql [root@mysql data]# mysqlbinlog --stop-position=387 bin_log.000002 > /tmp/387.sql [root@mysql data]# mysqlbinlog --start-position=650 bin_log.000002 > /tmp/650.sql
上述指令中,第一條比較好理解,無非就是使用msyqlbinlog查看第一個二進制文件,並生成新文件,後面兩條指令呢,--stop-postition意思是查看時到219這個位置不查看,一直到393才又開始接着查看。最後的結果就是新生成的文件中不會包含刪除lisi記錄的sql語句。
3)刪除數據庫
mysql> drop database test1;
4)利用binlog恢復數據
[root@mysql data]# mysql -uroot -p123 < /tmp/01.sql [root@mysql data]# mysql -uroot -p123 < /tmp/387.sql [root@mysql data]# mysql -uroot -p123 < /tmp/650.sql
5)肯定數據已恢復
mysql> select schema(); mysql> select * from tb1;
2、mysqldump備份工具
mysqldump是mysql用於備份和數據轉移的一個工具。主要產生一系列的SQL語句,能夠封裝到文件,該文件包含有全部重建數據庫所須要的 SQL命令,如CREATE DATABASE,CREATE TABLE,INSERT等等。能夠用來實現輕量級的快速遷移或恢復數據庫。 mysqldump 是將數據表導成 SQL 腳本文件,在不一樣的 MySQL 版本之間升級時相對比較合適,這也是最經常使用的備份方法。 mysqldump通常在數據量很小的時候(幾個G)能夠用於備份。當數據量比較大的狀況下,就不建議用mysqldump工具進行備份了。
mysqldump能夠針對單個表、多個表、單個數據庫、多個數據庫、全部數據庫進行導出的操做。
mysqldump使用示例:
一、備份某一個表
[root@mysql backup]# mysqldump -uroot -p123 mysql user > mysql-user.sql #備份mysql庫中的user表 [root@mysql backup]# ls mysql-user.sql
二、恢復mysql數據庫中的user表
[root@mysql backup]# mysql -uroot -p123 mysql < mysql-user.sql
三、備份mysql庫
[root@mysql backup]# mysql -uroot -p123 --databases mysql > mysql.sql [root@mysql backup]# ls mysql.sql mysql-user.sql
四、恢復mysql庫
[root@mysql backup]# mysql -uroot -p123 < mysql.sql
五、備份全部的庫(當導出的數據量較大時,能夠添加「--opt」選項以優化執行速度)
[root@mysql backup]# mysqldump -uroot -p123 --opt --all-databases > all-data.sql [root@mysql backup]# ls all-data.sql