mysql数据备份

embedded/2024/10/18 1:52:07/

为什么写这个话题,原因很简单,在实现业务逻辑的时候很多更新操作没有校验where后面的条件,导致整个表的数据被更新了,工作这么多年了,从入行到现在还在不时的发生,当然避免的方式有很多,但是难免还是有这样的情况发生。

说下我的解决方案:

mysql设置 没有where条件的update delect 禁止执行,它是完全可以做到的,就是你后面想对整个表操作的时候写sql要麻烦一点。 设置 sql_safe_updates 属性就可以

还有一种就是在代码实现层写一个全局的拦截校验 比如我们常用的框架mybatisplus 重写下BlockAttackInnerInterceptor 类拦截报错就能解决。

public class CustomBlockAttackInnerInterceptor extends BlockAttackInnerInterceptor {@Overridepublic void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout){super.beforePrepare(sh,connection,transactionTimeout);PluginUtils.MPStatementHandler handler = PluginUtils.mpStatementHandler(sh);MappedStatement ms = handler.mappedStatement();SqlCommandType sct = ms.getSqlCommandType();String sql = sh.getBoundSql().getSql();if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE){// 检查 SQL 是否为 UPDATE 或 DELETE,且没有 WHERE 子句if (sqlIsWhere(sql)) {throw new ApiException("UPDATE and DELETE statements without a WHERE clause are not allowed!");}}}private boolean sqlIsWhere(String sql) {// 这里实现逻辑来检查 SQL 是否包含 WHERE 子句String lowerCaseSql = sql.trim().toLowerCase();return !lowerCaseSql.contains("where");}@Overrideprotected void processDelete(Delete delete, int index, String sql, Object obj) {this.checkWhere(delete.getTable().getName(), delete.getWhere(), "Prohibition of full table deletion");}@Overrideprotected void processUpdate(Update update, int index, String sql, Object obj) {this.checkWhere(update.getTable().getName(), update.getWhere(), "Prohibition of table update operation");}}

让上面的类生效你还需要配置


@Configuration
public class MybatisPlusConfig {/*** 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new CustomBlockAttackInnerInterceptor());interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}}

上面是我解决问题的实现思路。

数据问题遇到了几次,木已成舟就只能恢复数据,上面方案做完在我的认知里就没有问题。

但是数据库数据恢复还是很有必要在这里说的,原因也很简单我经历数据库mysql中的一些数据文件被加密了,没发读了,一个表被全量更新了,但是其他的业务还在在继续,而且还不能停服务,前期的系统业务架构很重要,做好了也不会有这样的问题,还是那句木已成舟回不去了。

需要定期的dump整个数据库,做全量备份,然后定时的做binglog备份,通过全量+增量的方式,当有问题的时候我们可以快速的恢复数据。


http://www.ppmy.cn/embedded/127202.html

相关文章

RK3588 buildroot 制作的系统增加 docker 支持

RK3588 buildroot 制作的系统增加 docker 支持 简介 使用 ubuntu 系统使用一个指令就可以安装 docker ,因为工作需要,系统不能使用 ubuntu 而只能使用buildroot 制作系统,下面我们就一起看下如果在 buildroot 系统上安装 docker 安装 docker 前的内核配置 运行 docker 需要…

【设计模式】装饰者模式

装饰者模式 角色和buff进行解释 步骤 角色和Buff共有一个Component,理解为有同一个操作,给予Buff里面可以填充角色。角色有一个基类,Buff有一个基类,因为有多种Buff 理解 不是常规理解上的给角色填装Buff,角色作为…

axios的使用

在 Vue 项目中,封装 Axios 并实现加密、重复请求优化、请求取消、页面切换时取消未完成的请求、以及区分上传和下载操作是非常常见的需求。下面将逐一讲解这些需求的实现方式。 1. Axios 的基本封装 首先,我们可以将 Axios 封装到一个服务层中&#xf…

鸿蒙--播放器状态控制

各个页面共享同一个播放状态,而且可以互相控制,如果传递来传递去会非常的麻烦,但是他们都是Tabs组件内的,我们在index页面提供一个状态,在各个组件接收即可 创建两个子组件,一个是播放控制的子组件,一个是背景播放的子组件 背景播放组件

【Linux】为什么创建目录文件,硬链接数是2;创建普通文件时,硬链接数是1?(超详细图文解答)

前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…

SQL注入基础速通

<aside> &#x1f4a1; SQL速通 </aside> 注入点类型&#xff08;数字型&#xff0c;字符型&#xff09; 数字型&#xff1a;1 字符型&#xff1a;’ 和 ‘’ **数字型&#xff1a;?id1 and 11 ?id1 and 12 //报错为数字型字符型&#xff1a;?…

应用UX体验标准

1、应用导航 标准编号 2.1.1.1 系统返回 标准描述 所有界面都可以执行系统返回操作。 除一级界面外&#xff0c;所有全屏界面均需要提供返回/关闭/取消按钮。(全屏沉浸式场景除外) 测试方法 使用侧边返回手势&#xff0c;验证当前应用界面是否可以执行系统返回操作。检查…

Spring框架中的多重构造器选择:实例化对象的策略解析

在Spring框架中&#xff0c;依赖注入和对象实例化是核心功能之一。当我们在Spring容器中配置一个Bean&#xff0c;并且这个Bean类有多个构造器时&#xff0c;一个关键问题便浮现出来&#xff1a;当没有明确指定使用哪个构造器时&#xff0c;Spring是如何决定使用哪一个来实例化…