Введение
Flyway — это инструмент управления версиями базы данных с открытым исходным кодом, который предпочитает способ соглашения, а не конфигурацию. Flyway может управлять и отслеживать изменения базы данных независимо от приложения, поддерживает автоматическое обновление версии базы данных и имеет набор протоколов по умолчанию, не требующих сложной настройки Миграция может быть написана в виде сценариев SQL или в коде Java, а не только поддерживает командную строку и Java API также поддерживает инструменты сборки, Spring Boot и т. д. В то же время он может безопасно и надежно обновлять базу данных в распределенной среде, а также поддерживает восстановление после сбоя.
2. Краткое введение
# 2.1 Основные характеристики
普通 SQL:纯 SQL 脚本(包括占位符替换)没有专有的XML格式,没有锁定
无限制:使用 Java 代码来进行一些高级数据操作
零依赖:只需运行在 Java6(及以上)和数据库所需的 JDBC 驱动
约定优于配置:迁移时,自动查找系统文件和类路径中的 SQL 文件或 Java 类
高可靠性:在集群环境下进行数据库升级是安全可靠的
云支持:完全支持 Microsoft SQL Azure, Google Cloud SQL & App Engine、Heroku Postgres 和 Amazon RDS
自动迁移:使用 Flyway 提供的 API,让应用启动和迁移同时工作
快速失败:损坏的数据库或失败的迁移可以防止应用程序启动
数据库清理:在一个数据库中删除所有的表、视图、触发器,而不是删除数据库本身
# 2.2 Принцип работы
Когда Flyway подключается к схеме в базе данных, она сначала проверяет, существует ли она ужеflyway_schema_historyтаблицу или создайте ее, если она не существует. Эта таблица используется для отслеживания состояния базы данных, например версии переноса данных, состояния успешного переноса и другой информации.
когдаflyway_schema_historyПосле того, как он будет создан, Flyway просканирует файлы миграции данных в файловой системе или в каталоге пути к классам в приложении, а затем перенесет их в порядке, соответствующем их номерам версий, как показано на следующем рисунке:
flyway_schema_historyСодержимое записей таблицы следующее:
installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success |
---|---|---|---|---|---|---|---|---|---|
1 | 1 | Initial Setup | SQL | V1__Initial_Setup.sql | 1996767037 | axel | 2016-02-04 22:23:00.0 | 546 | true |
2 | 2 | First Changes | SQL | V2__First_Changes.sql | 1279644856 | axel | 2016-02-06 09:18:00.0 | 127 | true |
Поскольку номер версии миграции записывается в таблицу flyway_schema_history, если номер версии файла меньше или равен номеру версии, отмеченному как текущая версия, они игнорируются и не выполняются.
Описанное выше содержание может быть недостаточно интуитивным для читателей, так что давайте приступим к собственно боевым упражнениям.
3. Настоящий бой
Тестовая среда: Mysql5.7
Создайте новый проект Maven.
# 3.1 Добавляем зависимости
<!-- flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
# 3.2 Настройка файла переноса данных
Создайте каталог db/migration в папке src/main/resources проекта и поместите в этот каталог файлы, требующие переноса данных.
Формат имени файла переноса данных: V__ .sql.
Примечание: Нейтрализация имени Между ними два подчеркивания!
Этот тест создает новый файл с именем V1__Create_person_table.sql со следующим содержимым:
create table PERSON (
ID int not null,
NAME varchar(100) not null
);
Содержание миграции данных версии 1 заключается в создании таблицы PERSON.
# 3.3 Кодирование
public class FlywayTest {
public static void main(String[] args) {
String url = "jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false&serverTimezone=GMT%2B8";
String user = "root";
String password = "tiger";
Flyway flyway = Flyway.configure().dataSource(url, user, password).load();
// 创建 flyway_schema_history 表
// flyway.baseline();
// 删除 flyway_schema_history 表中失败的记录
// flyway.repair();
// 检查 sql 文件
// flyway.validate();
// 执行数据迁移
flyway.migrate();
// 删除当前 schema 下所有表
// flyway.clean();
}
}
Результат выполнения следующий:
На рисунке созданный пролет базы данныхflyway_schema_historyТаблица и таблица PERSON, данные успешно перенесены в указанную базу данных.
Когда система обновляется и требуется миграция данных, нам нужно только поместить новую версию файла sql в каталог db/migration.
Например, мы создаем новый файл с именем V2__Add_people.sql со следующим содержимым:
insert into PERSON (ID, NAME) values (1, 'Axel');
insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
insert into PERSON (ID, NAME) values (3, 'Ms. Bar');
Содержимое переноса данных версии 2 заключается в вставке 3 фрагментов данных в таблицу PERSON.
Выполните приведенную выше программу еще раз, демонстрационный эффект выглядит следующим образом:
В-четвертых, интеграция Spring Boot
# 4.1 Добавляем зависимости
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
# 4.2 application.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: tiger
flyway:
enabled: true
# 禁止清理数据库表
clean-disabled: true
# 如果数据库不是空表,需要设置成 true,否则启动报错
baseline-on-migrate: true
# 与 baseline-on-migrate: true 搭配使用
baseline-version: 0
locations:
- classpath:db/migration/mysql(根据个人情况设置)
Поместите файл sql, который требует переноса данных, в каталог db/migration/mysql, запустите проект Spring Boot и запустите Flyway для переноса данных.
Результаты теста такие же, как и выше, и больше не публикуются здесь.
Меры предосторожности:
Если flyway не введен в начале проекта, а должен быть установлен, когда в базе данных уже есть таблицыbaseline-on-migrate: true, после установки стартового проекта конфигурации, flyway создаст в базе данныхflyway_schema_historytable, и в таблицу будет вставлена запись таблицы с версией = 1. Если в данных миграции есть файл, начинающийся с V1__, файл сканирования проигнорирует файл и не выполнит миграцию, что может вызвать другие ошибки данных миграции.
Вышеуказанные два файла sql используются в качестве примеров для демонстрации.В библиотеке flyway есть тестовая таблица.Результаты запуска программы следующие:
Поскольку V1__Create_person_table.sql игнорируется, таблица PERSON не будет создана в библиотеке, и при миграции данных в файле V2__Add_people.sql неизбежно произойдет сбой.
Решение состоит в том, чтобы сначала удалитьflyway_schema_historyтаблице, а затем установить в файле конфигурацииbaseline-version: 0или измените имя версии файла переноса данных и, наконец, снова запустите приложение.