MiniOB環境部署開發(使用開源學堂)

整體思路:

1.使用開源學堂在線編程環境開發MiniOB編譯環境

2.使用vscode進行代碼調試和開發以及上傳到倉庫

MiniOB源碼:https://github.com/oceanbase/miniob

MiniOB文檔:MiniOB 介紹 - MiniOB

數據庫大賽官網:OceanBase 社區

訓練營:OceanBase 社區

一、新建github倉庫以及將倉庫內代碼CLONE到本地

前提條件:已注冊 Gitee 賬號,Gitee 官網地址:https://gitee.com。

創建私有倉庫:

登錄 Gitee 平臺,選擇新建倉庫。

輸入倉庫信息,單擊 創建。設置為私有倉庫后其他人無法查看到你的代碼。

賦權官方測試賬號

對于私有倉庫,默認情況下其他人看不到,同樣 OceanBase 測試后臺也無法拉取到代碼,這時想要提交測試,需要先給 OceanBase 的官方測試賬號增加一個權限。

官方測試賬號為:oceanbase-ce-game-test

選擇管理>倉庫成員管理>觀察者。

選擇直接添加,搜索官方測試賬號。

添加完成后,單擊 提交。

上述完成了一系列新建倉庫的操作,接下來建立本地項目與遠程倉儲的同步。

第一步新建文件夾,我此時新建的文件夾為MINIOB。

第二步打開所創建的文件夾。CLONE倉庫到新建文件夾下(此時建立連接成功)

接下來打開obtest文件夾,獲取miniob源碼(獲取地址:https://github.com/oceanbase/miniob),解壓后粘貼到obtest文件夾下:

# 進入到obtest目錄,刪除.git目錄,清除已有的git信息

cd obtest

rm -rf .git

# 重新初始化 git 信息,并將代碼提交到自己的倉庫

git init

git add .

git commit -m 'init' ?# 提交所有代碼到本地倉庫

# 將代碼推送到遠程倉庫

git remote add origin https://gitee.com/nwd_320/obtest.git # 注意替換命令中的信息為自己的庫信息

git branch -M main

git push -u origin main

打開gittee新建的倉庫,如下圖所示:

搭建開發環境

訪問開源學堂網址:云燕實驗室

進入課程學習界面后,大家可以在左側課程目錄中找到對應的實驗,然后點擊對應的目錄項,查看對應的實驗的文檔。

點擊上方啟動環境即可啟動開發環境,每次實驗的開發環境中的內容是會持久化保存在云端。

點擊實驗工具中的vscode來進行開發,將項目在瀏覽器中打開。

輸入git clone https://gitee.com/nwd_320/obtest.git# 注意替換命令中的信息

安裝相應的插件:

新建兩個空文檔(launch.json和tasks.json)

將下列分別粘入文件中,記得保存:

launch.json:

{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version":?"0.2.0","configurations":?[{"type":?"cppdbg","request":?"launch","name":?"Debug","program":?"${workspaceFolder}/${defaultBuildTask}/bin/observer","args":?["-f",?"${workspaceFolder}/etc/observer.ini",?"-P",?"cli"],"cwd":?"${workspaceFolder}/${defaultBuildTask}/","internalConsoleOptions":?"openOnSessionStart","osx":?{"MIMode":?"lldb","externalConsole":true}},{"type":?"lldb","request":?"launch","name":?"LLDB","program":?"${workspaceFolder}/${defaultBuildTask}/bin/observer","args":?["-f",?"${workspaceFolder}/etc/observer.ini",?"-P",?"cli"],"cwd":?"${workspaceFolder}/${defaultBuildTask}/"}]}

Tasks.json:

{// See https://go.microsoft.com/fwlink/?LinkId=733558// for the documentation about the tasks.json format"version":?"2.0.0","tasks":?[{"label":?"init","type":?"shell","command":?"sudo -E env PATH=$PATH bash ${workspaceFolder}/build.sh init"},{"label":?"build_debug","type":?"shell","command":?"bash build.sh debug","problemMatcher":?[],"group":?{"kind":?"build","isDefault":?true}},{"label":?"build_release","type":?"shell","command":?"bash build.sh release"},{"label":?"gen_parser","type":?"shell","command":?"cd ${workspaceFolder}/src/observer/sql/parser && bash gen_parser.sh"}]}

如下圖所示(這里需要等待一會兒):

構建完畢后,將build_debug中的compile_commands.json文件復制到miniob目錄中,隨便打開一個cpp文件,就可以看到clangd開始工作。

用F5進行調試,關于如何vscode如何調試,可以參考相關的資料:cpp-debug。修改launch.json文件中program和args來調試不同的可執行文件。

打開命令行輸入如下信息:

接下來提交到自己的gittee倉庫中:

注:首先打開服務器,再去打開客戶端。

1.在MiniOB代碼目錄下,運行下面命令來編譯MiniOB

bash build.sh debug

2.進入build_debug目錄

cd build_debug/

3.在MiniOB代碼目錄下,運行下面命令來啟動 MiniOB

./bin/observer

4.打開另一個終端,進入build_debug目錄,運行下面命令來啟動MiniOB client

./bin/obclient

三、miniob訓練營提交(basic測試)

進入miniob訓練營官網,選擇basic。

點擊進入

接下來到官網提交代碼,首先找到倉庫地址

我進行簡單提交如圖所示:

四、搭建開發環境MiniOB框架

1.如圖所示左邊是客戶端,右邊是服務端。客戶端發起命令,通過網絡通訊和服務端的網絡模塊去通訊收發命令。服務端的網絡模塊收到SQL(字符串形式存儲)請求后,交給詞法(lex_sql.l)/語法(yacc_sql.y)解析模塊(Parser模塊)(它的代碼在src/observer/sql/parser中。),經過詞法解析和語法解析模塊將SQL請求字符串轉換成帶有語法結構信息的內存數據結構(語法樹)。

2.再轉發給下一個執行緩存模塊Plan Cache,執行計劃緩存模塊會將該SQL第一次生成的執行計劃緩存在內存中,后續的執行可以反復執行這個計劃,避免了重復查詢優化的過程。如果命中,直接將查詢計劃交給 Executor進行執行。

3.若Plan Cache未命中,直接再轉發給Resolver模塊。Resolver模塊會將判斷模塊解析出來的語法樹,進一步細化后轉換成真實的對象(STMT)。比如查詢一張表,會把表名轉換成具體的表對象;如果是查詢某個字段,會轉換成對應的字段名;如果是select *,會把 * 轉換成對應表的各個字段。除此之外還會做一些預檢,比如查詢一張不存在的表,就會提前返回錯誤。

4.把處理的結果給到Transformer(邏輯優化階段)。分析用戶 SQL 的語義,并根據內部的規則或代價模型,將用戶SQL改寫為與之等價的其他形式,并將其提供給后續的優化器做進一步的優化。Transformer的工作方式是在原Statement Tree上做等價變換,變換的結果仍然是一棵Statement Tree。

5.經過這個規則轉換(Transformer)后,交給優化模塊(Optimizer)。優化模塊會根據一些條件找到更好的查詢路徑。比如查詢數據,需要先判斷直接使用索引查詢,速度更快,還是通過全表遍歷查詢速度更快。因為有時部分因素或條件會導致索引查詢更慢,所以優化模塊會做一些判斷,選擇較好的查詢計劃,再轉發給下一個執行模塊。

6.執行模塊(Executor)(相關代碼在src/observer/sql/executor中)會按照查詢計劃去執行,訪問索引、Buffer Pool、記錄管理、以及底層的模塊。然后把查詢的結果返回給網絡模塊。網絡模塊再通過 Socket 返回給客戶端。

其中:

元數據管理(Meta Data):記錄當前的數據庫、表、字段和索引元數據信息;

存儲引擎(Storage Engine):負責數據的存儲和檢索;包括:【Record Manager:組織記錄一行數據在文件中如何存放。Buffer Pool:文件跟內存交互的關鍵組件。B+Tree:索引結構。】

五、Drop-table實驗

刪除表。清除表相關的資源。

注意:要刪除所有與表關聯的數據,不僅僅是在create table時創建的資源,還包括索引等數據。

我們可以根據create table的方式模仿實現Drop-table。可以使用日志文件輔助發現問題在哪。如下圖所示。可以發現創建statement失敗,是在Resolver模塊中。無需從Parser模塊開始修改。

實現具體細節可參考:

https://gitee.com/nwd_320/obtest/commit/9dca2fef06f1e5c76d579aa637664989f38fa86b

測試集:

test/case/test/primary-drop-table.test

Create?table就是新建表,比如在create table t時,會新建一個t.table文件,同時為了存儲數據也會新建一個t.data文件存儲下來。同時創建索引的時候,也會創建記錄索引數據的文件。

因此刪除表,就需要刪除t.table文件、t.data文件和關聯的索引文件。同時由于buffer pool的存在,在新建表和插入數據的時候,會寫入buffer pool緩存。所以drop table,不僅需要刪除文件,也需要清空buffer pool,防止在數據沒落盤的時候,再建立同名表,仍然可以查詢到數據。如果建立了索引,比如t_id on t(id),那么也會新建一個t_id.index文件,也需要刪除這個文件。這些東西全部清空,那么就完成了drop table。存儲方式如下圖所示。

(1)新增SQL類型只需添加對應分支和Stmt子類(Resolver模塊)

src/observer/sql/stmt/stmt.cpp添加drop_table相關分支

src/observer/sql/stmt/目錄下新增drop_table_stmt.cpp(模仿create_table_stmt.cpp)

src/observer/sql/stmt/目錄下新增drop_table_stmt.h(模仿create_table_stmt.h)

(2)增加drop_table執行器(Executor模塊)

src/observer/sql/executor/command_executor.cpp添加drop_table相關分支

src/observer/sql/executor/目錄下新建drop_table_executor.cpp(同上)

src/observer/sql/executor/目錄下新建drop_table_executor.h(同上)

(3)找到對應的Db對象,并且實現表對象的邏輯刪除

src/observer/storage/db/db.cpp添加drop_table函數

src/observer/storage/db/db.h添加drop_table定義

(4)刪除.table文件和.data文件,這個表對應的索引文件,以及DiskBufferPool中的相關資源:

src/observer/storage/table/table.cpp添加drop函數(包括刪除.table文件,刪除.data文件以及包括調用刪除索引文件以及緩存的函數)。

src/observer/storage/table/table.h添加drop定義

src/observer/storage/index/bplus_tree.cpp添加desdroy函數(刪除索引文件)

src/observer/storage/index/bplus_tree.h添加desdroy函數定義

src/observer/storage/index/bplus_tree_index.cpp添加desdroy函數(刪除索引)

src/observer/storage/index/bplus_tree_index.cpp添加desdroy函數定義

src/observer/storage/buffer/disk_buffer_pool.cpp添加remove_file()函數(刪除緩存)

src/observer/storage/buffer/disk_buffer_pool.h添加remove_file()函數定義

如上圖所示功能實現成功。上傳至私人倉庫。提交至訓練營。如下圖所示

六、DATE實驗

要求實現日期類型字段。date測試不會超過2038年2月,不會小于1970年1月1號。注意處理非法的date輸入,需要返回FAILURE。

當前已經支持了int、char、float類型,在此基礎上實現date類型的字段。

這道題目需要從詞法解析開始,一直調整代碼到執行階段,還需要考慮DATE類型數據的存儲。

注意:

- 需要考慮date字段作為索引時的處理,以及如何比較大小;

- 這里限制了日期的范圍,所以簡化了溢出處理的邏輯,測試數據中也刪除了溢出日期,比如沒有 2040-01-02;

- 需要考慮閏年。

實現具體細節可參考:

https://gitee.com/nwd_320/obtest/commit/f0e0054d743cda3f9cc8b451a832af2438f6758a

測試集:

test/case/test/primary-date.test

實現DATE類型可以模仿別的數據類型實現。我們采用日志文件可以發現,DATE類型從Parser模塊就未定義。如下圖所示。

(1)新增DATE類型,支持語法分析和詞法分析(Parser模塊)

src/observer/sql/parser/lex_sql.l添加DATE類型(詞法分析)

src/observer/sql/parser/yacc_sql.y添加DATE類型(語法分析)

注意:

此時在src/observer/sql/parser/目錄下,執行以下命令:

./gen_parser.sh

將會生成詞法分析代碼 lex_sql.h 和 lex_sql.cpp,語法分析代碼 yacc_sql.hpp 和 yacc_sql.cpp。

由于當前沒有把lex_sql.l和yacc_sql.y加入CMakefile.txt中,所以修改這兩個文件后,需要手動生成c代碼,然后再執行編譯。

(2)元數據管理的修改

src/observer/common/type/attr_type.cpp添加date類型

src/observer/common/type/attr_type.h添加date類型

src/observer/common/type/date_type.cpp目錄下新建date_type.cpp(模仿現有類型)

src/observer/common/type/date_type.h目錄下新建date_type.cpp(模仿現有類型)

src/observer/common/type/data_type.cpp添加DATE實例化對象(模仿現有類型)

src/observer/common/type/char_type.cpp添加DATE類型轉換

src/observer/common/value.h添加DATE類型標識(模仿現有類型)

src/observer/common/value.cpp添加DATE類型(模仿現有類型)

(3)Date的合法性判斷

src/common/time/datetime.cpp添加判斷DATE合法性函數

src/common/time/datetime.h添加判斷DATE合法性函數定義

功能實現成功。上傳至私人倉庫。提交至訓練營。如下圖所示

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94143.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94143.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94143.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

09_常用內置模塊進階

第9課:常用內置模塊進階 課程目標 深入學習Python常用內置模塊掌握collections、itertools、functools等模塊學習json、csv、pickle等數據處理模塊 1. collections模塊 1.1 Counter類 from collections import Counter# 統計元素出現次數 text "hello world p…

? Ranger 基礎命令與功能詳解

📌 1. Ranger簡介 Ranger(游俠)是一款 Linux 專用的 指令式文件管理器,其操作風格類似 Vim,通過輸入指令即可完成目錄跳轉、文件編輯、移動、復制等操作。 相比于 mc(Midnight Commander)&…

CUDA安裝教程(包括cuDNN的教程)一個博客帶你了解所有問題

前言 windows10 版本安裝 CUDA ,首先需要下載兩個安裝包 CUDA toolkit(toolkit就是指工具包)cuDNN 注:cuDNN 是用于配置深度學習使用 官方教程 CUDA:Installation Guide Windows :: CUDA Toolkit Documentation …

ArkTS 語言全方位解析:鴻蒙生態開發新選擇

在鴻蒙生態蓬勃發展的當下,一款高效、健壯的開發語言成為開發者的迫切需求。ArkTS 語言應運而生,作為鴻蒙生態的核心應用開發語言,它在 TypeScript(簡稱 TS)基礎上進行創新擴展,為開發者打造高性能、易維護…

JavaScript性能優化實戰:從瓶頸識別到極致體驗

文章目錄JavaScript性能優化實戰:從瓶頸識別到極致體驗1. 引言:為什么JavaScript性能至關重要1.1 性能對用戶體驗的影響1.2 JavaScript性能瓶頸的多樣性2. JavaScript內存管理優化2.1 JavaScript內存模型詳解2.2 垃圾回收機制與優化策略2.3 內存分析實戰…

批量歸一化:不將參數上傳到中心服務器,那服務器怎么進行聚合?

聯邦批量歸一化(FedBN) 是一種聯邦學習客戶端本地模型優化算法。它的核心思想是:在聯邦學習的客戶端本地訓練過程中,保留并獨立更新批量歸一化層(Batch Normalization, BN)的參數,而不將這些參數…

Qt中使用MySQL數據庫

一、MySQL 入門 核心概念 在 QT 中操作數據庫,主要使用兩個模塊: QSqlDatabase:代表一個數據庫連接。 QSqlQuery:用于執行 SQL 語句(如 SELECT, INSERT, UPDATE, DELETE)并處理結果。 環境準備 在編寫代碼之前,你需要確保系統已具備以下條件: 1. 安裝 MySQL 從 M…

Android - 統一資源標識符 Uri

一、概念URI(Uniform Resource Identifier)統一資源標識符,用于標識資源的字符串(如圖片、網頁、文件、應用等)。1.1 與 URL 的區別URL(統一資源定位符)是 URI(統一資源標識符&#…

開源 AR 眼鏡怎么選?OpenGlass ,OSSG,cheApR 分析推薦

開源項目橫評(看完你會知道自己屬于哪一類) 1)OpenGlass:最低成本跑通“能用的AI眼鏡” 賣點:用不到$25的通用元件,把任意普通眼鏡改造成“可黑客化”的智能眼鏡;能錄制、識別、翻譯、記人等。…

RAGFlow (一) 開發環境搭建

本文介紹如何在Windows上進行RAGFlow開發環境搭建 一. 環境準備 前提條件 CPU ≥ 4 核內存 ≥ 16 GB磁盤 ≥ 50 GBDocker ≥ 24.0.0 & Docker Compose ≥ v2.26.1 安裝Docker Desktop為wsl安裝Ubuntu 1.啟用 WSL2??(Windows Subsystem for Linux&#xff09…

k8sday13數據存儲(1.5/2)

目錄 二、高級核心存儲 1、PV 1.1配置文件 ①、訪問模式(accessModes) ②、回收策略(persistentVolumeReclaimPolicy) ③、存儲類別 ④、狀態(Status) 1.2創建測試 ①、準備NFS環境 ②、創建PV …

【力扣 Hot100】每日一題

D15 魯迅曾說,盡量每天都讓自己充實一點,你可以刷一個小時的短視頻,打一個小時的王者榮耀,但盡量再留一個小時出來讀一下書、教程、博客,讓自己的大腦保持活躍,而不是垃圾場。如果真的沒有事情做&#xff…

Sql server的行轉列

業務場景:有如下一張表,希望匯總成下面的查詢結果。 原始數據表 EmployeeTable:一個員工身兼多個崗位。 Employee Role Level 張三 工程師 3 張三 經理 5 李四 工程師 2 李四 主管…

某市-2025【網安·論道】決賽-misc1-翻轉-wp

題目給了個圖片以及一句提示 “斯蒂xx會幫助你” 直接就能想到 ste 開頭的那幾個工具,但是我比賽時候電腦什么ste開頭的工具都沒裝,只能回來做了。 └─$ exiftool x.jpeg ExifTool Version Number : 13.00 File Name : …

[系統架構設計師]大數據架構設計理論與實踐(十九)

[系統架構設計師]大數據架構設計理論與實踐(十九) 一.傳統數據處理系統的問題 1.傳統數據庫的數據過載問題 傳統應用的數據系統架構設計時,應用直接訪問數據庫系統。當用戶訪問量增加時,數據庫無 法支撐日益增長的用戶請求的負載&…

UniAD

1. 算法動機及開創性思路 1)UniAD算法簡介 算法全稱:Planning-oriented Autonomous Driving核心特點: 統一框架整合感知、預測、規劃模塊CVPR 2023最佳論文采用查詢(query)方式連接各模塊 名稱含義: Unified:統一多模塊…

ESP-NOW詳解(esp-idf)

esp-now目前主要支持單播和廣播,廣播地址為ff:ff:ff:ff:ff:ff,廣播可以向范圍內所有擁有esp-now接收的設備發送數據 注意事項,網絡模式是可以設置網絡mac地址的,在單播中,目標設備網絡模式選擇為ap時,mac地址會發生改…

`strlen` 字符串長度函數

1) 函數的概念與用途 strlen 是 C 語言標準庫中最基礎且使用最頻繁的字符串處理函數之一,它的名字來源于"string length"(字符串長度)。這個函數的功能非常明確:計算一個以空字符結尾的字符串的長度。 可以將 strlen 想…

TorchInductor - Introduction

PyTorch 2.x通過TorchDynamo通過Python Bytecode的動態變換實現了圖捕獲功能,需要搭配一個Compiler Backend完成圖編譯。 Pytorch嘗試集成了多個后端,并使用一個輕量級的autotuner來選擇最優的后端圖編譯結果。這個解決方案存在2個問題: 這…

Adobe Illustrator默認鍵盤快捷鍵

目錄 默認鍵盤快捷鍵 常用的快捷鍵 處理文檔 選擇工具 查看圖稿 處理所選對象 繪制 編輯形狀 處理實時上色組 處理對象 創建可變寬度點 處理文字 使用面板 動作面板 “畫筆”面板 “字符”和“段落”面板 “顏色”面板 “漸變”面板 “圖層”面板 “色板”…