成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

老板:把數據庫變更,給整利索了

運維 數據庫運維
經過千難萬險的開發,系統終于上線了,進入了更加驚險刺激的捉蟲階段。在修修補補之中,給后人留下一堆屎山之前,我們需要把數據庫給整利索了。

 [[356637]]

本文轉載自微信公眾號「小姐姐味道」,作者小姐姐養的狗。轉載本文請聯系小姐姐味道公眾號。  

經過千難萬險的開發,系統終于上線了,進入了更加驚險刺激的捉蟲階段。在修修補補之中,給后人留下一堆屎山之前,我們需要把數據庫給整利索了。

想想吧,我們在開發環境,修改了多個字段的名稱,經歷了測試環境的洗禮,還搞了個預上線接受變更。結果,僅僅在線上忘了操作其中一條SQL,就前功盡棄。如果你做的是項目類型的工作,客戶半年六個月才升級一次,這些腳本的管理就會亂上加亂。

我們需要把這些數據庫變更,使用git這樣的工具管理起來,在系統啟動的時候,能夠自動變更。通過口口相傳,太不可信了。

誰也不想背這個鍋。翻聊天記錄?有用么?都是事后諸葛亮。

人和動物的區別,就是使用工具。經常被使用的兩個,有Liquibase和Flyway。但是,Liquibase的遷移腳本寫起來太復雜,需要花很多時間維護,遠不如Flyway這樣的開箱即用(犧牲跨平臺)。如果你的項目不是非常復雜,對Liquibase也不熟悉,建議直接選用flyway。

一般,數據庫變更,會有下面幾種語句,我們都可以使用flyway來完成。

  • DDL 建表和索引的時候,用到的語句,比如CREATE、ALTER、DROP等
  • DML 就是一些常見的數據操作語句,比如update、delete、insert
  • DCL 用來設置和管理權限方面信息的語句,比如grant、deny、revoke等

下面,就以flyway為例,來看一下數據庫的版本,是如何變更的。

1. flyway migrate

首先,使用mvn的命令,創建一個示范項目。

  1. mvn archetype:generate -B \ 
  2. -DarchetypeGroupId=org.apache.maven.archetypes \ 
  3.     -DarchetypeArtifactId=maven-archetype-quickstart \ 
  4.     -DarchetypeVersion=1.1 \ 
  5.     -DgroupId=foo \ 
  6.     -DartifactId=bar \ 
  7.     -Dversion=1.0-SNAPSHOT \ 
  8.     -Dpackage=foobar 

在pom.xml文件中加入下面的內容:

  1. <build> 
  2.     <plugins> 
  3.         <plugin> 
  4.             <groupId>org.flywaydb</groupId> 
  5.             <artifactId>flyway-maven-plugin</artifactId> 
  6.             <version>7.3.1</version> 
  7.             <configuration> 
  8.                 <url>jdbc:h2:file:./target/foobar</url> 
  9.                 <user>sa</user
  10.             </configuration> 
  11.             <dependencies> 
  12.                 <dependency> 
  13.                     <groupId>com.h2database</groupId> 
  14.                     <artifactId>h2</artifactId> 
  15.                     <version>1.4.200</version> 
  16.                 </dependency> 
  17.             </dependencies> 
  18.         </plugin> 
  19.     </plugins> 
  20. </build> 

創建數據庫變更目錄。

  1. mkdir -p src/main/resources/db/migration 

創建新的數據庫文件,我們把它叫做第一個版本:src/main/resources/db/migration/V1__Create_person_table.sql

  1. create table PERSON ( 
  2.     ID int not null
  3.     NAME varchar(100) not null 
  4. ); 

使用mvn命令,即可完成數據庫更新。不要怕,這個命令是冪等的。

  1. mvn flyway:migrate 

終端將輸出下面的內容:

  1. [INFO] Database: jdbc:h2:file:./target/foobar (H2 1.4) 
  2. [INFO] Successfully validated 1 migration (execution time 00:00.009s) 
  3. [INFO] Creating Schema History table"PUBLIC"."flyway_schema_history" 
  4. [INFO] Current version of schema "PUBLIC": << Empty Schema >> 
  5. [INFO] Migrating schema "PUBLIC" to version 1 - Create person table 
  6. [INFO] Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.038s) 

下面,我們準備第二個變更,同樣的,我們創建第二版本的文件:src/main/resources/db/migration/V2__Add_people.sql

下面是SQL文件的內容:

  1. insert into PERSON (ID, NAMEvalues (1, 'Axel'); 
  2. insert into PERSON (ID, NAMEvalues (2, 'Mr. Foo'); 
  3. insert into PERSON (ID, NAMEvalues (3, 'Ms. Bar'); 

再次執行mvn flyway:migrate,可以發現第二版本的DML信息,已經被寫入到數據庫。

2. 如何工作?

那flyway是如何做到冪等的呢?我們使用DBeaver來打開這個h2文件。

在JDBC連接處,輸入:jdbc:h2:/private/tmp/bar/target/foobar.mv.db;然后選擇H2 Embedded模式。我們發現,數據庫中除了用戶創建的PERSON表,還多了一個叫做flyway_schema_history的表。

讓我們see一see里面的內容。使用mvn flyway:info命令,能看到相同的內容。

可以看到,這個冪等操作,其實是由一張自動創建的狀態表,來保證的。里面還躺著一個叫做checksum的字段,李曼存儲的是一個CRC32值,用來判斷你的SQL文件是否經過了非法篡改(篡改后將不予通過)。

捅破了這層窗戶紙,一切神奇的事情忽然就變得豁然開朗。所以如果你想要用flyway,你的賬戶,應該起碼給create table的權限,否則你就需要手動建這種表。

從上面的SQL文件定義,也可以看出來,這些文件,需要遵循一定的規律。大體如上圖所示,包含:

  1. 前綴
  2. 版本號
  3. 分隔符
  4. 版本描述

flyway就是靠這種約定,來進行庫表變更的。所以,要嚴格按照它的要求去命名Sql文件。

3. SpringBoot項目集成

在pom中加入flyway的坐標。可以看到我們是沒有提供版本號的,說明它已經在bom文件中定義過了。而它的autoconfigure,在SpringBoot的autoconfigure包里面默認提供了。

  1. <dependencies> 
  2.       <dependency> 
  3.          <groupId>org.flywaydb</groupId> 
  4.          <artifactId>flyway-core</artifactId> 
  5.       </dependency> 
  6.       ... 
  7. </dependencies> 

我們當然要看一下FlywayProperties這個文件所定義的配置項。可以看到它的前綴,就是spring.flyway。

默認的DB變更文件,放在classpath:db/migration,我們也可以通過locations配置自定義一個,比如classpath:cn/xjjdog/flyway。當然,也可以通過table屬性,定義那張his表的名稱。url、user、password這些,也可以提供,把his表存儲在和業務表不一樣的地方。如果不提供,將默認使用datasource所定義的庫。

所以,最小配置,就是什么都不做,直接把變更文件,扔在變更目錄下面就可以了。

  1. spring: 
  2.    datasource:  
  3.       # jdbc配置... 
  4. flyway: 
  5.     enable: true 
  6.     locations: classpath:cn/xjjdog/flyway 

End

一根頭發一寸金,寸金難買寸光陰。

隨著時間的遷移,代碼和sql,都會變成屎一樣的東西。如何在軟件的生命中周期結束之前,讓我們的工程師,活的幸福一點,才是我們該做的。

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高并發世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。

 

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2017-12-01 06:02:14

耦合數據庫CA

2022-03-04 14:57:50

緩存數據庫代碼

2024-05-14 08:20:59

線程CPU場景

2022-07-30 12:24:55

智能圍巾傳感器心率

2021-02-01 09:04:42

Python 項目distutils

2020-10-26 07:02:11

ConcurrentH存儲

2020-07-27 08:26:03

數據庫 SQL索引

2011-08-25 13:41:50

SQL Server 變更跟蹤

2019-09-27 09:13:55

Redis內存機制

2021-11-07 21:01:52

云計算數據庫分布式

2019-09-22 21:34:59

數據庫平滑變更表結構

2018-12-20 09:52:05

JVM內存分配

2010-08-10 09:37:29

DB2 9.7

2011-03-23 17:10:41

ACCESSSQL數據庫

2014-02-27 10:08:33

NoSQL

2021-04-30 08:21:22

Linux管道設計

2020-12-09 08:27:48

并發編程編程開發

2020-12-09 15:00:08

編程IT線程

2020-03-09 09:13:40

HTTPSTCP網絡協議

2021-06-03 21:54:33

數據庫框架緩存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产麻豆乱码精品一区二区三区 | 国产最新视频在线 | 久久综合一区二区 | 伊人超碰 | 日日夜夜操天天干 | 一级毛片播放 | 亚洲国产日韩一区 | 国产精品久久久久久久久久久免费看 | 日韩精品免费播放 | 国产成人精品网站 | 日韩羞羞| 91麻豆精品国产91久久久资源速度 | 日韩精品区| 成人不卡视频 | 精品在线一区二区三区 | 在线日韩 | 一级毛片视频在线 | 91视频在线看 | 97在线播放 | 91精品在线播放 | 91网在线观看 | caoporn视频在线 | 国产一区二区三区在线 | 久久国产视频网站 | 天天影视综合 | 免费国产视频 | 成人欧美一区二区三区在线观看 | 午夜影院在线观看 | 日韩一区在线观看视频 | 国产亚洲精品成人av久久ww | 日韩乱码一二三 | 色综合中文 | 成人av网站在线观看 | 精品人伦一区二区三区蜜桃网站 | 亚洲最大av | 天堂网色 | 日韩在线大片 | 国产资源在线播放 | 黄色毛片免费 | 视频在线观看一区 | 国产日韩久久 |