返回列表 发帖

MySQL恢复误删除的数据

笺注:MySQL的安装可参考 LNMP一键安装包(lnmp_CentOS6.9)


查看MySQL的版本信息:
[root@iZj6c1a39n0ss415rjbuoqZ ~]# mysql -V
mysql  Ver 14.14 Distrib 5.5.48, for Linux (x86_64) using readline 5.1
[root@iZj6c1a39n0ss415rjbuoqZ ~]#



查看MySQL的主配置文件:
[root@iZj6c1a39n0ss415rjbuoqZ ~]# cat /etc/my.cnf |grep -v ^# |grep -v ^$
[client]
port            = 3306
socket          = /tmp/mysql.sock
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
datadir = /usr/local/mysql/var
skip-external-locking
key_buffer_size = 32M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 768K
net_buffer_length = 8K
read_buffer_size = 768K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
thread_cache_size = 16
query_cache_size = 16M
tmp_table_size = 32M
max_connections = 1000
max_connect_errors = 100
open_files_limit = 65535
log-bin=mysql-bin
binlog_format=mixed
server-id       = 1

expire_logs_days = 10
default_storage_engine = InnoDB
innodb_data_home_dir = /usr/local/mysql/var
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/var
innodb_buffer_pool_size = 128M
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 32M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 32M
sort_buffer_size = 768K
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
[root@iZj6c1a39n0ss415rjbuoqZ ~]#

笺注:
log-bin=mysql-bin 代表开启binlog日志
binlog日志文件命名规则的前缀为 mysql-bin



服务器本地登录MySQL数据库:(使用的是数据库管理员root@localhost,密码888)
[root@iZj6c1a39n0ss415rjbuoqZ ~]# mysql -uroot -p888
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3821
Server version: 5.5.48-log Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


查看binlog日志是否已经开启:
mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | ON    |
| log_bin_trust_function_creators | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+
3 rows in set (0.00 sec)

mysql>

注释:
log_bin:ON  代表binlog日志已经开启了



查看binlog日志文件的存放目录:
[root@iZj6c1a39n0ss415rjbuoqZ ~]# mysql -uroot -p888 -e"show variables like '%datadir%';"
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| datadir       | /usr/local/mysql/var/ |
+---------------+-----------------------+
[root@iZj6c1a39n0ss415rjbuoqZ ~]#


binlog日志文件:
[root@iZj6c1a39n0ss415rjbuoqZ ~]# cd /usr/local/mysql/var
[root@iZj6c1a39n0ss415rjbuoqZ var]# ls
discuz       iZj6c1a39n0ss415rjbuoqZ.err  mysql-bin.001281  mysql-bin.001285  mysql-bin.001289  performance_schema
ibdata1      iZj6c1a39n0ss415rjbuoqZ.log  mysql-bin.001282  mysql-bin.001286  mysql-bin.001290  wordpress
ib_logfile0  iZj6c1a39n0ss415rjbuoqZ.pid  mysql-bin.001283  mysql-bin.001287  mysql-bin.001291  zabbix
ib_logfile1  mysql                        mysql-bin.001284  mysql-bin.001288  mysql-bin.index
[root@iZj6c1a39n0ss415rjbuoqZ var]#

注释:
有三个自定义创建的库 discuz、wordpress、zabbix
服务器的主机名为 iZj6c1a39n0ss415rjbuoqZ
会保留一定天数的日志文件;


递增数值越大代表越新:
[root@iZj6c1a39n0ss415rjbuoqZ var]# du -sh mysql-bin.001291
26M     mysql-bin.001291
[root@iZj6c1a39n0ss415rjbuoqZ var]#
[root@iZj6c1a39n0ss415rjbuoqZ var]# du -sh mysql-bin.001290
80M     mysql-bin.001290
[root@iZj6c1a39n0ss415rjbuoqZ var]#
[root@iZj6c1a39n0ss415rjbuoqZ var]# du -sh mysql-bin.001289
79M     mysql-bin.001289
[root@iZj6c1a39n0ss415rjbuoqZ var]# du -sh mysql-bin.001288
79M     mysql-bin.001288
[root@iZj6c1a39n0ss415rjbuoqZ var]# du -sh mysql-bin.001287
78M     mysql-bin.001287
[root@iZj6c1a39n0ss415rjbuoqZ var]#

笺注:
binlog日志文件并非只有一个文件,而是会产生很多,太久的会被自动删除;
binlog日志文件的命名规则:  前缀 + 递增数值



服务器本地登录MySQL数据库后,查看最新的binlog日志文件“mysql-bin.001291”的前十条操作记录:
mysql> show binlog Events in 'mysql-bin.001291' LIMIT 0,10;
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                                                                                                         |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.001291 |   4 | Format_desc |         1 |         107 | Server ver: 5.5.48-log, Binlog ver: 4                                                                                                        |
| mysql-bin.001291 | 107 | Query       |         1 |         177 | BEGIN                                                                                                                                        |
| mysql-bin.001291 | 177 | Query       |         1 |         300 | use `zabbix`; delete from event_suppress where suppress_until<1671559718                                                                     |
| mysql-bin.001291 | 300 | Query       |         1 |         371 | COMMIT                                                                                                                                       |
| mysql-bin.001291 | 371 | Query       |         1 |         441 | BEGIN                                                                                                                                        |
| mysql-bin.001291 | 441 | Query       |         1 |         632 | use `zabbix`; insert into history (itemid,clock,ns,value) values (23259,1671559719,183821990,0.000000),(30459,1671559719,195618016,0.010747) |
| mysql-bin.001291 | 632 | Xid         |         1 |         659 | COMMIT /* xid=146 */                                                                                                                         |
| mysql-bin.001291 | 659 | Query       |         1 |         729 | BEGIN                                                                                                                                        |
| mysql-bin.001291 | 729 | Query       |         1 |         854 | use `zabbix`; delete from task where status in (3,4) and clock<=1671473320                                                                   |
| mysql-bin.001291 | 854 | Query       |         1 |         925 | COMMIT                                                                                                                                       |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)

mysql>

注释:
可以看到,命令“use `zabbix`; delete from task where status in (3,4) and clock<=1671473320”的Pos为729 ,End_log_pos为854



在日志文件“mysql-bin.001291”中,查询2022-12-21 02:08:00到2022-12-21 20:30:00之间,库为zabbix的操作日志,并输出到屏幕上:
[root@iZj6c1a39n0ss415rjbuoqZ ~]# find / -name mysqlbinlog
/usr/local/mysql/bin/mysqlbinlog
[root@iZj6c1a39n0ss415rjbuoqZ ~]#

[root@iZj6c1a39n0ss415rjbuoqZ ~]# /usr/local/mysql/bin/mysqlbinlog --no-defaults --database=zabbix --start-datetime="2022-12-21 2:08:00" --stop-datetime="2022-12-21 20:30:00" /usr/local/mysql/var/mysql-bin.001291 |more

# at 729
#221221  2:08:40 server id 1  end_log_pos 854   Query   thread_id=10    exec_time=0     error_code=0
SET TIMESTAMP=1671559720/*!*/;
delete from task where status in (3,4) and clock<=1671473320
/*!*/;

注释:
可以看到,命令“use `zabbix`; delete from task where status in (3,4) and clock<=1671473320”的执行时间为 2022-12-21 02:08:40





######

创建测试的表和数据:
mysql> use zabbix;
Database changed
mysql> CREATE TABLE table_1 (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(30) NOT NULL,PRIMARY KEY (`id`));
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> insert into table_1(name) values('zhuohua');
Query OK, 1 row affected (0.01 sec)

mysql> insert into table_1(name) values('Python');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table_1(name) values('Mary');
Query OK, 1 row affected (0.01 sec)

mysql>
mysql> select * from table_1;
+----+---------+
| id | name    |
+----+---------+
|  1 | zhuohua |
|  2 | Python  |
|  3 | Mary    |
+----+---------+
3 rows in set (0.00 sec)

mysql>



###

在日志文件“mysql-bin.001291”中,查询2022-12-21 02:08:00到2022-12-21 20:30:00之间,库为zabbix、表为table_1的操作日志,并输出到屏幕上:
[root@iZj6c1a39n0ss415rjbuoqZ ~]# /usr/local/mysql/bin/mysqlbinlog --no-defaults --database=zabbix --start-datetime="2022-12-21 02:08:00" --stop-datetime="2022-12-21 20:30:00" /usr/local/mysql/var/mysql-bin.001291 |grep table_1
CREATE TABLE table_1 (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(30) NOT NULL,PRIMARY KEY (`id`))
insert into table_1(name) values('zhuohua')
insert into table_1(name) values('Python')
insert into table_1(name) values('Mary')

[root@iZj6c1a39n0ss415rjbuoqZ ~]#



###

删除数据:
mysql> use zabbix;
Database changed
mysql>
mysql> delete from table_1 where name = 'Python';
Query OK, 1 row affected (0.01 sec)

mysql> select * from table_1;
+----+---------+
| id | name    |
+----+---------+
|  1 | zhuohua |
|  3 | Mary    |
+----+---------+
2 rows in set (0.00 sec)

mysql>



在日志文件“mysql-bin.001291”中,查询2022-12-21 02:08:00到2022-12-21 20:30:00之间,库为zabbix、表为table_1的操作日志,并写入到文件a.txt中:
[root@iZj6c1a39n0ss415rjbuoqZ ~]# /usr/local/mysql/bin/mysqlbinlog --no-defaults --database=zabbix --start-datetime="2022-12-21 02:08:00" --stop-datetime="2022-12-21 20:30:00" /usr/local/mysql/var/mysql-bin.001291 |grep table_1 > a.txt
[root@iZj6c1a39n0ss415rjbuoqZ ~]#
[root@iZj6c1a39n0ss415rjbuoqZ ~]# cat a.txt
CREATE TABLE table_1 (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(30) NOT NULL,PRIMARY KEY (`id`))
insert into table_1(name) values('zhuohua')
insert into table_1(name) values('Python')
insert into table_1(name) values('Mary')
delete from table_1 where name = 'Python'

[root@iZj6c1a39n0ss415rjbuoqZ ~]#



###

在日志文件“mysql-bin.001291”中,查询2022-12-21 02:08:00到2022-12-21 20:30:00之间,库为zabbix的操作日志,并写入到文件1.txt中:
[root@iZj6c1a39n0ss415rjbuoqZ ~]# /usr/local/mysql/bin/mysqlbinlog --no-defaults --database=zabbix --start-datetime="2022-12-21 02:08:00" --stop-datetime="2022-12-21 20:30:00" /usr/local/mysql/var/mysql-bin.001291 > 1.txt
[root@iZj6c1a39n0ss415rjbuoqZ ~]#

查看文件1.txt:

# at 33976713
#221221 12:13:29 server id 1  end_log_pos 33976884      Query   thread_id=3821  exec_time=0     error_code=0
SET TIMESTAMP=1671596009/*!*/;
CREATE TABLE table_1 (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(30) NOT NULL,PRIMARY KEY (`id`))
/*!*/;

# at 34045288
#221221 12:14:27 server id 1  end_log_pos 34045396      Query   thread_id=3821  exec_time=0     error_code=0
SET TIMESTAMP=1671596067/*!*/;
insert into table_1(name) values('zhuohua')
/*!*/;

# at 34050885
#221221 12:14:41 server id 1  end_log_pos 34050992      Query   thread_id=3821  exec_time=0     error_code=0
SET TIMESTAMP=1671596081/*!*/;
insert into table_1(name) values('Python')
/*!*/;

# at 34054842
#221221 12:14:49 server id 1  end_log_pos 34054947      Query   thread_id=3821  exec_time=0     error_code=0
SET TIMESTAMP=1671596089/*!*/;
insert into table_1(name) values('Mary')
/*!*/;

# at 34263682
#221221 12:18:35 server id 1  end_log_pos 34263788      Query   thread_id=3821  exec_time=0     error_code=0
SET TIMESTAMP=1671596315/*!*/;
delete from table_1 where name = 'Python'
/*!*/;



#####

从日志文件/usr/local/mysql/var/mysql-bin.001291中,重新对库zabbix执行Pos为34050885,End_log_pos为34050992之间的命令:(等于重新在库zabbix中执行命令“insert into table_1(name) values('Python')”)
[root@iZj6c1a39n0ss415rjbuoqZ ~]# /usr/local/mysql/bin/mysqlbinlog --database=zabbix /usr/local/mysql/var/mysql-bin.001291 --start-position 34050885 --stop-position 34050992 | mysql -uroot -p888
[root@iZj6c1a39n0ss415rjbuoqZ ~]#


删除的数据恢复成功:
mysql> use zabbix;
Database changed
mysql>
mysql> select * from table_1;
+----+---------+
| id | name    |
+----+---------+
|  1 | zhuohua |
|  3 | Mary    |
|  4 | Python  |
+----+---------+
3 rows in set (0.00 sec)

mysql>



#####

从日志文件/usr/local/mysql/var/mysql-bin.001291中,重新对库zabbix执行Pos为34263682,End_log_pos为34263788之间的命令:(等于重新在库zabbix中执行命令“delete from table_1 where name = 'Python'”)
[root@iZj6c1a39n0ss415rjbuoqZ ~]# /usr/local/mysql/bin/mysqlbinlog --database=zabbix /usr/local/mysql/var/mysql-bin.001291 --start-position 34263682 --stop-position 34263788 | mysql -uroot -p888
[root@iZj6c1a39n0ss415rjbuoqZ ~]#


效果如下:
mysql> use zabbix;
Database changed
mysql>
mysql> select * from table_1;
+----+---------+
| id | name    |
+----+---------+
|  1 | zhuohua |
|  3 | Mary    |
+----+---------+
2 rows in set (0.00 sec)

mysql>

返回列表