MySQL 之數據備份及恢復

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';

MySQL 之數據備份及恢復
四、執行增刪改以便測試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;

MySQL 之數據備份及恢復
查看二進制日誌文件內容:
完整的命令格式以下:工具

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';

MySQL 之數據備份及恢復

其餘命令:測試

  • 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

MySQL 之數據備份及恢復
從上面能夠看出,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;

MySQL 之數據備份及恢復
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
相關文章
相關標籤/搜索