-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
數(shù)據(jù)庫快照查詢(數(shù)據(jù)庫快照查詢怎么用)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于數(shù)據(jù)庫快照查詢的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、怎樣操作leveldb數(shù)據(jù)庫,實(shí)現(xiàn)增刪改查
LevelDB 簡介
一、LevelDB入門
LevelDB是Google開源的持久化KV單機(jī)數(shù)據(jù)庫,具有
很高的隨機(jī)寫,順序讀/寫性能,但是隨機(jī)讀的性能很一般,也就是說,LevelDB很適合應(yīng)用在查詢較少,而寫很多的場景。LevelDB應(yīng)用了LSM
(Log Structured Merge)
策略,lsm_tree對索引變更進(jìn)行延遲及批量處理,并通過一種類似于歸并排序的方式高效地將更新遷移到磁盤,降低索引插入開銷,關(guān)于LSM,本文在后
面也會簡單提及。
根據(jù)LevelDB官方網(wǎng)站的描述,LevelDB的特點(diǎn)和限制如下:
特點(diǎn):
1、key和value都是任意長度的字節(jié)數(shù)組;
2、entry(即一條K-V記錄)默認(rèn)是按照key的字典順序存儲的,當(dāng)然開發(fā)者也可以重載這個排序函數(shù);
3、提供的基本操作接口:Put()、Delete()、Get()、Batch();
4、支持批量操作以原子操作進(jìn)行;
5、可以創(chuàng)建數(shù)據(jù)全景的snapshot(快照),并允許在快照中查找數(shù)據(jù);
6、可以通過前向(或后向)迭代器遍歷數(shù)據(jù)(迭代器會隱含的創(chuàng)建一個snapshot);
7、自動使用Snappy壓縮數(shù)據(jù);
8、可移植性;
限制:
1、非關(guān)系型數(shù)據(jù)模型(NoSQL),不支持sql語句,也不支持索引;
2、一次只允許一個進(jìn)程訪問一個特定的數(shù)據(jù)庫;
3、沒有內(nèi)置的C/S架構(gòu),但開發(fā)者可以使用LevelDB庫自己封裝一個server;
LevelDB本身只是一個lib庫,在源碼目錄make編譯即可,然后在我們的應(yīng)用程序里面可以直接include leveldb/include/db.h頭文件,該頭文件有幾個基本的數(shù)據(jù)庫操作接口,下面是一個測試?yán)樱?/p>
#include <iostream>
#include <string>
#include <assert.h>
#include "leveldb/db.h"
using namespace std;
int main(void)
{
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
// open
leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db);
assert(status.ok());
string key = "name";
string value = "chenqi";
// write
status = db->Put(leveldb::WriteOptions(), key, value);
assert(status.ok());
// read
status = db->Get(leveldb::ReadOptions(), key, &value);
assert(status.ok());
cout<<value<<endl;
// delete
status = db->Delete(leveldb::WriteOptions(), key);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(),key, &value);
if(!status.ok()) {
cerr<<key<<" "<<status.ToString()<<endl;
} else {
cout<<key<<"==="<<value<<endl;
}
// close
delete db;
return 0;
}
上面的例子演示了如何插入、獲取、刪除一條記錄,編譯代碼:
g++ -o test test.cpp libleveldb.a -lpthread -Iinclude
執(zhí)行./test后,會在/tmp下面生成一個目錄testdb,里面包含若干文件:
------------------------------------------------------------
LevelDB
是google開源的一個key-value存儲引擎庫,類似于開源的Lucene索引庫一樣。其他的軟件開發(fā)者可以利用該庫做二次開發(fā),來滿足定制需
求。LevelDB采用日志式的寫方式來提高寫性能,但是犧牲了部分讀性能。為了彌補(bǔ)犧牲了的讀性能,一些人提議使用SSD作為存儲介質(zhì)。
對于本地化的Key-value存儲引擎來說,簡單的使用一般都分成三個基本的步驟:(1)打開一個數(shù)據(jù)庫實(shí)例;(2)對這個數(shù)據(jù)庫實(shí)例進(jìn)行插入,修改和查詢操作;(3)最后在使用完成之后,關(guān)閉該數(shù)據(jù)庫。下面將詳細(xì)討論該三個步驟:
一、打開一個數(shù)據(jù)庫實(shí)例
一個leveldb數(shù)據(jù)庫有一個對應(yīng)一個文件系統(tǒng)目錄的名字。該數(shù)據(jù)庫的所有內(nèi)容都存儲在這個目錄下。下面的代碼描述了怎樣打開一個數(shù)據(jù)庫或者建立一個新的數(shù)據(jù)庫。
#include <assert.h>
#include "leveldb/db.h"
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db);
assert(status.ok());
如果打開已存在數(shù)據(jù)庫的時候,需要拋出錯誤。將以下代碼插在leveldb::DB::Open方法前面:
options.error_if_exists = true;
二、對數(shù)據(jù)庫的簡單讀、寫操作
LevelDB提供了Put,Delete和Get三個方法對數(shù)據(jù)庫進(jìn)行修改和查詢。例如,下面的代碼片段描述了怎樣將key1對應(yīng)的value值,移到key2對應(yīng)的值。
std::string value;
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);
if(s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value);
if(s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);
三、關(guān)閉數(shù)據(jù)庫
在對數(shù)據(jù)庫進(jìn)行了一系列的操作之后,需要對數(shù)據(jù)庫進(jìn)行關(guān)閉。該操作比較簡單:
... open the db as described above...
... do something with db ...
delete db;
上面對levelDB的簡單使用做了基本的介紹,接下來就是如何自己寫一個完成并且能運(yùn)行的例子。
1、下載源碼 git clone https://code.google.com/p/leveldb/
2、編譯源碼 cd leveldb && make all
3、編寫test.cpp
#include <assert.h>
#include <string.h>
#include <leveldb/db.h>
#include <iostream>
int main(){
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db);
assert(status.ok());
//write key1,value1
std::string key="key";
std::string value = "value";
status = db->Put(leveldb::WriteOptions(), key,value);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key, &value);
assert(status.ok());
std::cout<<value<<std::endl;
std::string key2 = "key2";
//move the value under key to key2
status = db->Put(leveldb::WriteOptions(),key2,value);
assert(status.ok());
status = db->Delete(leveldb::WriteOptions(), key);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(),key2, &value);
assert(status.ok());
std::cout<<key2<<"==="<<value<<std::endl;
status = db->Get(leveldb::ReadOptions(),key, &value);
if(!status.ok()) std::cerr<<key<<" "<<status.ToString()<<std::endl;
else std::cout<<key<<"==="<<value<<std::endl;
delete db;
return 0;
}
4、編譯鏈接 g++ -o test test.cpp ../leveldb/libleveldb.a -lpthread -I../leveldb/include
注意libleveldb.a 和leveldb include的路徑。
5、運(yùn)行結(jié)果./test:
value
key2===value
key NotFound:
二、linux中的快照技術(shù)的原理是什么
快照就是一種數(shù)據(jù)庫技術(shù)。快照,其本質(zhì)類似于數(shù)據(jù)庫的照片,也就是在創(chuàng)建快照的時間點(diǎn)給數(shù)據(jù)庫拍個照放在那兒。但是這個照片是一個新的數(shù)據(jù)庫,可以應(yīng)用SQL語句??煺諗?shù)據(jù)庫里的數(shù)據(jù)是不變的.創(chuàng)建快照后,系統(tǒng)會對原數(shù)據(jù)庫的所有數(shù)據(jù)頁做個標(biāo)識,如果數(shù)據(jù)頁在創(chuàng)建快照后被修改,會復(fù)制一個數(shù)據(jù)頁出來,沒有修改的數(shù)據(jù)頁則不會有快照。因此快照存在的時間越長,要維護(hù)的數(shù)據(jù)頁就越多,系統(tǒng)的壓力也越來越大。所以不能用快照來替代備份,因?yàn)閭浞葜皇且粋€bak文件,它不是數(shù)據(jù)庫,只有通過還原操作才能對它進(jìn)行查詢。
三、Oracle數(shù)據(jù)庫 ORA-01555 快照過舊
用戶user1對表進(jìn)行了更新操作,用戶user2在user1還沒有進(jìn)行提交前讀表中數(shù)據(jù),而且是大批量的讀取(打個比方:耗時3分鐘)而在這3分鐘內(nèi)user1進(jìn)行了提交操作,那又會產(chǎn)生什么影響呢?這個時候怎么保證讀寫一致性呢?這個時候DBMS就要保證有足夠大的undo表空間來存放修改前的數(shù)值,,以保證user2讀取的數(shù)據(jù)是修改前的一致數(shù)據(jù).然后下次再讀取時候就是更新后的數(shù)據(jù)了.
ora-01555快照過舊就是因?yàn)閡ndo空間不夠大,其中一部分undo數(shù)據(jù)被覆蓋了,用戶無法獲得修改前的數(shù)據(jù)。
undo數(shù)據(jù)分為三種:
活動的undo:未提交事務(wù)的undo數(shù)據(jù),這些undo數(shù)據(jù)永遠(yuǎn)不能覆蓋,用于回滾rollback事務(wù)。
過期的undo:已提交事務(wù)的undo數(shù)據(jù),這些undo數(shù)據(jù)可以覆蓋。
未過期的undo:事務(wù)已提交,但事務(wù)提交前,有些查詢正在進(jìn)行,它要讀取的是提交前的數(shù)據(jù),這部分?jǐn)?shù)據(jù)就是未過期數(shù)據(jù)。如果這部分undo數(shù)據(jù)被覆蓋了,就會發(fā)生ora-01555錯誤。
一個解決方法是,指定undo表空間參數(shù)UNDO_TABLESPACE,并將undo空間管理方法設(shè)置成自動擴(kuò)展:UNDO_MANAGEMENT=AUTO。
這種方法可能產(chǎn)生的結(jié)果是:
因?yàn)閡ndo表空間裝了太多未過期(unexpired)的undo數(shù)據(jù),新的transaction無法向其中寫入undo數(shù)據(jù),這時transaction就會發(fā)生ORA-30036錯誤。
四、復(fù)制,鏡像,快照它們之間有什么區(qū)別
快照復(fù)制就是在某一時刻對出版數(shù)據(jù)進(jìn)行一次“照相”,生成一個描述出版數(shù)據(jù)庫中數(shù)據(jù)瞬時狀態(tài)的靜態(tài)文件,最后在規(guī)定時間將其復(fù)制到訂購者數(shù)據(jù)庫??煺諒?fù)制并不像事務(wù)復(fù)制那樣要不斷地監(jiān)視、跟蹤在出版數(shù)據(jù)庫中發(fā)生的數(shù)據(jù)變化,它所復(fù)制的內(nèi)容不是
INSERT、
UPDATE、
DELETE
語句(事務(wù)復(fù)制的特征),也不是僅限于那些被修改數(shù)據(jù)(合并復(fù)制的特征)。它實(shí)際上是對訂購數(shù)據(jù)庫進(jìn)行一次階段性的表刷新,把所有出版數(shù)據(jù)庫中的數(shù)據(jù)從源數(shù)據(jù)庫送至目標(biāo)數(shù)據(jù)庫,而不僅僅是那些發(fā)生了變化的數(shù)據(jù)。如果論文很大,那么要復(fù)制的數(shù)據(jù)就很多,因此對網(wǎng)絡(luò)資源需求較高,不僅要有較快的傳輸速度,而且要保證傳輸?shù)目煽啃浴?/p>
快照復(fù)制是最為簡單的一種復(fù)制類型,能夠在出版者和訂購者之間保證事務(wù)的潛在一致性??煺諒?fù)制通常使用在以下場合:不需要實(shí)時數(shù)據(jù)時,如在進(jìn)行決策支持、查詢靜態(tài)表信息時;只讀訂購者(訂購者不對出版數(shù)據(jù)進(jìn)行修改),并且不需要最近的數(shù)據(jù);使用立即更新訂購者時對數(shù)據(jù)庫的修改次數(shù)和數(shù)據(jù)量較少。
快照復(fù)制的執(zhí)行僅需要快照代理和分發(fā)代理??煺沾頊?zhǔn)備快照文件(包括出版表的數(shù)據(jù)文件和描述文件)并將其存儲在分發(fā)者的快照文件夾中,除此之外快照代理還要在分發(fā)者的分發(fā)數(shù)據(jù)庫中跟蹤同步作業(yè)。分發(fā)代理將在分發(fā)數(shù)據(jù)庫中的快照作業(yè)分發(fā)至訂購者服務(wù)器的目的表中。分發(fā)數(shù)據(jù)庫僅用于復(fù)制而不包括任何用戶表。
每一次快照代理執(zhí)行時,都要創(chuàng)建將被分發(fā)至訂購者的數(shù)據(jù)文件和描述文件(也稱為同步集合)。
鏡像就是鏡中的影像,是一模一樣的意思,系統(tǒng)鏡像也就是克隆系統(tǒng)
以上就是關(guān)于數(shù)據(jù)庫快照查詢相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
數(shù)據(jù)模式和數(shù)據(jù)模型的區(qū)別(數(shù)據(jù)模式和數(shù)據(jù)模型的區(qū)別和聯(lián)系)
抖店數(shù)據(jù)(抖店數(shù)據(jù)分析軟件)
開源大數(shù)據(jù)可視化工具(開源大數(shù)據(jù)可視化工具下載)_1
景觀設(shè)計(jì)詩情畫意案例(景觀設(shè)計(jì)詩情畫意案例分享)
猜你喜歡
蘋果手機(jī)有些網(wǎng)頁無法下拉(蘋果手機(jī)有些網(wǎng)頁無法下拉怎么回事)
世界創(chuàng)新型國家排名(世界創(chuàng)新型國家排名前十)
搜索資料常用的網(wǎng)站有哪些(搜索資料常用的網(wǎng)站有哪些)
資源的優(yōu)化配置(資源的優(yōu)化配置可以通過機(jī)制的優(yōu)化設(shè)計(jì)來促進(jìn))
光學(xué)哪個方向好就業(yè)(光學(xué)哪個方向就業(yè)薪資高)
怎樣運(yùn)營一個公眾號(怎樣運(yùn)營一個公眾號微信)