MySQL防误删插件Recycle_bin概览

1. Recycle_bin简介

recycle_bin是一款MySQL插件,可以在不修改任何MySQL代码的情况下,自动备份MySQL中被Drop的数据库/表,在出现人为误操作删表时,可以快速的进行恢复。实现灵感来源于Oracle flashback的功能,但是从功能完整性上来讲,还有较大的差距,目前仍在完善中。

2. Recycle_bin工作原理

原理非常简单,recycle_bin并不直接作用于master实例,而是工作在复制环境中的slave实例上,当通过客户端在master实例上进行drop操作时,slave实例可以拦截drop操作,先进行数据备份,再进行删除操作。当备份文件超过保存时间后,recycle_bin会自动清除这些备份数据。完整的工作流程可以参照下图

长久以来,MySQL DBA通过一系列的方法限制非超级用户的Drop权限来避免数据表的误删除操作。但是权限收敛并不意味着不需要去进行Drop操作,一旦实施Drop操作,无论是手动还是通过程序自动化进行,就都有可能出现误操作。更不要说一些没有专人维护的数据库实例,RD直接操作数据库更容易引起误删的问题。

即便我们已经有了非常完善的备份策略,可以通过全量+增量的方式恢复删除的数据,但是时间成本太高;还有系统级别的数据恢复方案等等,也不能完全保证数据可以恢复到完全一致的状态,可能出现一次核心业务的表误删除操作,SLA就无法达标。

然之后我们又想通过复制延迟来解决这个问题,在master实例上执行了drop操作之后,slave在设定时间内不会应用日志,可以通过slave实例找到相对应的数据,但这个方案会影响数据库切换逻辑,导致切换时间倍增,并且固定的复制延迟意味着某些查询操作不能路由到从实例上,对于监控上来讲也是一个不可避免的问题。

3. Recycle_bin安装部署说明

3.1 下载编译好的lib文件

#下载页面https://github.com/sunashe/MySQL-Plugin-Recycle-Bin/releases

3.2 源码编译

可以通过下载源代码编译,源码编译依赖MySQL源代码,推荐使用5.7.18以上的版本进行编译。

git clone git@github.com:sunashe/MySQL-Plugin-Recycle-Bin.gitgit checkout 0.5cp -r MySQL-Plugin-Recycle-Bin  mysql_source_dir/plugin/cd mysql_source_dircmake . -DBUILD_CONFIG=mysql_release -DDOWNLOAD_BOOST=1  -DWITH_BOOST=/usr/local/boost/cd plugin/MySQL-Plugin-Recycle-Binmake 

3.3 安装插件

#拷贝下载或者编译得到的recycle_bin.so到MySQL中配置的plugin_dir下。并且更改所属用户。mysql> install plugin recycle_bin soname 'recycle_bin.so';Query OK, 0 rows affected (0.02 sec)

查看MySQL错误日志,如果出现如下内容,则证明安装成功

2019-02-20T19:52:27.326951+08:00 22 [Note] Install Plugin 'recycle_bin' successfully.

3.4 卸载插件

和卸载其它插件一样,命令如下:

mysql> uninstall plugin recycle_bin;Query OK, 0 rows affected (0.02 sec)

4. Recycle_bin 参数/状态说明

插件引入了一些新的参数和状态信息,可以在MySQL中通过show命令查看。

4.1 增加的variables

  • recycle_bin_enabled 全局控制操作,ON表示开启recycle_bin的功能,在recycle_bin准备就绪后,会自动备份被Drop的表

  • recycle_bin_database_name 指定回收站库名,默认为recycle_bin_dba

  • recycle_bin_expire_seconds 备份表的过期时间,或者较保留时间,默认为1800s

  • recycle_bin_check_sql_delay_period 备份操作时,需要等待所有相关的dml语句回放完成,recycle_bin_check_sql_delay_period用于 控制判断周期。默认为10us.

4.2 增加的status

  • Recycle_bin_status recycle_bin的工作状态,recycle_bin_enabled只是一个参数控制,而Recycle_bin_status表示已经符合了条件 ,正式开始工作。一般只有在接收到master的FD event后才会正常工作。所以最好在安装插件后,在master上执行一次flush logs操作 或者重启复制IO线程。

5. 使用说明和限制

5.1 使用说明

  • 支持异步或者半同步复制,可以和半同步复制插件一起工作在slave实例上。对于异步复制来讲,不会影响master实例的性能,对于半同步复制来讲,会有5%左右的性能损失,这部分可以看后续的测试报告。

  • 可以通过手动drop table的方式清除recycle_bin_dba下的备份表。

  • 数据备份的自动清除会在业务无写入时进行,也可以通过手动清除。

5.2 使用限制

  • 复制集群需要开启GTID模式,即MySQL参数gtid_mode=on

  • 只能工作在复制集群的slave实例中。

  • 首次加载插件,需要在master上执行flush logs操作,或者等待binlog日志的自动轮换也可以。

  • 由于备份表的表名格式为原库名_原表名_时间flag_unix时间戳(us),所以库名+表名最长不能超过(64-16-7),否则无法进行备份。

5.3 数据恢复说明

当真的出现表/库被误删除时,可以通过如下方式进行数据恢复。

  • 做主从切换,新主上直接rename即可。

  • 从slave中将相关库/表数据导出,导入到master中。

5.4 使用示例

slave查看当前回收站状态

mysql> show global status like '%recycle%';+--------------------+-------+| Variable_name      | Value |+--------------------+-------+| Recycle_bin_status | ON    |+--------------------+-------+

master上新建测试库表,插入数据

mysql> use sunashe;Database changedmysql> create table t1(id int not null auto_increment primary key,name varchar(10))    -> ;Query OK, 0 rows affected (0.02 sec)
mysql> insert into t1(name) values('aaa');Query OK, 1 row affected (0.00 sec)
mysql> insert into t1(name) values('aaa');Query OK, 1 row affected (0.00 sec)
mysql> insert into t1(name) values('aaa');Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;+----+------+| id | name |+----+------+|  1 | aaa  ||  2 | aaa  ||  3 | aaa  |+----+------+3 rows in set (0.00 sec)

slave上查看同步的数据

mysql> use sunashe;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A
Database changedmysql> show tables;+-------------------+| Tables_in_sunashe |+-------------------+| t1                |+-------------------+1 row in set (0.01 sec)
mysql> select * from t1;+----+------+| id | name |+----+------+|  1 | aaa  ||  2 | aaa  ||  3 | aaa  |+----+------+3 rows in set (0.00 sec)

master上执行drop table操作

mysql> drop table t1;Query OK, 0 rows affected (0.00 sec)mysql> show tables;Empty set (0.00 sec)

此时slave中sunashe库下的t1表也被删除了,但是存放在了回收站库中。

mysql> show tables;Empty set (0.00 sec)
mysql> show tables in recycle_bin_dba;+-------------------------------------+| Tables_in_recycle_bin_dba           |+-------------------------------------+| db1_t1_ashesun_1550664699603202     || sunashe_t1_ashesun_1550664941582282 |+-------------------------------------+
//错误日志2019-02-20T20:15:41.581959+08:00 23 [Note] Master drop table sunashe.t12019-02-20T20:15:41.610112+08:00 23 [Note] Backup table sunashe.t1 successfully.2 rows in set (0.00 sec)

表名格式为原库名_原表名_时间flag_unix时间戳(us),查询备份数据正确性

mysql> select * from recycle_bin_dba.sunashe_t1_ashesun_1550664941582282;+----+------+| id | name |+----+------+|  1 | aaa  ||  2 | aaa  ||  3 | aaa  |+----+------+3 rows in set (0.01 sec)

备份数据过期后,在业务低峰期时(收到心跳event),自动清除。关联参数recycle_bin_expire_seconds.

mysql> set global recycle_bin_expire_seconds=10;Query OK, 0 rows affected (0.01 sec)
mysql> show tables in recycle_bin_dba;+-------------------------------------+| Tables_in_recycle_bin_dba           |+-------------------------------------+| db1_t1_ashesun_1550664699603202     || sunashe_t1_ashesun_1550664941582282 |+-------------------------------------+2 rows in set (0.00 sec)
mysql> show tables in recycle_bin_dba;Empty set (0.00 sec)

查看复制环境是否正常运行

mysql> show slave status\G*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 10.211.55.32                  Master_User: ashe                  Master_Port: 13307                Connect_Retry: 60              Master_Log_File: mysql-bin.000003          Read_Master_Log_Pos: 3080               Relay_Log_File: mysql-relay-bin-master_13307.000004                Relay_Log_Pos: 3293        Relay_Master_Log_File: mysql-bin.000003             Slave_IO_Running: Yes            Slave_SQL_Running: Yes              Replicate_Do_DB:          Replicate_Ignore_DB:           Replicate_Do_Table:       Replicate_Ignore_Table: mysql.ibbackup_binlog_marker      Replicate_Wild_Do_Table:  Replicate_Wild_Ignore_Table: mysql.backup_%                   Last_Errno: 0                   Last_Error:                 Skip_Counter: 0          Exec_Master_Log_Pos: 3080              Relay_Log_Space: 3600              Until_Condition: None               Until_Log_File:                Until_Log_Pos: 0           Master_SSL_Allowed: No           Master_SSL_CA_File:           Master_SSL_CA_Path:              Master_SSL_Cert:            Master_SSL_Cipher:               Master_SSL_Key:        Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No                Last_IO_Errno: 0                Last_IO_Error:               Last_SQL_Errno: 0               Last_SQL_Error:  Replicate_Ignore_Server_Ids:             Master_Server_Id: 12713307                  Master_UUID: cdfe45e6-c227-11e8-abf5-001c42bf9720             Master_Info_File: mysql.slave_master_info                    SQL_Delay: 0          SQL_Remaining_Delay: NULL      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates           Master_Retry_Count: 86400                  Master_Bind:      Last_IO_Error_Timestamp:     Last_SQL_Error_Timestamp:               Master_SSL_Crl:           Master_SSL_Crlpath:           Retrieved_Gtid_Set: cdfe45e6-c227-11e8-abf5-001c42bf9720:708-1419            Executed_Gtid_Set: cdfe45e6-c227-11e8-abf5-001c42bf9720:1-1419                Auto_Position: 1         Replicate_Rewrite_DB:                 Channel_Name: master_13307           Master_TLS_Version:1 row in set (0.01 sec)

recycle_bin的备份清除等操作不会记录任何binlog信息,保证和master的GTID一致。

来源:https://github.com/sunashe/MySQL-Plugin-Recycle-Bin

mysql的回收站Recycle_bin功能使用相关推荐

  1. python操作三大主流数据库(6)python操作mysql⑥新闻管理后台功能的完善(增、ajax异步删除新闻、改、查)...

    python操作mysql⑥新闻管理后台功能的完善(增.删.改.查) 安装表单验证 D:\python\python_mysql_redis_mongodb\version02>pip inst ...

  2. php mysql用户登录_php mysql实现用户登录功能的代码示例

    接着上次的php mysql添加用户的功能代码,今天来学习下php实现用户登录与注销的功能,通过跟踪session会话来保存用户的登陆状态. 1,登录页面 login.php 用户登录_www.# 用 ...

  3. MySQL——MySQL的数据查询功能

    MySQL的数据查询功能 SQL查询的7个关键词--以链家二手房数据为例 在实际工作中,使用最多的就是数据库的查询功能了.在数据查询过程中,通常会用到以下7个核心关键词: SELECT <sel ...

  4. oracle里有limit怎么用,[ORACLE]ORACLE 实现mysql中的limit 功能

    [ORACLE]ORACLE 实现mysql中的limit 功能 项目从mysql迁移到ORACLE中遇到移植问题,mysql中支持limit 而ORACLE say no . 解决方法 利用ORAC ...

  5. win下mysql数据库双机配置_[数据库]windows下使用mysql双机热备功能

    [数据库]windows下使用mysql双机热备功能 0 2016-06-16 12:00:05 一. 准备工作 1. 准备两台服务器(电脑),接入局域网中,使互相ping得通对方 2. 两台服务器都 ...

  6. jquery thinkphp mysql_ThinkPHP5+jQuery+MySql如何实现投票功能

    ThinkPHP5+jQuery+MySql如何实现投票功能 发布时间:2020-12-30 10:03:21 来源:亿速云 阅读:64 作者:小新 这篇文章主要介绍了ThinkPHP5+jQuery ...

  7. Clickhouse的 MySQL ELT和interval 功能等同实现 roundDown

    在MySQL和Clickhouse中分别创建表: mysql> create table scores(id int not null auto_increment primary key,us ...

  8. 基于MySQL的留言回复功能(SSM框架实现)

    使用SSM框架实现留言回复功能(基于MySQL)之前一直纠结这个留言回复功能怎么写,在网上也没有找到一个明确的案例,这里我简单介绍一下我写的基于MySQL的留言回复功能. 注意:首先使用MySQL数据 ...

  9. 服务器里的文件删了在回收站吗,回收站的功能是什么?什么样的文件删除后不能恢复?_网站服务器运行维护,回收站,文件...

    两分钟彻底关闭Windows的更新_网站服务器运行维护 小伙伴们一定遇到过这样的情况,打开电脑就会跳出Windows更新,如果不安装,会每次都跳出,如何彻底关闭Windows更新呢?下面就让我们一起看 ...

最新文章

  1. 智能改变未来,创新引领世界,第二届深圳国际人工智能展暨智能制造创新高峰论坛盛大启幕!
  2. retinaface人脸对齐
  3. Java中@Override的作用
  4. java接口 泛型_java 泛型接口示例
  5. 要注意页面中加载的第三方脚本
  6. Ubuntu环境下安装Bochs
  7. 《敏捷软件开发过程及最佳实践》培训总结
  8. c++ string 无法通过下标访问_数组下标1你见过吗?
  9. 虚拟机中 yum 安装时报错
  10. tomcat配置管理员帐号密码
  11. 使用 CleanWipe 解决Symantec Endpoint Protection卸载需要密码问题
  12. Matlab图例Legend多行排布、字体格式
  13. vue获取微信登陆权限_vue微信授权登录
  14. java8日期加减_JDK 8 三种时间获取方法 日期加减
  15. 解决TypeError: conv2d() received an invalid combination of arguments
  16. Ubuntu快速下载电驴ed2k文件
  17. 西南大学计算机科学学院官网,西南大学计算机与信息科学学院研究生导师简介-李艳涛...
  18. H型钢的尺寸的设计与使用(市场上可以轻松采购)
  19. 外文翻译 | 你以为你会用Math.random() ? 不,你不会……
  20. 大数据入门之学习视频资料分享

热门文章

  1. iOS很坑的error:
  2. 阿里云添加应用监控及应用报警
  3. 腾讯团队实力打造flutter入门教程,吐血整理
  4. ShardingJDBC实战
  5. function declared implicitly
  6. 实战绕过两层waf完成sql注入
  7. 收藏加购是一项长期需要去做、持之以恒更有效的事情
  8. 分布式/微服务理论知识
  9. 全数字转全模拟+数字的完美IC-CV2880留个记录
  10. PHP带头大哥的兵器谱!