多数据源 使用 flyWay 进行数据库管理

news2024/11/18 16:33:18

文章目录

  • 前言
      • 多数据源 使用 flyWay 进行数据库管理
        • 1. 环境
        • 2. flyway版本 与 MySQL 版本 对应关系
        • 3. flyway 脚本文件命名方式
        • 4. flyway工作流程
        • 5. 知识点补充
        • 6. 集成的时候常见错误
          • 6.1. user_variables_by_thread没有访问权限
          • 6.2. MySQL不支持Flyway社区版,只支持Flyway企业版
          • 6.3. SQL注入违规
        • 7. Flyway 集成 SpringBoot 实战
          • 7.1. 依赖
          • 7.2. 配置
          • 7.3. Flyway 测试脚本
          • 7.4. 测试

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


多数据源 使用 flyWay 进行数据库管理

flyway是一个开源的数据库迁移工具,它能够自动管理SQL脚本的执行,从而使数据库版本控制和升级变得更加容易。它支持各种数据库(Oracle,MySQL,PostgreSQL,SQL Server等)和多种脚本语言(SQL,Java,Groovy等)。用户可以使用命令行或API将SQL脚本打包在项目中,然后在开发过程中对数据库进行管理和升级。flyway对于Web开发人员来说是非常有用的,它可以自动检测和执行需要执行的脚本。

1. 环境

mysql : 5.7
springBoot 版本: 2.7.3

2. flyway版本 与 MySQL 版本 对应关系

  • Flyway 6.x.x:支持MySQL 5.5及以上版本;
  • Flyway 7.x.x:支持MySQL 5.6及以上版本;
  • Flyway 8.x.x:支持MySQL 5.7及以上版本;
  • Flyway 8.2.x:支持MySQL 8.0及以上版本。

需要注意的是,Flyway对于不同版本的MySQL数据库,支持的功能也会有所不同。因此,在选择使用哪个版本的Flyway时,需要根据实际情况来进行选择。

3. flyway 脚本文件命名方式

序号类型内容格式备注
1版本迁移以V开头,只会执行一次V{版本号(可以用点或下划线)}{分隔符(默认:__)}{描述}.sql
2回退迁移以U开头U{版本号(可以用点或下划线)}{分隔符(默认:__)}{描述}.sql执行一旦发生破坏性更改,会很麻烦,项目中一般不用。
3可重复执行迁移以R开头R{分隔符(默认:__)}{描述}.sql

优先级:
V开头的SQL执行优先级要比R开头的SQL 优先级高。

注意:
对于V开头的SQL脚本,版本号需要唯一,否则Flyway执行会报错;R开头的SQL脚本,如有变化可以执行多次。

4. flyway工作流程

  1. 项目启动、数据库连接池建立、flyway 运行;
  2. 初次使用时,如果不设置table值,flyway会默认创建一个 flyway_schema_history 表,用于记录sql执行记录;
  3. 如果不配做扫描路径,Flyway会扫描项目 classpath:db/migration 下的所有sql脚本,与存储记录sql执行表里的记录做对比,当validate-on-migrate为true时,进行校验,比如对于V开头的SQL脚本,版本号需要唯一,否则Flyway执行会报错等等…,一旦发现问题,Flyway抛出异常并停止项目;
  4. 校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本。

5. 知识点补充

  1. flyway执行migrate必须在空白的数据库上进行,否则报错;
  2. 对于已经有数据的数据库,必须先baseline,然后才能migrate;
  3. clean操作是删除数据库的所有内容,包括baseline之前的内容;
  4. 尽量不要修改已经执行过的SQL,即便是R开头的可反复执行的SQL,它们会不利于数据迁移;
  5. 当需要做数据迁移的时候,更换一个新的空白数据库,执行下migrate命令,所有的数据库更改都可以一步到位地迁移过去;

6. 集成的时候常见错误

6.1. user_variables_by_thread没有访问权限

Caused by: java.sql.SQLSyntaxErrorException: SELECT command denied to user ‘TESTTWO’@‘localhost’ for table ‘user_variables_by_thread’

在这里插入图片描述
解决:

GRANT SELECT ON performance_schema.user_variables_by_thread TO 'TESTTWO'@'localhost';
GRANT SELECT ON performance_schema.user_variables_by_thread TO 'TESTONE'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
6.2. MySQL不支持Flyway社区版,只支持Flyway企业版

.FlywayEditionUpgradeRequiredException: Flyway Teams Edition or MySQL upgrade required: MySQL 5.7 is no longer supported by Flyway Community Edition, but still supported by Flyway Teams Edition.
在这里插入图片描述
大致意思是:MySQL 5.7不支持Flyway社区版,只支持Flyway企业版,提出的解决方案是改成企业版或升级MySQL。

解决:
降低Flyway版本性价比应该是最高的,最快速的。

6.3. SQL注入违规

sql injection violation, comment not allow :
在这里插入图片描述
因为我这里用的多数据源有filter,把防注入去掉就好
解决:
把这里的wall 去掉。
在这里插入图片描述

7. Flyway 集成 SpringBoot 实战

7.1. 依赖
        <!--多数据源-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
                <!-- flyway -->
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
            <version>5.2.3</version>
        </dependency>
7.2. 配置
package org.example.config;

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flywaydb.core.Flyway;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.io.File;
import java.util.Map;

/**
 * @author yangzhenyu
 * @version 1.0
 * @description:
 * @date 2023/5/5 13:36
 */
@Slf4j
@Configuration
@RequiredArgsConstructor
@EnableTransactionManagement
public class FlywayConfig {
    private final DataSource dataSource;

    // 是否启用 Flyway,true 启用,false 不启用
    @Value("${spring.flyway.enabled: false}")
    private Boolean FLYWAY_ENABLED;
    // 指定 SQL 脚本文件夹路径 这里写主库路径,然后在配置类中转换
    @Value("${spring.flyway.locations: classpath:db/master}")
    private String SQL_LOCATION;
    // 版本更新历史记录表
    @Value("${spring.flyway.table: yzy_db_version}")
    private String VERSION_TABLE;


    // 是否可以无序执行
    @Value("${spring.flyway.out-of-order: false}")
    private Boolean OUT_OF_ORDER;

    // 迁移前校验 SQL 文件是否存在问题
    @Value("${spring.flyway.validate-on-migrate: true}")
    private Boolean VALIDATE_ON_MIGRATE;

    // 编码格式,默认UTF-8
    @Value("${spring.flyway.encoding: UTF-8}")
    private String ENCODING;
    // 迁移sql脚本文件名称的前缀,默认V
    @Value("${spring.flyway.sql-migration-prefix: V}")
    private String SQL_MIGRATION_PREFIX;

    //迁移sql脚本文件名称的分隔符,默认2个下划线__
    @Value("${spring.flyway.sql-migration-separator: __}")
    private String SQL_MIGRATION_SEPARATOR ;

    // 迁移sql脚本文件名称的后缀
    @Value("${spring.flyway.sql-migration-suffixes: .sql}")
    private String SQL_MIGRATION_SUFFIXES ;

    // 非空数据库初始化Flyway时需要打开此开关进行Baseline操作 (如果数据库不是空表,需要设置成 true,否则启动报错)
    @Value("${spring.flyway.baseline-on-migrate: true}")
    private Boolean BASELINE_ON_MIGRATE;

    // 基础版本号  与 baseline-on-migrate: true 搭配使用
    @Value("${spring.flyway.baseline-version: 1}")
    private String BASELINE_VERSION;

    @Primary
    @Bean
    @PostConstruct
    public void migrateOrder() {

        if (FLYWAY_ENABLED) {
            log.info("调用数据库生成工具");
            SQL_LOCATION = SQL_LOCATION.split("/")[0]; // 多数据源的配置
            DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
            Map<String, DataSource> dataSources = ds.getDataSources();
            dataSources.forEach((k, v) -> {
                log.info("正在执行多数据源生成数据库文件 " + k);
                Flyway flyway = Flyway.configure()
                        .dataSource(v)
                        .locations(SQL_LOCATION + File.separator + k)
                        .baselineOnMigrate(BASELINE_ON_MIGRATE)
                        .table(VERSION_TABLE)
                        .outOfOrder(OUT_OF_ORDER)
                        .validateOnMigrate(VALIDATE_ON_MIGRATE)
                        .encoding(ENCODING)
                        .sqlMigrationPrefix(SQL_MIGRATION_PREFIX)
                        .sqlMigrationSeparator(SQL_MIGRATION_SEPARATOR)
                        .sqlMigrationSuffixes(SQL_MIGRATION_SUFFIXES)
                        .baselineVersion(BASELINE_VERSION)
                        .load();
                flyway.migrate();
            });
        }
    }
}


spring:
  datasource:
    dynamic: # druid连接池配置
      primary: master #默认数据源
      datasource:
        master: #主库配置
          username: TESTONE
          password: TESTONE
          driver-class-name: ${datasource_driver_class_name:com.mysql.cj.jdbc.Driver}
          url: ${datasource_url:jdbc:mysql://localhost:3306/TESTONEDB?characterEncoding=UTF-8&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true}
          druid:
            initial-size: 5 #启动程序时,在连接池中初始化多少个连接
            max-active: 20 #连接池中最多支持多少个活动会话
            min-idle: 5 #回收空闲连接时,将保证至少有minIdle个连接
            max-wait: 60000 #程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池
            filters: stat,slf4j
        slave: #从库配置
          username: TESTTWO
          password: TESTTWO
          driver-class-name: ${datasource_driver_class_name:com.mysql.cj.jdbc.Driver}
          url: ${datasource_url:jdbc:mysql://localhost:3306/TESTTWODB?characterEncoding=UTF-8&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true}
          druid:
            initial-size: 5 #启动程序时,在连接池中初始化多少个连接
            max-active: 20 #连接池中最多支持多少个活动会话
            min-idle: 5 #回收空闲连接时,将保证至少有minIdle个连接
            max-wait: 60000 #程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池
            filters: stat,slf4j
  flyway:
    enabled: true # 是否启用 Flyway,true 启用,false 不启用
    # 版本更新历史记录表
    table: yzy_db_version
    # 非空数据库初始化Flyway时需要打开此开关进行Baseline操作
    baseline-on-migrate: true
    # 是否可以无序执行
    out-of-order: false
    # 迁移前校验 SQL 文件是否存在问题
    validate-on-migrate: false
    locations: classpath:db/master  # 指定 SQL 脚本文件夹路径 这里写主库路径,然后在配置类中转换
    # 编码格式,默认UTF-8
    encoding: UTF-8
    # 迁移sql脚本文件名称的前缀,默认V
    sql-migration-prefix: V
    # 迁移sql脚本文件名称的分隔符,默认2个下划线__
    sql-migration-separator: __
    # 迁移sql脚本文件名称的后缀
    sql-migration-suffixes: .sql
    # 基础版本号
    baseline-version: 1

7.3. Flyway 测试脚本

在这里插入图片描述
V20230505_1__yzy_db_version_remark.sql


alter table yzy_db_version comment 'flyway数据库版本控制表';

V20230505_2__新增测试表.sql

create table flyway_test
(
    ID   int(18) auto_increment comment 'id'
        primary key,
    AGE  int(100)     not null comment '年龄',
    NAME varchar(100) null comment '姓名',
    CREATE_TIME    datetime null comment '删除时间'

)
7.4. 测试

项目启动,查看数据库信息:
select * from yzy_db_version;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明集成成功!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

68元工业级双核A7,全新T113核心板震撼上市!

万象奥科全新T113核心板震撼上市&#xff0c;仅68元、工业级品质、双核A7处理器、外设丰富&#xff0c;诠释极致性价比&#xff01; 参数速递 1.全志T113工业级处理器&#xff0c;主频1.2GHz 2.双核Cortex-A7玄铁C906 RISC-V HiFi4 DSP异构多核 3.内存128MB/256MB/512MB&a…

【Kafka】概述与集群部署

文章目录 Kafka概述定义应用场景缓冲/削峰解耦异步通信 应用模式点对点模式发布/订阅模式 基础架构 Kafka集群部署集群规划下载解压修改配置文件分发安装包hadoop103、hadoop104修改配置文件配置环境变量启动集群先启动Zookeeper集群然后启动Kafka 关闭集群 集群启停脚本脚本编…

QT自学笔记2:使用介绍(函数)

一、 setAttribute&#xff08;按F1&#xff09;—>void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on true) —>Qt::WidgetAttribute attribute&#xff08;有一个属性&#xff09; ----> p->setAttribute(Qt::WA_DeleteOnClose); MainWind…

眼见为实,来瞧瞧MySQL中的隐藏列!

在介绍mysql的多版本并发控制MVCC的过程中&#xff0c;我们提到过mysql中存在一些隐藏列&#xff0c;例如行标识、事务ID、回滚指针等&#xff0c;不知道大家是否和我一样好奇过&#xff0c;要怎样才能实际地看到这些隐藏列的值呢&#xff1f; 本文我们就来重点讨论一下诸多隐…

ThingsBoard集群部署之k8s

1、概述 今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来…

Linux基本指令【Linux操作系统】

本文将开启Linux操作系统学习新篇章&#xff0c;欢迎与博主一起交流学习。 目录 一、ls指令 二、pwd指令 三、mkdir与rm指令 四、cd指令 五、touch指令 六、man指令&#xff08;重要&#xff09; 七、cp指令&#xff08;重要&#xff09; 八、mv指令&#xff08;重要&…

keepalived如何手动切换主备

概述 主备部署中使用keepalived可以很方便的实现&#xff0c;安装维护简单&#xff0c;功能稳定。 最近在使用过程中有小的发现&#xff0c;记录一下。 环境 CentOS Linux release 7.9.2009 (Core) keepalived.x86_64 1.3.5-19.el7 安装配置 centos7自带的keepalived版本…

提升自我数据分析能力的根本,是方法论!

很多人问&#xff0c;我是财务&#xff0c;能转行业做BI吗&#xff1f;我该学些什么&#xff1f;该掌握哪些技能&#xff1f;该如何学习&#xff1f;我是学生&#xff0c;在校期间专业不扎实&#xff0c;该怎么办&#xff1f;我是小白&#xff0c;还能学会数据分析吗&#xff1…

第二届“强国青年科学家”获奖者均有海外经历

今天是五四青年节&#xff0c;为了弘扬五四精神&#xff0c;知识人网小编本期专门介绍10名第二届“强国青年科学家”获奖者。特别提示&#xff1a;这些科学家均具有海外留学或研究经历。 五四精神的核心内容为“爱国、进步、民主、科学”。 进一步弘扬科学精神&#xff0c;营造…

找不到vcruntime140.dll,无法继续执行代码,解决方法分享

找不到vcruntime140.dll,无法继续执行代码&#xff1f;vcruntime140.dll 是 Visual Studio 2015 运行库的 Dynamic Link Library 文件&#xff0c;许多 Windows 应用程序需要它才能正常运行。当你尝试安装或运行某些应用程序时&#xff0c;有时可能会遇到找不到 vcruntime140.d…

电压放大器的实际应用有哪些方面

电压放大器是一种电子设备&#xff0c;用于增加信号的电压&#xff0c;使得信号具备更大的电压和功率去驱动负载&#xff0c;或者是更容易被检测、传输和处理。电压放大器的基本原理是将输入信号增加一个固定的电压值&#xff0c;以使得输出信号的幅值与输入信号的幅值相同或更…

怎样才能学好数据分析?

俗话说&#xff0c;先入行再求发展&#xff0c;好比你想彩票中奖&#xff0c;得先有买这个过程才行。想成为优秀数据分析也是如此&#xff0c;先掌握好这门技能入行后&#xff0c;再谈发展和深研。很多人都想拥有高薪双休又不加班的工作&#xff0c;比如数据分析&#xff0c;但…

在制造业的工业2.0中应用MOM系统

介绍 什么是制造运营管理 (MOM) 系统和 IT 架构的最佳实践&#xff1f; 行业专家对制造类型和供应网络有何建议&#xff1f; 管理思维和企业文化是否因不断变化的全球市场而过时&#xff1f; MOM 技术是否过于昂贵&#xff0c;IT 架构是否无法快速适应市场变化&#xff1f;…

波奇学c++:类和对象:类,构造函数,析构函数和拷贝构造函数

面向对象和面向过程 面向对象&#xff1a;划分事务参与的对象&#xff0c;关注对象的交互&#xff0c;现实关系更真实的模拟现实 面向对象三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 封装&#xff1a;私有&#xff0c;公有&#xff0c;为了更好的管理 c语言…

第 7 章 与 Hive 的集成--以及最后的HBase回顾

7.1 使用场景 如果大量的数据已经存放在 HBase 上面&#xff0c;需要对已经存在的数据进行数据分析处理&#xff0c;那 么 Phoenix 并不适合做特别复杂的 SQL 处理&#xff0c;此时可以使用 hive 映射 HBase 的表格&#xff0c;之后 写 HQL 进行分析处理。 插入一条&#xff…

鸿蒙Hi3861学习五-Huawei LiteOS(任务管理)

一、任务简介 关于任务的相关介绍&#xff0c;之前文章有比较详细的介绍&#xff0c;这里不做过多解释&#xff0c;可以参考如下文章&#xff1a;FreeRTOS学习二&#xff08;任务&#xff09;_t_guest的博客-CSDN博客 而LiteOS的主要特性可以总结为如下几点&#xff1a; LiteO…

一个文章学会使用Git

GIT版本控制系统 版本控制系统 : ​ 1.记录历史版本信息 (记录每一次修改的记录) ​ 2.方便团队相互之间协作开发 ​ … 常用的版本控制系统 cvs / svn : 集中式版本控制系统git : 分布式版本控制系统 svn git GIT工作原理 工作区 : 我们能看到的&#xff0c;并且用来写代码的…

nodejs的安装以及Dos的命令

1.0 nodeJS nodejs是基于谷歌v8引擎的执行环境&#xff0c;他没有BOM、DOM nodeJS安装 找官网 ->下载 -> 傻瓜式下一步 -> win键 r -> 输入cmd 进入dos操作命令 -> node -v 查看版本 1.1 DOS 命令【掌握】 进入指定文件夹 cd 文件目录 退出到上一层 cd .…

112.【Vue-细刷-03】

Vue-03 (二十)、过渡和动画1.过渡案列_原生实现2.过渡案列_Vue实现3.动画案列_Vue实现 (1)4.动画案列_Vue实现(2)5.Vue实现时间格式化6.Vue实现过滤器7.Vue常用内置指令 (二十一)、Vue的自定义指令1.自定义非内嵌指令&#xff08;不保留h2中的原有text&#xff09;2.自定义非内…

在线教育机构视频加密防下载和防盗用的方法有哪些可以借鉴

阿酷TONY / 原创 / 2023-5-5 / 长沙 在线教育机构防止视频被盗用和视频被下载&#xff0c;可以采取以下措施&#xff0c;一共10条&#xff0c;总有一条适用于您吧&#xff0c;收藏一下吧~~~~~ 1.VRM分片错序视频加密 2.Html5全链路视频加密 3.用户ID跑马灯 4.数字化动态水印 …