天天看點

mysql binlog故障演練

mysql備份恢複

mysqldump備份

企業故障恢複案例:
正在運作的網站系統  mysql資料庫 資料量25G,日業務量10-15M
備份政策:
每天晚上23點通過計劃任務調用mysqldump執行全備腳本

故障時間點:
周四上午 開發誤删除了一個表,如何恢複?


思路:
1. 停業務避免資料二次傷害
2. 找一個臨時庫,恢複周三23.00 全備
3. 截取 周三 23.00 ---> 周四10點 誤删除之間的binlog,恢複到臨時資料庫
4. 測試可用性和完整性
5.
 5.1 方法1: 直接用臨時卡頂替原有生産庫,前端應用割接到新庫
 5.2 方法2: 将誤删除的表導出,導入到原生産庫
6. 開啟業務      

故障演練:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 |     2070 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)


#建立一個新庫
mysql> create table backup.full select * from world.city;
Query OK, 4079 rows affected (0.04 sec)
Records: 4079  Duplicates: 0  Warnings: 0       #這個直接取了 實驗檔案 wolrd 的資料到新庫。 

現在有資料了。

mysql> create table backup.full_1 select * from mysql.user;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

驗證資料是否有了:
mysql> use backup
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------+
| Tables_in_backup |
+------------------+
| full             |
| full_1           |
+------------------+
2 rows in set (0.00 sec)   #可以看到有兩個資料表了。 現在做一次全備。



## 周三全備:
[root@localhost ~]# mkdir /backup -p
[root@localhost ~]# cd /backup
[root@localhost ~]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip >/backup/full_$(date +%F).sql.gz
[root@localhost ~]# ll -h /backup/
total 328K
-rw-r--r-- 1 root root 328K Oct 12 21:25 full_2020-10-12.sql.gz



## 模拟23:00到周四資料丢失的變化【屬于正常修改】
現在在建立一點資料
mysql> create table backup.thur  select * from world.country;
Query OK, 239 rows affected (0.01 sec)
Records: 239  Duplicates: 0  Warnings: 0

通過查詢可以看到:
select * from backup.full;
4079 rows in set (0.01 sec)  有439行資料。

模拟删除修改資料:
mysql> use backup;
mysql> update full set countrycode='CHN';     #模拟不小心把所有地區都改為了CHN
mysql> commit;
Query OK, 0 rows affected (0.00 sec)          #并執行了送出

mysql> delete from full where id>200;         #大部分資料都删除了 隻保留了200行
Query OK, 3879 rows affected (0.02 sec)

mysql> commit;                                #并執行了送出
Query OK, 0 rows affected (0.00 sec)


### 模拟故障,删除了一個表 【屬于異常修改】
mysql> show tables;
+------------------+
| Tables_in_backup |
+------------------+
| full             |
| full_1           |
| thur             |
+------------------+
3 rows in set (0.00 sec)

mysql> drop table thur;     #<------------ 删除表
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;         #現有表
+------------------+
| Tables_in_backup |
+------------------+
| full             |
| full_1           |
+------------------+
2 rows in set (0.00 sec)

-----------------------------------------------


-----------------------------------------------

恢複過程:
1. 關閉原有資料庫

2. 啟動一個新資料庫

3. 解壓備份資料
[root@localhost backup]# gzip -d full_2020-10-12.sql.gz
[root@localhost backup]# ll
total 1104
-rw-r--r-- 1 root root 1126759 Oct 12 21:25 full_2020-10-12.sql

4. 截取二進制日志:
去備份的sql中找
[root@localhost backup]# vim full_2020-10-12.sql
在這裡明顯可以看到備份的那個binlog日志和起始位置:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=120;   #備份檔案中的起始位置

mysqlbinlog --start-position=120 --stop-position=[待查找]   /data/mysql/mysql-bin.000008

5. 擷取binlog日志最後一次正常操作的binlog。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 |   399383 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

找出删除時間點的 position号:
| mysql-bin.000008 | 399262 | Query  |   1 |     399383 | use `backup`; DROP TABLE ...
找到開始位置  399262 [這是删除這個表之前的位置。]

将指令的結尾改成下面這樣,然後執行:
[root@localhost backup]#  mysqlbinlog --start-position=120 --stop-position=399262 /data/mysql/mysql-bin.000008 >/backup/inc.sql


6. 截取資料完畢後,開始恢複資料:
  先去一台臨時mysql伺服器恢複資料,檢查
  root@localhost backup]# scp -r  /backup/inc.sql [email protected]:/root
  
  另一台資料庫操作如下:
  set sql_log_bin=0;
  source /root/full_2020-10-12.sql
  source /root/inc.sql


檢查資料:
MariaDB [world]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| backup             |
| binlog             |
| mysql              |
| performance_schema |
| test               |
| world              |
+--------------------+
7 rows in set (0.00 sec)

MariaDB [backup]> show tables;    #船艦的表都在
+------------------+
| Tables_in_backup |
+------------------+
| full             |
| full_1           |
| thur             |
+------------------+
3 rows in set (0.00 sec)

恢複完畢。