MySQL數據備份及恢復

MySQL備份一般採用全庫備份加日誌備份的方式,根據業務的需要,可以採用每週日凌晨1點進行完全備份以及每小時進行一次增量備份,這樣在MySQL故障後可以使用完全備份和日誌備份儘可能的去恢復最完整的數據。
一、binlog日誌恢復
MySQL的二進制日誌記錄着該數據庫所有增刪改的操作日誌(前提是需要自己開啓binlog),還包括了這些操作的執行時間,binlog的使用場景無外乎就是主從同步以及恢復數據庫。開啓binlog功能,需要編輯MySQL的主配置文件,如下:
1、查看二進制功能是否開啓(如下,值爲OFF,則表示未開啓):


mysql>show VARIABLES like 'log_bin';

2、開啓二進制日誌功能:


[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命令,都會生成一個新的這樣的文件,依次爲000001、000002......
bin_log.index       #這個文件存儲所有二進制文件的索引

開啓二進制日誌功能後,所有增刪改的操作都會記錄到二進制日誌文件當中,注意,是增刪改的操作,不包括查操作。
3、確定二進制日誌功能已開啓


mysql>show variables like 'log_bin';

MySQL數據備份及恢復
4、執行增刪改以便測試bin_log是否有記錄


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');         #再插入一條新的數據
#以上的操作是寫入了第二個日誌文件

5、MySQL中查看二進制日誌文件及文件內容
查看二進制日誌文件:


mysql>show binary logs;

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


SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
# in:指定要查看的二進制文件;
# from:指定從哪個“pos”位置開始查看
# limit:限制返回的行數,offset是指跳過多少行再顯示

注:如果不指定二進制文件名,那麼默認顯示第一個二進制日誌文件中的事件,文件內容中包含了日誌文件名、事件的開始位置、事件類型、結束位置、信息等內容。


mysql>show binlog events in 'bin_log.000001';

MySQL數據備份及恢復

其他命令:

* show master logs:也是查看二進制日誌文件;
* PURGE BINARY LOGS:用於刪除二進制文件;

.

例子:

* PURGE BINARY LOGS TO 'mysql-bin.00010'; #把這個文件之前的其他文件都刪除掉
* PURGE BINARY LOGS BEFORE '2016-08-28 22:46:26'; #把指定時間之前的二進制文件刪除了

6、使用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 

7、通過二進制日誌恢復數據
假設在開始刪除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數據備份及恢復
二、mysqldump備份工具
mysqldump是mysql用於備份和數據轉移的一個工具。主要產生一系列的SQL語句,可以封裝到文件,該文件包含有所有重建數據庫所需要的 SQL命令,如CREATE DATABASE,CREATE TABLE,INSERT等等。可以用來實現輕量級的快速遷移或恢復數據庫。 mysqldump 是將數據表導成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,這也是最常用的備份方法。 mysqldump一般在數據量很小的時候(幾個G)可以用於備份。當數據量比較大的情況下,就不建議用mysqldump工具進行備份了。

mysqldump可以針對單個表、多個表、單個數據庫、多個數據庫、所有數據庫進行導出的操作。

mysqldump使用示例:
1、備份某一個表


[root@mysql backup]# mysqldump -uroot -p123 mysql user > mysql-user.sql            #備份mysql庫中的user表
[root@mysql backup]# ls
mysql-user.sql

2、恢復mysql數據庫中的user表


[root@mysql backup]# mysql -uroot -p123 mysql < mysql-user.sql 

3、備份mysql庫


[root@mysql backup]# mysql -uroot -p123 --databases mysql > mysql.sql
[root@mysql backup]# ls
mysql.sql  mysql-user.sql

4、恢復mysql庫


[root@mysql backup]# mysql -uroot -p123 < mysql.sql 

5、備份所有的庫(當導出的數據量較大時,可以添加“--opt”選項以優化執行速度)


[root@mysql backup]# mysqldump -uroot -p123 --opt --all-databases > all-data.sql
[root@mysql backup]# ls
all-data.sql 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章