總
這篇是對rocksdb整體功能的分析,主要着眼點是db.h文件,對rocksdb進行代碼解析,若想以整體的方式了解其功能,首先就應該解析db.h文件。對於rocksdb的db.h文件來說,且不論前面一大串結構體,該文件的核心無疑是class DB,從一百多行到一千多行,都是這個類。
本文共計七千余字,分為四個部分,分別是整體方法,屬性方法,參數解析和其他。
下面對類內部進行分析,為了節約空間,函數參數不再寫了。
整體方法
該表格為整體性方法,主要操作包含Put,Get,Delete等鍵值存儲的基礎操作以及針對數據庫本身的操作,還有就是rocksdb自身的擴展。
Open | 用指定的“name”【引用型字符串參數】打開數據庫【默認列族】。在* dbptr中存儲指向堆分配的數據庫的指針,並在成功時返回OK。將nullptr存儲在* dbptr中,並在出現錯誤時返回非OK狀態。當不再需要* dbptr時,調用者應將其刪除(delete DB)。返回值直接給db就行,一般來說數據庫只用有一個,如果想分類使用列族的方式會快很多。 |
OpenForReadOnly | 以只讀形式打開數據庫,此時不考慮列族的問題,像刪改一樣的改數據的操作都會返回錯誤,且不會觸發compaction操作。 |
OpenForReadOnly | 以只讀模式打開某列族(或某些),用參數與上面的玩意區分,列族名存在vector數組中。只能打開指定的列族,如果不寫指定列族的參數的話,會對默認列族進行操作。默認列族存在 kDefaultColumnFamilyName 里面,可以自行修改。假如想對n個列族進行操作的話,應該創建n-1個列族。 |
OpenAsSecondary | 從節點功能,該方法創建了一個從節點,可以動態地追蹤現有的MANIFEST文件。用戶可以在需要時調用TryCatchUpWithPrimary使備份追上主節點。主節點優先級大於從節點,啟動從節點的話只要主節點的句柄沒有被銷毀,還是可以恢復到主節點狀態的。 options參數指定用於打開從節點的選項。 name參數指定用於打開主節點的主數據庫的名稱。 secondary_path參數指向從節點存儲其信息日志的目錄。 dbptr是與打開的從節點相對應的out-arg【外部指針】該指針指向一個堆中數據庫,用戶應在使用后將其刪除。 目前不支持WAL追蹤【實時從節點】,但很快就會有。 |
OpenAsSecondary | 上面的方式會以默認列族打開,而這個會指定列族的方式打開從節點,多了一個參數就是column_families,這個參數指定要打開的列族。【所謂從節點可以以MVCC的多版本控制鏈來理解】 |
Open | 以列族打開數據庫,用參數和上面的區分 實際上在進入代碼研究之后可以發現列族不管你指不指定都必須有,不輸入的話就是默認的列族。 db_options指定數據庫特定的選項 column_families是數據庫中所有列族的向量,包含列族名稱和選項。 ->可以用ListColumnFamilies()來獲得所有列族的列表。也可以用只讀的方式打開部分列族。 默認的列族名為default,存儲在rocksdb::kDefaultColumnFamilyName. 如果沒問題的話,返回時句柄的大小將與column_families相同-->handles [i]將是用於對列族column_family [i]進行操作的句柄。 用這種函數打開的數據庫要刪除的話需要用DestroyColumnFamilyHandle()來刪除所有句柄。 |
Resume | 數據庫恢復操作,與最下面的數據庫修復操作不同,這個是針對備份與主存的。 |
Close | 關閉數據庫,包括釋放資源,清理文件等操作。為了防止意外,此方法應該在析構函數之前調用,並且若數據庫中還有沒釋放的閃照的話會返回失敗。 |
ListColumnFamilies | 這個方法會將打開指定參數名的數據庫,並通過column_families參數返回該數據庫中所有列族的列表。 |
CreateColumnFamily | 創建column_family並通過參數handle返回列族的句柄,通過status返回是否成功。 |
CreateColumnFamilies | 批量創建具有相同列族選項設置的列族。該函數可能會出現部分成功部分失敗的情況,成功的狀態會保留。 |
CreateColumnFamilies | 這個也是批量創建列族的,與上面不同的是上面的是全部相同屬性的列族,傳入的參數是字符串作為列族名。而這個通過列族描述符傳入,每個列族屬性都可能不同。 |
DropColumnFamily | 通過句柄指針刪除一個列族,此調用僅在mainfest中記錄一個刪除記錄,並防止刷新和壓縮列族。 |
DropColumnFamily | 批量刪除列族,此調用僅在mainfest中記錄一個刪除記錄,並防止刷新和壓縮列族。如果發生錯誤,請求可能會部分成功。用戶可以調用ListColumnFamilies來檢查結果。 |
DestroyColumnFamilyHandle | 關閉由column_family句柄指定的列族,並銷毀指定的列族句柄,以避免重復刪除。默認情況下,此調用將刪除列族句柄。注意:請使用此方法關閉列族而不是直接刪除列族句柄。 |
Put | kv存儲最基礎的操作之一,Slice格式的輸入,通過參數判斷是否指定列族,最后會以write_batch的形式寫入。更新操作也是通過Put來實現的。 |
Delete | kv存儲最基礎的操作之一,通過key刪除,如果key不存在也不會報錯,因為其本質上來說也是插入操作,Put的key帶有delete標記,在后續的compaction中會刪除掉前面的內容。 |
SingleDelete | 通過key刪除.要求key存在並且未被覆蓋。如果key不存在也不會報錯。如果key被overwrite(更新)了,那么調用這個會返回undefined,自從上次對該key調用SingleDelete()以來,只有該key只有一個Put()時,SingleDelete()才能正確運行。【庫內只允許一條記錄】-->刪除方法只刪除最新的,所以不能有多個記錄。當前,此功能是針對非常特定的工作負載的實驗性性能優化。調用者應確保SingleDelete僅用於未使用Delete()刪除【因為delete本質也是put】或未使用Merge()寫入的key。將SingleDelete操作與Deletes和Merges混合使用會導致不確定的行為。 |
DeleteRange | 按range:"begin_key", "end_key"刪除數據,但在生產實踐中一般不用這個。 原因:1.在內存表中累積許多范圍的邏輯刪除將降低讀取性能。(可以通過偶爾手動flush來避免這種情況。)2.在存在范圍邏輯刪除的情況下限制打開文件的最大數量會降低讀取性能。(為避免此問題,請盡可能將max_open_files設置為-1。也就是不限制。) |
Merge | Merge操作,此操作簡單來說就是rocksdb對於對已存在數據庫中的value進行追加的一個操作,比如使key1對應的value->hello變成helloworld。對這個操作進行的算法優化。此操作包括‘讀-改-寫’三個步驟。打開DB時,此操作的語義由用戶提供的merge_operator決定,實際上是決定其在后來的compaction過程中的合並方式。 |
Write | 將指定的更新應用到數據庫。如果‘updates’不包含更新,但options.sync = true【是否同步】,WAL仍將同步。 |
Get | kv存儲最基礎的操作之一,按key查找,不影響value。找不到返回Status::IsNotFound(),其他錯誤會返回其他Status。Get操作首先在內存中的表進行查詢(首先是緩存,然后是memtable等內存表),在查詢無果后會向下面的持久化存儲LSM-tree進行逐層查詢。 |
GetMergeOperands | 返回與鍵對應的所有合並操作數。operands【操作數】,這里是指對步驟進行拆解后需要的操作的數量 |
MultiGet | 顧名思義,一次性get多個,以參數來看是以向量作為數組傳遞Slice格式的參數。如果keys [i]在數據庫中不存在,則第i個返回的狀態將為Status :: IsNotFound()為true的狀態,並且(* values)[i]將被設置為某個任意值(通常就是 “”)。否則,第i個返回的狀態將具有Status :: ok()為true,並且(* values)[i]將存儲與keys [i]關聯的值。 |
MultiGet | 重載的MultiGet API通過在讀取路徑中進行批處理操作來提高性能,從而提高效率。但僅支持具有完整過濾器的基於block的表格式。 |
KeyMayExist | 用於判斷一個key是否存在,如果key在數據庫中不存在,則返回false,否則返回true。如果調用者想在內存中找到key時獲取value,則必須設置“value_found”為true。【默認false】與調用DB::Get()相比,這個方法更加輕量【消耗資源少(why:IO少了)】。 |
NewIterator | 創建迭代器,返回基於堆的數據庫迭代器。NewIterator()的結果最初是無效的(調用者必須在使用迭代器之前在迭代器上調用Seek方法之一)。如果不是長時間使用,調用者請刪除迭代器。在刪除此數據庫之前,應刪除返回的迭代器。若是只傳入讀選項的話,會對默認列族操作,傳入列族指針或是列族數組的話可以跨列族操作。另外,迭代器是堆分配的,需要在刪除數據庫之前將其刪除。 |
GetSnapshot | 返回當前數據庫狀態的句柄【快照】,使用此句柄創建的迭代器都將觀察當前數據庫狀態的穩定快照。當不再需要快照時,調用者必須調用ReleaseSnapshot(result)來釋放快照。如果數據庫無法進行快照或不支持快照,則將返回nullptr。 |
ReleaseSnapshot | 釋放快照,注意釋放后請不要再次建立快照。 |
參數
結構體Propertiy里包含了所有有效的屬性參數,這些參數通過GetProperties()獲取,這些屬性能在多維度反應數據庫當時的運行狀態。當然,底層的具體架構分布是不顯示的,要是想了解的話【以db_bench為例】可以在系統的tmp文件夾里找到rocksdb開頭的文件夾,在里面可以看到運行日志,具體的sst文件以及數據庫參數選項的設置之類的東西,建議了解了解。其中數據庫參數選項(options)的設置很大程度上決定了數據庫的發揮,參數可以在相關文件中修改【不推薦】,也可以在運行時調用相關接口進行修改,或者在運行數據庫時作為外部參數傳入。
kNumFilesAtLevelPrefix |
返回包含文件在第幾層的字符串,用ASCII表示。 |
kCompressionRatioAtLevelPrefix |
返回包含在第N層的壓縮率的字符串,用ASCII表示。在這里壓縮率被認為是-未壓縮的數據大小/壓縮的文件大小。沒有文件的話返回"-1.0"。 |
kStats |
返回多行字符串,其中包含kCFStats描述的數據,后跟kDBStats描述的數據。 |
kSSTables |
返回總結當前SST文件的多行字符串 |
kCFStats |
相當於 "rocksdb.cfstats-no-file-histogram" 和"rocksdb.cf-file-histogram" 加起來. 具體見后面的描述【histogram直方圖】 |
kCFStatsNoFileHistogram |
返回一個多行字符串,該字符串在db的生命周期(“ L <n>”)內具有每層的常規列族統計信息,在db的生命周期(“ Sum”)內進行聚合,並在自上次檢索以來的時間間隔(“ Int”)進行聚合 。它還可以用於以映射的格式返回統計信息。在這種情況下,每個級別以及“sum”都將有一對字符串組成雙精度數組。檢索這種形式的統計信息時,“int”統計信息將不會受到影響。 |
kCFFileHistogram |
輸出每層讀取了多少文件,以及單個請求的延遲的直方圖。 |
kDBStats |
返回包含常規數據庫統計信息的多行字符串,該統計信息既是累積的(在數據庫的生命周期內),又是間隔的(從上一次檢索kDBStats開始)。 |
kLevelStats |
返回多行字符串,其中包含每層的文件數和每個級別的總大小(MB)。 |
kNumImmutableMemTable |
返回尚未flush的immutable memtables數量。 |
kNumImmutableMemTableFlushed |
返回已經准備好flush的immutable memtables數量。 |
kMemTableFlushPending |
如果memtable flush掛起,則返回1; 否則,返回0。 |
kNumRunningFlushes |
返回正在flush的table的數量 |
kCompactionPending |
如果至少有一個compaction正在掛起,則返回1,否則0 |
kNumRunningCompactions |
返回正在compaction的數量 |
kBackgroundErrors |
返回后台錯誤的統計 |
kCurSizeActiveMemTable |
返回活動的memtable的近似大小(字節) |
kCurSizeAllMemTables |
返回活動的memtable和未flush的immutable memtable的近似大小(字節)。 |
kSizeAllMemTables |
返回活動的memtable,未flush和已flush的immutable memtable的近似大小(字節)。 |
kNumEntriesActiveMemTable |
返回活動memtable中的條目總數。 |
kNumEntriesImmMemTables |
返回未flush的immutable memtable中的條目總數。 |
kNumDeletesActiveMemTable |
返回活動memtable中刪除條目的總數。 |
kNumDeletesImmMemTables |
返回未flush的immutable memtable中刪除條目的總數。 |
kEstimateNumKeys |
返回memtable和未flush的immutable memtable和持久化存儲中的總鍵的估計數量。 |
kEstimateTableReadersMem |
返回用於讀取SST表的估計內存,不包括塊緩存中使用的內存(例如過濾器和索引塊)。 |
kIsFileDeletionsEnabled |
如果啟用了刪除過時的文件,則返回0,否則,返回一個非零數字。 |
kNumSnapshots |
返回數據庫內沒釋放的閃照的數量 |
kOldestSnapshotTime |
返回表示最舊的未發布快照的Unix時間戳的數字。 |
kNumLiveVersions |
返回現存的version數。 “version”是一個內部數據結構,細節在version_set.h里面更多的現存的版本通常意味着更多的SST文件沒有被刪除(來自迭代器或未完成的壓縮)。 |
kCurrentSuperVersionNumber |
返回當前LSM版本號它是一個uint64_t整數,在LSM樹發生任何更改后遞增。重新啟動數據庫后,該號碼不會保留,從0開始。 |
kEstimateLiveDataSize |
返回以字節為單位的實時數據量的估計值 |
kMinLogNumberToKeep |
返回應保留的日志文件的最小日志數 |
kMinObsoleteSstNumberToKeep |
返回保留過時的SST的最小文件號。如果可以刪除所有過時的文件,則將返回`uint64_t`的最大值。 |
kTotalSstFilesSize |
返回所有SST文件的總大小(字節)。如果文件太多,可能會降低在線查詢的速度。 |
kLiveSstFilesSize |
返回屬於最新LSM樹的所有SST文件的總大小(字節)。 |
kBaseLevel |
返回將L0數據壓縮到的層數 |
kEstimatePendingCompactionBytes |
返回估計的重寫壓縮總數,以使所有級別降至目標大小以下。不適用於除基於層以外的其他壓縮。 |
kAggregatedTableProperties |
返回目標列族的聚合表屬性的字符串表示形式。 |
kAggregatedTablePropertiesAtLevel |
和前面的一樣,但只針對第N層 |
kActualDelayedWriteRate |
返回當前的實際延遲寫入率。0表示沒有延遲。 |
kIsWriteStopped |
判斷寫入狀態,如果寫入已停止,則返回1。 |
kEstimateOldestKeyTime |
返回數據庫中最舊的密鑰時間戳的估計值。目前僅適用於FIFO壓縮中,且要求compaction_options_fifo.allow_compaction = false。 |
kBlockCacheCapacity |
返回塊緩存容量 |
kBlockCacheUsage |
返回駐留在塊緩存中的條目的內存大小 |
kBlockCachePinnedUsage |
返回被掛起【固定】【pinned】的kv對的內存大小。 |
kOptionsStatistics |
返回對options.statistics的描述,為多行字符串 |
接下來是有關屬性的函數:
GetProperty |
數據庫實現可以通過此方法導出有關其狀態的屬性。如果“屬性”是此數據庫實現可以理解的有效屬性(有關有效屬性,請參見上面的屬性結構) |
GetMapProperty |
同上,獲得屬性及其相應的映射關系 |
GetIntProperty |
和上面的GetProperty()類似,但僅適用於返回值為整數的屬性子集。 |
GetAggregatedIntProperty |
與 GetIntProperty()相同,但是此函數返回所有列族的聚合int屬性。 |
ResetStats |
重置數據庫和所有列族的內部統計信息。請注意,這不會重置options.statistics,因為它不屬於數據庫 |
GetApproximateSizes |
這個返回的是實際上大致的大小,如果用戶數據壓縮十倍,則返回的大小將是相應用戶數據大小的十分之一。 |
GetApproximateMemTableStats |
該方法與GetApproximateSizes相似,不同的是它返回內存表中的記錄的大致數量。 |
CompactRange |
壓縮鍵范圍[* begin,* end]的基礎存儲。實際壓縮間隔可能是[* begin,* end]的超集。特別是刪除和覆蓋的版本將被丟棄,並對數據進行重新排列以減少訪問數據所需的操作成本。通常,只有對基礎有一定了解的用戶才能調用此操作。特別的,begin==nullptr 視為數據庫中所有key之前的key,end==nullptr 視為數據庫中所有key之后的key。因此,以下調用將壓縮整個數據庫:db->CompactRange(options, nullptr, nullptr); 請注意,在壓縮整個數據庫之后,所有數據均被下推到包含任何數據的最后一級。如果壓縮后的總數據大小減小,則該級別可能不適用於存儲所有文件。在這種情況下,客戶端可以將options.change_level設置為true,以將文件移回能夠容納數據集的最小級別或給定級別(由非負options.target_level指定)。 |
SetOptions/SetDBOptions |
顧名思義,對數據庫選項進行設置,不在乎先后順序,只需將內容以vector數組的形式傳入。 |
CompactFiles |
CompactFiles()輸入由文件編號指定的文件列表,並將其壓縮到指定層。該行為與CompactRange()的不同之處在於CompactFiles()使用CURRENT線程執行壓縮作業。也就是‘立即進行’。 |
PauseBackgroundWork |
暫停功能,該功能將一直等到所有當前正在運行的后台進程完成,返回后,將不會運行任何后台進程(compaction,batch,flush之類的操作),直到調用ContinueBackgroundWork |
ContinueBackgroundWork |
繼續整個數據庫的運行,由於停止之前就是將正在運行的后台任務運行完才暫停的,所以不會有任務進行到一半接着來的情況。 |
EnableAutoCompaction |
如果先前禁用了給定的列族,此功能將啟用它們的自動壓縮。【咋禁用的:通過SetOptions()API將disable_auto_compactions設置為‘true’】 |
DisableManualCompaction EnableManualCompaction |
開啟和關閉手動compaction,很明顯,禁用以后就不能用戶主動調用compaction操作了。實際上若是對於rocksdb了解不足的話並不建議開啟。 |
NumberLevels |
獲取此數據庫使用的層數。【當前最高層數】 |
MaxMemCompactionLevel |
如果新的壓縮內存表不產生重疊,則將其推送到的最高層。 |
Level0StopWriteTrigger |
level0中將停止寫入的文件數。不給列族參數的話就對默認列族操作。 |
GetName |
獲取數據庫名字 -- 與提供給DB :: Open()的參數完全相同的名稱 |
GetEnv |
從數據庫獲取環境對象,rocksdb和leveldb一樣將系統環境以對象的形式處理。 |
GetOptions |
獲取我們對數據庫設置的選項。 |
Flush |
flush操作,也是rocksdb和leveldb的區別之一,將所有memtable內容flush到磁盤,自動flush開啟時會自動flush單個列族的內容,要是想flush多個列族,需要用Flush(options, column_families). |
FlushWAL |
將WAL內存緩沖區刷新到文件.如果sync為true,則此后將調用SyncWAL。 |
SyncWAL |
同步WAL。 請注意,后面帶有SyncWAL()的Write()與帶有sync = true的Write()並不完全相同:在后一種情況下,直到完成同步,更改才可見。當前僅在“選項”中的allow_mmap_writes = false時有效。 |
LockWAL/ UnlockWAL |
對WAL加鎖,解鎖。上鎖后flushWAL的內容。 |
SequenceNumber |
最近轉換的序列號,每次實際的key傳入都會使該值加一。 |
SetPreserveDeletesSequenceNumber |
指示數據庫保留序列號> =傳遞的seqnum的刪除。如果DBOptions.preserve_deletes設置為false,則無效。該函數假定用戶使用單調遞增的seqnums調用此函數(否則我們不能保證某些特定的刪除操作已被處理);數據成功更新后返回true,如果用戶嘗試調用seqnum <=當前值,則返回false。 |
DisableFileDeletions |
防止文件刪除。 壓縮將繼續發生,但是不會刪除任何過時的文件。調用這玩意多次和調用這玩意一次的效果是一樣的。 |
EnableFileDeletions |
允許壓縮刪除過時的文件。 如果force==true,則即使之前多次調用DisableFileDeletions(),對EnableFileDeletions()的調用也將確保在調用之后啟用文件刪除。 如果force == false,則EnableFileDeletions僅在被調用至少與DisableFileDeletions()相同的次數之后才啟用文件刪除,使兩個線程可以同時調用兩個方法而無需同步-即僅在兩個線程都調用EnableFileDeletions()之后,才啟用文件刪除 |
GetLiveFiles |
GetLiveFiles后跟GetSortedWalFiles可以生成無損備份 --檢索數據庫中所有文件的列表。 這些文件是相對於dbname的,不是絕對路徑。盡管是相對路徑,但文件名以“ /”開頭。 manifest文件的有效大小在manifest_file_size中返回。 manifest是一個不斷增長的文件,但是只有manifest_file_size指定的部分對此快照有效。 將flush_memtable設置為true會在記錄【recording】活動文件之前進行刷新。當我們不想等待刷新時,可以將flush_memtable設置為false,因為刷新可能需要等待壓縮才能完成,需要花費不確定的時間。 如果您有多個列族,即使flush_memtable為true,您仍然需要在GetLiveFiles之后調用GetSortedWalFiles,以補償在刷新其他列系列時到達已經刷新的列系列的新數據 |
GetSortedWalFiles |
首先檢索最早文件的所有wal文件的排序列表 |
GetCurrentWalFile |
檢索有關當前wal文件的信息 請注意,該調用之后日志可能已經滾動,在這種情況下current_log_file不會指向當前日志文件。 另外,為了優化起見,current_log_file-> StartSequence將始終設置為0 |
GetCreationTimeOfOldestFile |
檢索數據庫中最舊文件的創建時間。僅當max_open_files = -1時,此API才有效,否則返回的Status為Status :: NotSupported()使用提供給數據庫的環境設置文件創建時間。 如果數據庫是從非常老的發行版創建的,則SST文件可能不具有file_creation_time屬性,甚至在移至更新發行版之后,也有可能某些文件從未壓縮過並且可能不具有file_creation_time屬性。 在這兩種情況下,file_creation_time都被視為0,這意味着該API將返回creation_time = 0,因為時間戳不會低於0。 |
GetUpdatesSince |
注意:此API尚未與WritePrepared事務保持一致。 將iter設置為位於包含seq_number的寫批處理中的迭代器。如果序列號不存在,則在請求的seq_no之后的第一個可用seq_no處返回迭代器。如果迭代器有效,則返回Status :: OK必須將WAL_ttl_seconds或WAL_size_limit_MB設置為較大的值才能使用此api,否則WAL文件將被積極清除,並且迭代器可能會在讀取更新之前變得無效。 |
DeleteFile |
從db目錄中刪除文件名,並更新內部狀態以反映該狀態。 ---僅支持刪除sst和日志文件。 --- “名稱”必須是相對於db目錄的路徑。 例如。 000001.sst,/ archive / 000003.log |
GetLiveFilesMetaData |
返回所有表文件的列表及其level,開始key和結束key |
GetColumnFamilyMetaData |
獲取數據庫指定列系列的元數據,不指定列族的話會獲取默認列族的元數據。 |
IngestExternalFile |
IngestExternalFile()會將外部SST文件加載到數據庫中,支持兩種主要模式: (1)新文件中的重復密鑰將覆蓋現有密鑰(默認) (2)重復的鍵將被跳過(設置為ingest_behind = true) 在第一種模式下,我們將嘗試找到文件可以容納的最低level,並將文件提取到該level。key范圍與內存表key范圍重疊的文件將要求我們在提取文件之前先刷新該內存表。 在第二種模式下,我們將始終在最底層level進行攝取 另: (1) 可以使用SstFileWriter創建外部SST文件。(2) 即使文件壓縮與級別壓縮不匹配,我們也會嘗試將文件提取到最低級別 (3) 如果將IngestExternalFileOptions-> ingest_behind設置為true,我們總是在最底層進行攝取,為此,應該保留該最低層(請參閱DBOPtions :: allow_ingest_behind標志)。 |
IngestExternalFiles |
IngestExternalFiles()將提取多個列族的文件,並將結果自動記錄到MANIFEST中。如果此函數返回OK,則必須成功完成所有列族的提取。如果此函數返回其他的,或者進程崩潰,則恢復后,非文件將被提取到數據庫中。 注意,在執行此功能期間,應用程序可能會觀察到混合狀態。如果用戶使用迭代器對列族執行范圍掃描,則一個列族上的迭代器可能返回提取的數據,而另一列族上的迭代器則返回舊數據。 用戶可以使用快照來獲得一致的數據視圖。如果您的數據庫使用此API提取了多個SST文件,即args.size()> 1,則RocksDB 5.15和更早版本將無法打開它。 要求:每個arg對應於一個不同的列族:即,對於0 <= i <j <len(args),args [i] .column_family!= args [j] .column_family。 |
CreateColumnFamilyWithImport |
CreateColumnFamilyWithImport()將使用column_family_name創建一個新的列族,並將元數據中指定的外部SST文件導入該列族。 (1) 可以使用SstFileWriter創建外部SST文件。 (2) 可以從現有數據庫中的特定列族導出外部SST文件。 import_options中的Option指定是復制還是移動外部文件(默認為copy)。 如果選項指定復制,則在external_file_path中管理文件是調用者的責任。當option指定移動時,調用將確保成功返回時刪除external_file_path中的指定文件,並且不會在任何錯誤返回時修改文件。返回錯誤時,返回的列族句柄將為nullptr。成功返回時將出現ColumnFamily,而錯誤返回時將不存在。在此調用過程中,任何崩潰都可能存在ColumnFamily。 |
AddFile |
直接導入文件的方式,這種方式已經被棄用,請使用上面的方式。 |
GetPropertiesOfAllTables |
獲得所有表的特征描述 |
SuggestCompactRange |
參數為列族名和起始的key,可以獲得建議的壓縮范圍 |
StartTrace/EndTrace |
開始/停止數據庫的跟蹤操作 |
StartBlockCacheTrace EndBlockCacheTrace |
開始/停止跟蹤塊緩存訪問 |
GetStatsHistory |
給定一個時間范圍[start_time,end_time),設置一個StatsHistoryIterator來訪問統計歷史記錄。 |
TryCatchUpWithPrimary |
使備份盡可能的與主存同步 |
至此,class DB的內容結束,下面是有關數據庫的兩個函數
DestroyDB |
銷毀指定數據庫的內容。使用此方法時要非常小心。 |
RepairDB |
如果無法打開數據庫,則可以嘗試調用此方法以盡可能多地修復數據庫的內容。某些數據可能會丟失,因此在包含重要信息的數據庫上調用此函數時要小心。使用此API,我們將警告並跳過與column_families中未指定的列系列相關的數據。 |
db.h文件的內容到此結束,主要有數據庫整體的各種操作,包括列族相關,節點相關,數據庫基礎相關,以及rocksdb特有的一些操作。另外還可以實時的查看當前數據庫的運行狀態,通過GetProperties獲取相關返回值。最后還有一些數據庫通用的操作的rocksdb版本,不得不說rocksdb的功能實現的有點全面的過分了。