1. 程式人生 > >Mysql DBA 高級運維學習筆記-初步增量恢復mysql數據庫

Mysql DBA 高級運維學習筆記-初步增量恢復mysql數據庫

命名 for rest 寫入 恢復 更改 init ces 模擬

9.10.3 初步增量恢復MySQL數據實戰

a. 先把my.cnf配置文件中的log-bin參數打開重命名為mysqlbin_zbf,這樣在mysql數據庫中更新一個東西就會在這個日誌裏更新。這樣會導致這個日誌很大,沒關系系統可以自動分割還可以手動分割。

[root@localhost var]# vim /etc/my.cnf
…省略……
# Uncomment the following if you want to log updates
log-bin=mysqlbin_zbf
# binary logging format - mixed recommended
……省略…

b.配置完my.cnf重啟mysql。

[root@localhost var]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS!

c.重啟之後就可以在mysql的數據文件下看見mysqlbin_zbf.000001日誌文件,它記錄了對數據有更改操作的語句,之前如果有就不用配置log-bin。

[root@mysql data]# ls
ibdata1  ib_logfile1  mysqlbin_zbf.000001  mysql.err  performance_schema
ib_logfile0  mysqlmysqlbin_zbf.index   mysql.pid  zbf

d.重啟完登錄mysql,將數據庫數據破壞模擬增量恢復。

(1)查看表數據

mysql> select * from student;
+----+-----------+-----+--------+
| id | name  | age | dept   |
+----+-----------+-----+--------+
|  1 | zbf666|  29 | linux  |
|  2 | lisi  |  28 | mysql  |
|  3 | zhangsan  |  21 | python |
|  4 | woshishei |  24 | java   |
+----+-----------+-----+--------+

(2)將name字段的值全部修改為luhan

mysql> update student set name=‘luhan‘;
Query OK, 4 rows affected (0.03 sec)
Rows matched: 4  Changed: 4  Warnings: 0

(3)再查看表數據

mysql> select * from student;
+----+-------+-----+--------+
| id | name  | age | dept   |
+----+-------+-----+--------+
|  1 | luhan |  29 | linux  |
|  2 | luhan |  28 | mysql  |
|  3 | luhan |  21 | python |
|  4 | luhan |  24 | java   |
+----+-------+-----+--------+
4 rows in set (0.00 sec)

(4)然後退出mysql用mysqlbinlog查看一下mysqlbin_zbf.000001日誌文件

[root@mysql ~]# mysqlbinlog /usr/local/mysql/data/mysqlbin_zbf.000001
……省略……..
use `zbf`/*!*/;
SET TIMESTAMP=1517061765/*!*/;
update student set name=‘luhan‘
/*!*/;
# at 267
……省略….

我們看到update student set name=‘luhan‘這條語句,在恢復的時候我們要把這條語句刪掉,再把數據導進去。因為恢復數據的時候還會往裏寫數據導致數據缺失,所以先把之前的日誌文件備份出來.恢復數據,最好的方法就是停庫,不能停的話最好的辦法就是切割。

[root@mysql data]# cp mysqlbin_zbf.000001 /opt/ 

(5)模擬不能停止數據庫的思路,停止數據庫是最好的。切割成另外一個。

[root@mysql data]# mysqladmin -uroot -p123456 flush-log
[root@mysql data]# ll
總用量 28708
-rw-rw----. 1 mysql mysql 18874368 1月  27 22:18 ibdata1
-rw-rw----. 1 mysql mysql  5242880 1月  27 22:18 ib_logfile0
-rw-rw----. 1 mysql mysql  5242880 1月  11 20:30 ib_logfile1
drwx------. 2 mysql root  4096 1月  11 20:08 mysql
-rw-rw----. 1 mysql mysql  547 1月  27 22:29 mysqlbin_zbf.000001
-rw-rw----. 1 mysql mysql  107 1月  27 22:29 mysqlbin_zbf.000002
-rw-rw----. 1 mysql mysql   44 1月  27 22:29 mysqlbin_zbf.index
-rw-r-----. 1 mysql root  7937 1月  27 21:57 mysql.err
-rw-rw----. 1 mysql mysql5 1月  27 21:57 mysql.pid
drwx------. 2 mysql mysql 4096 1月  11 20:08 performance_schema
drwx------. 2 mysql mysql 4096 1月  27 21:32 zbf

我們看切割完了就出現了mysqlbin_zbf.000002,切割完之後寫入數據就往mysqlbin_zbf.000002裏面寫了,現在我們要處理的就是mysqlbin_zbf.000001了。

(6)生成bin.sql文件

在企業中如果有多個bin-log就把所有的做恢復,同時也會有很多庫和表,bin.sql裏面寫入的是所有庫和表修改過得數據,恢復bin.sql裏面的數據時就會導致主鍵重復,不能插入數據。所以要指定庫和表。

[root@mysql data]# mysqlbinlog -d zbf mysqlbin_zbf.000001 >bin.sql

編輯bin.sql可以發現在什麽時候操作數據庫導致數據丟失,我們找到update這條語句,將update這條語句刪掉。

[root@mysql data]# vim bin.sql
……省略……
#180127 23:29:00 server id 1  end_log_pos 767   Query   thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1517066940/*!*/;
update student set name=‘luhan‘
/*!*/;
……省略…
# at 767

(7)開始增量恢復

[root@mysql data]# mysql -uroot -p123456 zbf <bin.sql
[root@mysql data]# mysql -uroot -p123456 -e "select * from zbf.student";
+----+-----------+-----+--------+
| id | name  | age | dept   |
+----+-----------+-----+--------+
|  1 | zbf666|  29 | linux  |
|  2 | lisi  |  28 | mysql  |
|  3 | zhangsan  |  21 | python |
|  4 | woshishei |  24 | java   |
+----+-----------+-----+--------+

Mysql DBA 高級運維學習筆記-初步增量恢復mysql數據庫