Mysql DBA 高級運維學習筆記-初步增量恢復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數據庫