1. 程式人生 > 實用技巧 >模擬資料誤刪除並恢復

模擬資料誤刪除並恢復

思路

1.停止舊庫,避免二次傷害
2.建立新庫
3.匯入上一次舊庫的全備
4.通過binlog找到新增的資料
5.匯入新資料,檢查資料是否恢復
6.恢復業務
	a.直接使用'臨時庫頂替原生產庫',前端應用割接到新庫('資料量特別大的時候')
	b.將誤刪除的'表單獨匯出',然後匯入到原生產環境('資料量小的時候')

模擬舊庫環境

1.連線庫
[root@db02 ~]# mysql -uroot -p123
#建立庫
mysql> create database linux9;
#進入庫
mysql> use linux9
#建立表
mysql> create table student(id int,name varchar(10),gender enum('m','f'),age tinyint)
#查看錶結構
mysql> desc student;
+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| id     | int(11)       | YES  |     | NULL    |       |
| name   | varchar(10)   | YES  |     | NULL    |       |
| gender | enum('m','f') | YES  |     | NULL    |       |
| age    | tinyint(4)    | YES  |     | NULL    |       |
+--------+---------------+------+-----+---------+-------+
#插入資料
mysql> insert student values(1,'aaa','m',10),(2,'bbb','m',20),(3,'ccc','m',30);
#查看錶資料
mysql> select * from student;
+------+------+--------+------+
| id   | name | gender | age  |
+------+------+--------+------+
|    1 | aaa  | m      |   10 |
|    2 | bbb  | m      |   20 |
|    3 | ccc  | m      |   30 |
+------+------+--------+------+
#檢視當前所在庫
mysql> select database();
+------------+
| database() |
+------------+
| linux9     |
+------------+
#模擬全備
[root@db02 ~]# mysqldump -uroot -p -B linux9 --triggers --master-data=2 --single-transaction > /tmp/linux.sql
Enter password:
[root@db02 ~]# ll /tmp/linux9.sql 
-rw-r--r-- 1 root root 2305 Jul 23 04:17 /tmp/linux9.sql

[root@db02 ~]# mysql -uroot -p
Enter password:
mysql> use linux9
#插入新資料
mysql> insert student values(10,'zzz','f',99);
mysql> select * from student;
+------+------+--------+------+
| id   | name | gender | age  |
+------+------+--------+------+
|    1 | aaa  | m      |   10 |
|    2 | bbb  | m      |   20 |
|    3 | ccc  | m      |   30 |
|   10 | zzz  | f      |   99 |
+------+------+--------+------+
#刪除庫
mysql> drop database linux9;
#檢視庫
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

解決方法

#停止舊庫,避免二次傷害
[root@db02 ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
#檢視備份結束的位置點(775)
[root@db02 ~]# head -22 /tmp/linux9.sql | tail -1
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=775;


[root@db02 ~]# cd /usr/local/mysql/data/
[root@db02 data]# ll
total 112132
-rw-rw---- 1 mysql mysql       56 Jul 23 04:50 auto.cnf
-rw-rw---- 1 mysql mysql 12582912 Jul 23 05:25 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Jul 23 05:25 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Jul 23 04:50 ib_logfile1
drwx------ 2 mysql mysql     4096 Jul 23 04:50 mysql
-rw-rw---- 1 mysql mysql    69408 Jul 23 04:50 mysql-bin.000001
-rw-rw---- 1 mysql mysql  1485584 Jul 23 04:50 mysql-bin.000002
-rw-rw---- 1 mysql mysql     1132 Jul 23 05:25 mysql-bin.000003
-rw-rw---- 1 mysql mysql      117 Jul 23 04:50 mysql-bin.index
drwx------ 2 mysql mysql     4096 Jul 23 04:50 performance_schema
drwx------ 2 mysql mysql        6 Jul 23 04:50 test
#檢視drop前的位置點(1011)
[root@db02 data]# mysqlbinlog mysql-bin.000003 > 3.txt && vim 3.txt
...
# at 980
#200723  5:16:54 server id 2  end_log_pos 1011 CRC32 0x6d0a4046 	Xid = 90
COMMIT/*!*/;
# at 1011(end_log_pos 1109)------------------
#200723  5:17:30 server id 2  end_log_pos 1109 CRC32 0x74c7fb98 	Query	thread_id=6	exec_time=0	error_code=0
SET TIMESTAMP=1595452650/*!*/;
SET @@session.pseudo_thread_id=6/*!*/;
drop database linux9
/*!*/;
# at 1109
...

#確認2位置點之後,通過log-bin匯出新寫入的資料檔案
[root@db02 data]# mysqlbinlog -d linux9 --start-position=775 --stop-position=1011 mysql-bin.000003 > /tmp/new.sql
#將全備檔案,新資料拷貝到新庫
[root@db02 data]# scp /tmp/linux9.sql /tmp/new.sql 10.53:/tmp/
[email protected]'s password: 
linux9.sql                                          100% 2305     2.1MB/s   00:00    
new.sql                                             100%  693   496.8KB/s   00:00
#進入
mysql> use linux9
#匯入全備
[root@db03 ~]# mysql -uroot -p < /tmp/linux9.sql 
Enter password:
#檢視資料
mysql> select * from student;
+------+------+--------+------+
| id   | name | gender | age  |
+------+------+--------+------+
|    1 | a    | m      |   10 |
|    2 | b    | m      |   20 |
|    3 | c    | m      |   30 |
+------+------+--------+------+
#匯入新資料
mysql> \. /tmp/new.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
#檢視總資料
mysql> select * from student;
+------+------+--------+------+
| id   | name | gender | age  |
+------+------+--------+------+
|    1 | a    | m      |   10 |
|    2 | b    | m      |   20 |
|    3 | c    | m      |   30 |
|  100 | z    | m      |   99 |
+------+------+--------+------+

#匯出總資料
[root@db02 ~]# mysqldump -uroot -p123 linux9 > /tmp/linux9.sql
#拷貝到舊庫
[root@db02 ~]# scp /tmp/linux9.sql 172.16.1.51:/tmp/
#啟動舊庫
[root@db01 ~]# systemctl start mysqld
#建立刪除的庫
mysql> create database linux9;
#進入庫
mysql> use linux9;
#匯入總資料
mysql> source /tmp/linux9.sql
#檢視
mysql> select * from student;