作者:劉曉峰
原文連結:TDPUB數加社群
1.工具示範
這兩個檔案放在同一目錄下,然後打開cmd,在jar包所在目錄執行下面指令
java -jar Migration-0.0.1-SNAPSHOT.jar
如下
如果報錯8080端口被占用,可以嘗試修改application.yml配置檔案裡的端口号再次執行
然後浏覽器輸入http://localhost:8080/,出現下面的頁面
選擇好資料源,然後選擇好對象,點選第一個按鈕,就會下載下傳此對象以及此對象所有依賴,如果需要對比兩個環境不同的代碼進行遷移,則填好對象後,點選第二個按鈕,就會下載下傳不同的對象。
2. application.yml說明
繼續看這個圖
driver-class-name: oracle.jdbc.OracleDriver表示隻能讀取oracle資料庫
url是固定寫法,比如我的測試環境監聽如下
這樣就對應了ip+端口+服務名
Local表示目前測試環境,remote可以表示正式環境或者待遷移代碼的環境,目的是從local遷移到remote
3. 資料庫使用者要求
在mapper檔案中,涉及到dba_objects,dba_dependenciesd等權限查詢依賴讀寫
需要DBMS_METADATA下載下傳對象,
需要DBMS_CRYPTO 進行散列,進而判斷對象是否發生了改變(可以使用第三方的散列工具,防止不同版本的資料庫之間散列函數不同導緻結果不同)
是以下面給出從零開始建立使用者并授權語句
初始化使用者 授權
“初始化使用者”需要自行修改表空間,如果使用者已經存在,可以隻執行“授權”
兩個環境local和remote使用者都要授權,最好不要用管理者使用者,以防出現異常或者JAR包被修改導緻資料庫對象受損,隻要是隻讀使用者,資料庫會保證對象不被修改,從頭到尾執行的存儲過程隻有DBMS_METADATA,DBMS_CRYPTO 和dbms_monitor
4. 初始化對象并測試
執行下面的腳本進行測試
初始化遷移環境
然後回到頁面,執行下載下傳
壓縮包内容如下:
按順序編譯
5. 端點服務
前端頁面采用thymeleaf開發,可以自行實作前端頁面,這裡也提供了端點服務,可以直接用postman調用
- GET請求
1. 下載下傳所有程式包:
http://localhost:8080/downloadAllDependenciesFile?owner=APPS&objectName=CUX_TABLE_PUB&objectType=PACKAGE&dataSource=local
2. 下載下傳依賴圖:
http://localhost:8080/downAllDependenciesGraph?owner=APPS&objectName=CUX_TABLE_PUB&objectType=PACKAGE&dataSource=local
3. 對比并下載下傳源碼
http://localhost:8080/downloadCompareDependenciesFile?owner1=APPS&objectName1=CUX_TABLE_PUB&objectType1=PACKAGE&dataSource1=local&owner2=APPS&objectName2=CUX_TABLE_PUB&objectType2=PACKAGE&dataSource2=remote
- POST請求
1. 擷取所有對象節點
http://localhost:8080/getAllDependencies
{
"owner":"APPS",
"objectName":"CUX_TEST_A",
"objectType":"PACKAGE",
"dataSource":"local"
}
示例如下
紅框是需要注意修改的
2. 下載下傳圖
http://localhost:8080/allDependenciesGraph
{
"owner":"APPS",
"objectName":"CUX_TEST_A",
"objectType":"PACKAGE",
"dataSource":"local"
}
3. 下載下傳圖資料結構
http://localhost:8080/allDependenciesGraphCode
{
"owner":"APPS",
"objectName":"CUX_TEST_A",
"objectType":"PACKAGE",
"dataSource":"local"
}
6. 其它說明
1.項目JDK版本是JDK17,如果不能正常運作,請使用java --version檢視并更新目前版本
下圖是我的JRE版本(JDK包括JRE,JDK17及以上都可以适配)
如果報錯,可以去下面連結下載下傳配置JDK
2.依賴圖基于jgrapht-core實作,效果着實有點醜,可以使用http://localhost:8080/allDependenciesGraphCode傳回邊和頂點資訊,然後使用第三方架構自己實作圖
3.雖然項目存儲節點資訊的對象全是原型Bean,但是未充分測試并發情況下,其對象是否被其它請求篡改,是以最好隻在本地部署,如果部署到伺服器,需要多次測試(部署方法是一樣的)
4.為監控本工具對資料庫負載影響,已為工具申請的會話設定了用戶端辨別
可以用下面sql進行查詢
select * from v$session s where s.client_identifier='mybatis';
當開啟資源消耗統計後就可以進行查詢
begin
dbms_monitor.client_id_trace_enable(client_id => 'mybatis');
end;
select * from v$client_stats;--需要開啟client_id_trace_enable
當開啟跟蹤後就能為這些會話生成跟蹤檔案
begin
dbms_monitor.client_id_trace_enable(client_id => 'mybatis');
end;
生成跟蹤檔案文法
trcsess output=/tmp/mybatis_trace.trc clientid='mybatis'
/usr/local/oracle19c/diag/rdbms/prod_primary/DUPDB/trace/*.trc
/usr/local/oracle19c/diag/rdbms/prod_primary/DUPDB/trace替換成自己的trace檔案所在路徑
7.報錯資訊暫時未完善,比如你輸入不存在的對象,可能界面沒有反應,控制台會輸出報錯
8.兩個資料庫的對象必須要求owner(schema)一緻,如果測試環境的APPS使用者和正式環境的CUX使用者,即使源碼一緻,仍然視為不同的對象
9.輸入的字元串必須大寫
7. 原文附件 連結
https://yunbee-size-video.oss-cn-hangzhou.aliyuncs.com/database/oracle/%E6%8A%80%E6%9C%AF%E6%96%87%E7%AB%A0/%E8%BF%81%E7%A7%BB%E5%B7%A5%E5%85%B7%E8%AF%B4%E6%98%8E%20%E9%99%84%E4%BB%B6.docx