HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    數(shù)據(jù)庫快照查詢(數(shù)據(jù)庫快照查詢怎么用)

    發(fā)布時間:2023-04-14 02:17:30     稿源: 創(chuàng)意嶺    閱讀: 144        

    大家好!今天讓創(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

    本文目錄:

    數(shù)據(jù)庫快照查詢(數(shù)據(jù)庫快照查詢怎么用)

    一、怎樣操作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ì)詩情畫意案例分享)

    杭州短視頻愛好(杭州短視頻愛好者群)