模擬資料誤刪除並恢復
阿新 • • 發佈:2020-07-30
思路
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;