故事背景

前阵子,有位朋友在微信上问我数据被删了能不能恢复,我问了下原因,居然是因为一个配置项惹的祸。

故事细节

在 Spring Boot 中使用 jpa 来操作数据库,jpa 就不做详细的介绍了,相信大家都有所了解或者也用过。

在 jpa 中有一个配置项,可以让程序在启动的时候自动初始化表结构或者更新表结构的功能。听上去很不错,非常实用。

其实这是一个非常危险的功能,个人觉得不应该提供这种功能,只要留了口子就有可能会出问题。

这个配置就是:spring.jpa.hibernate.ddl-auto

  • create(危险系数 2 颗星

应用启动的时候,如果数据库中没有对应的表,就会自动根据实体类的结构创建一个表结构。如果表已经存在了就会将表中的数据清空。

  • create-drop(危险系数 3 颗星

应用启动的时候,如果数据库中没有对应的表,就会自动根据实体类的结构创建一个表结构。如果表已经存在了就会将表中的数据清空。

程序停止的时候会将数据库中所有表删除掉。

  • update(危险系数 1 颗星

应用启动的时候,如果数据库中没有对应的表,就会自动根据实体类的结构创建一个表结构。如果表已经存在了就会判断有没有新增字段或者修改长度之类的,如果有则会更新表结构,不会影响数据。

  • validate(危险系数 0 颗星

validate 不会更新和删除表或者数据,只会做验证逻辑。

  • none (危险系数 0 颗星

禁用 ddl 操作。

如何防范

这种问题归根到底还是技术负责人没重视线上安全问题,主要有下面几点:

  • 数据没备份

线上数据一定要有备份,而且备份得放在不同的机器上,降低风险值。

  • 数据库账号权限细分,不给删除权限,业务做逻辑删除

如果公司有 DBA 那么可能会好点,对数据库相关的安全会管控的比较严。如果没有 DBA,基本上都是开发自己管理,技术负责人应该去做这件事情。

一般的开发人员可以给只读账号就行了,偶尔线上查查数据之类的。

另外需要有一个读写的账号,用于程序中。

像删除,DDL 操作这种权限就留给管理员账号就行了,不然很容易出事。

  • 应用中的框架有 DDL 操作的功能,一律禁止使用

这次的问题,除了开发人员的大意,最主要就是框架中自带了 DDL 的功能。像这种功能就应该禁止使用。

所有的表结构应该在上线之前确认好,最好手动执行,像 DDL 这种操作本身就会锁表,应该在业务低峰期去做。交给程序自动做不靠谱。

我记得我们之前在代码中也有去自动创建表的逻辑,在 code review 的时候被指了出来,然后就去掉了。虽然说是为了使用更方便,但是增加了线上数据库的风险。像一些开源框架中也有类似的逻辑,当表不存在时会自动给你创建好表。

关于作者:尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号 猿天地 发起人。

一言难尽,Jpa这个功能差点让我丢了工作的更多相关文章

  1. 实现推送功能APP端需要完成的工作

    推送功能简介 实现推送的流程如下: 从APP注册推送功能,到APNS服务器发送推送消息给设备,有五个步骤. 一旦推送注册完成,应用自身的服务器以provider的身份提供推送. APP端实现 在代码方 ...

  2. JPA使用入门

    JPA能干什么?我在前面一遍文章<初步了解JPA>基本描述了.不过你不需要点击回去再看.这里简单的再提一下JPA的功能,就是:(1)实现“对象-关系”映射:(2)对象持久化到数据库:(3) ...

  3. JPA原理理解

    从前面一篇<JPA使用入门>了解了JPA的简单使用.要想继续深入的使用JPA,可能了解一点原理对于学习JPA会比较有益处. 这里从JPA的功能来简单阐述JPA的原理. 从<初步了解J ...

  4. SQL2005性能分析一些细节功能你是否有用到?

    原文:SQL2005性能分析一些细节功能你是否有用到? 我相信很多朋友对现在越来越大的数据量而感到苦恼,可是总要面对现实啊,包括本人在内的数据库菜鸟们在开发B/S程序时,往往只会关心自己的数据是否正确 ...

  5. 数据持久层框架iBatis, Hibernate 与 JPA 比较

    在本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persistence API(JPA).我们介绍每种解决方案并讨论其所规定的品质,以及在广泛 ...

  6. Springboot 系列(十)使用 Spring data jpa 访问数据库

    前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...

  7. SpringBoot整合系列-整合JPA

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9959865.html SpringBoot整合JPA进行数据库开发 步骤 第一步:添加必 ...

  8. SpringBoot+Jpa+MySql学习

    上一篇介绍了springboot简单整合mybatis的教程.这一篇是介绍springboot简单整合jpa的教程. 由于jpa的功能强大,后续会继续写关于jpa的介绍已经使用,本文只是简单介绍一下它 ...

  9. 用MyEclipse JPA创建项目(四)

    MyEclipse 3.15 Style——在线购买低至75折!火爆开抢>> [MyEclipse最新版下载] 本教程介绍了MyEclipse中的一些基于PA的功能. 阅读本教程时,了解J ...

随机推荐

  1. 难道你现在还不知道:C/S和B/S

    随着网络技术的不断发展,各种各样的网络应用程序大爆发.运用最多的架构是基于浏览器+服务器的B/S结构,另一种是基于的 C/S结构. 概述: BS = Browser / Server =浏览器+服务器 ...

  2. POJ 3581 Prime Gap(二分)

    Prime Gap Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 11009 Accepted: 6298 Descriptio ...

  3. 图论--传递闭包(Floyd模板)

    #include<iostream> #include<cstring> #include<cmath> using namespace std; int dp[1 ...

  4. Jmeter 后置处理器

    1.JSON Extractor Json extractor 后置处理器用在返回格式为 Json 的 HTTP 请求中,用来获取返回的 Json 中的某个值.并保存成变量供后面的请求进行调用或断言等 ...

  5. Vxlan L2

    VXLAN(Virtual eXtensible LAN可扩展虚拟局域网)诞生了,基于IP网络之上,采用的是MAC in UDP技术 跨三层实现二层通信 总结为何需要Vxlan: 虚拟机规模受到网络规 ...

  6. 【摘抄】深入解析Windows操作系统

    一.线程是一个进程内部的实体,也是Windows执行此进程时的调度实体.若没有线程,进程的程序将不可能运行.线程包含以下部件: 1.一组代表处理器状态的CPU寄存器中的内容. 2.两个栈:一个用于线程 ...

  7. Gitlab常规操作

    一.Git和SVN的区别 和SVN类似,Git是一个版本控制系统(Version Control System,VCS),不同的是SVN为集中式版本控制系统,为单一的集中管理的服务器,保存所有文件的修 ...

  8. Redis系列(六):设置/移除键的过期时间

    本篇博客是Redis系列的第6篇,主要讲解以下内容: 数据库数量 切换目标数据库 设置键的过期时间 移除键的过期时间 本系列的前5篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安 ...

  9. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  10. Programmatically add an application to Windows Firewall

    Programmatically add an application to Windows Firewall 回答1   Not sure if this is the best way, but ...