当前位置:网站首页 > SQL数据库编程 > 正文

sqlyog打开sql文件(怎样打开sql文件)



1、有一个需要备份的功能。

        失效数据且6个月前的数据,备份到备份表。再删除原数据。本来可以直接这样写:

 

        但是因为项目之前做了数据库字段加密,使用了sharding的加密数据源:EncryptDataSource,使用版本:

<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>

        这种数据源虽然对加密比较方便,代码无侵入,但是有很多sql功能却不支持(参见文末)。比如本次的insert into .... select.

       

二、调整思路

        1、可以单独写job,先查询,再整体插入,再删除。 但是这样麻烦些。

        2、不使用加密数据源EncryptDataSource,使用其他的数据源,就可以支持insert... select了。

三、 于是,自行引入未加密的数据源:

 

        使用此数据源执行sql(其实跟手写数据源链接差不多O_o):

 

        

        数据库链接如果不关闭会怎样?

        可以看到以下现象,生成的每一个代理对象,都是不同的对象。 在获取100次之后,开始报错,告知maxActive数目和active数目一致,且没有创建新的链接。获取超时。 即每一个获取都占用了一个链接,而且不会释放。

 

        当正常执行close之后,就是如下现象:每次获取的都是同一个代理对象,且不会超出100个的限制。

 

        

=======================================================

附:EncryptDataSource不支持的sql(参考):

一、mybatis中sql字符串用'',不能使用""

        如果使用双引号,由于sharding语法校验严格,会解析为字段,导致sql解析错误

二、ON DUPLICATE KEY UPDATE语句中不能使用#{},${}

        引入sharding数据源后,如果使用mysql 提供的 主键冲突时 进行更新操作的语句 ON DUPLICATE KEY UPDATE;因为数据库被代理,所以在 ON DUPLICATE KEY UPDATE语句中不能使用#{},${}, 需要使用VALUES方法。

三、不支持case when,having,union 等

  1. 可解析至第一个含表的子查询,在下层嵌套再次找到子查询抛错

子查询不支持聚合函数,不支持含shema的SQL:shardingsphere对sql的访问都是在同一个逻辑schema上

  1. 不支持CASE WHEN、HAVING、UNION (ALL)、有限支持子查询
  2. insert语句中,VALUES语句不支持运算表达式
  3. 不支持INSERT .. SELECT
  4. 不支持包含schema的语句
  5. 脱敏字段无法支持比较操作,如:大于小于、ORDER BY、BETWEEN、LIKE等。
  6. 脱敏字段无法支持计算操作,如:AVG、SUM以及计算表达式 。

四、Mysql like会导致无法使用脱敏字段

如果对脱敏字段使用like,会导致sharding不会对where条件内的原文字段进行替换为脱敏字段,依然使用原文字段擦汗寻

五、Mysql 方法函数不能省略()

        如果sql中的方法函数省略(),会导致sql解析异常

        

六、使用between,in等关键字时不能使用DATE_FORMAT函数

  1. 使用in,between时候,如果使用DATE_FORMAT函数,会导致sql解析异常
  2. 使用DATE_FORMAT函数时候支持=,>,<等简单比较操作

七、sharding 在insert时候 原有sql有字段值直接写死的情况

  1. sharding 在insert时候如果原有sql有字段值直接写死的情况,如status=1,在编译的时候会导致sql注入的值位置错误,字段位置对应不上的情况
  2. 解决方法:1. 写死值改为参数注入 2.把加密字段的#{}提到sql最前面

八、数据库时间转换LocalDateTime,LocalDate,LocalTime错误

  1. 由于目前引入sharding版本,不支持jsr310日期标准,需要通过引入jar形式解决日期类型转换问题(但是里文件路径需要保持mybatis原有转换器路径org.apache.ibatis.type)
  2. 引入sharding后,mybatisPlus时间类型转为LocalDateTime,LocalDate,LocalTime时会转换失败,可以引入mybatis-typehandlers-jsr310解决,但是需要在mybatis-plus-boot-starter前引入

【mybatis-typehandlers-jsr310】和【mybatis】在org.apache.ibatis.type路径下的类重复,需保证优先加载前者的类。感兴趣的可以研究下类加载顺序的控制,暴力解决可以把mybatis-plus-boot-starter版本降到2.3.3,但需关注会不会引发其他问题

---------------------------
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-typehandlers-jsr310</artifactId>
    <version>1.0.2</version>
</dependency>

九、使用sharding同时配置分库分表和脱敏时,配置方式和单独脱敏不一样

  • 需要配置encryptors的type,不需要配aes.key.value,sdk升级>1.2.11,参考如下:(详细可参考官方文档)
     
     

十、不支持语法:now() between start and end

  • 可修改为 start > now() and end < now()

十一、启动报错:StringToDuration

  • 不支持duration对象的配置解析,可升级guava至最新版本

十二、sharding与DruidDataSource的filter有兼容性问题,可能导致NPE

  • 酌情删除相关filter配置
到此这篇sqlyog打开sql文件(怎样打开sql文件)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • mysql查询锁表进程(mysql 查锁表)2025-01-07 16:54:07
  • sql文件如何打开数据库(sql怎么打开数据库文件)2025-01-07 16:54:07
  • sql文件是什么数据库(sql是什么文件格式)2025-01-07 16:54:07
  • sql for循环(sql for循环到5000)2025-01-07 16:54:07
  • sql文件转换成csv显示不全(sqlserver导出csv文件)2025-01-07 16:54:07
  • sql文件怎么导入mysql(sql文件怎么导入mysql数据库)2025-01-07 16:54:07
  • 达梦如何执行sql脚本(达梦执行sql脚本命令)2025-01-07 16:54:07
  • pymysql连接池(pymysql连接sql server)2025-01-07 16:54:07
  • sql使用for循环(sqlfor循环用法)2025-01-07 16:54:07
  • sqlldr 导入clob(sqlldr导入clob)2025-01-07 16:54:07
  • 全屏图片