庫服務器可以具體為本發(fā)明實施例中的在線重建索引裝置。
[0046]請參閱圖1,圖1是本發(fā)明實施例提供的一種在線重建索引裝置的結構示意圖,用于執(zhí)行本發(fā)明實施例提供的在線重建索引的方法,如圖1所示,該在線重建索引裝置包括:至少一個處理器11,例如CPU,至少一個網絡接口 14或者其他用戶接口 13,存儲器15,至少一個通信總線12。通信總線12用于實現這些組件之間的連接通信。其中,用戶接口 13可選的可以包括USB接口以及其他標準接口、有線接口。網絡接口 14可選的可以包括W1-Fi接口以及其他無線接口。存儲器15可能包含高速RAM存儲器,也可能還包括非不穩(wěn)定的存儲器(non-volatile memory),例如至少一個磁盤存儲器。存儲器15可選的可以包含至少一個位于遠離前述處理器11的存儲裝置。
[0047]在一些實施方式中,存儲器15存儲了如下的元素,可執(zhí)行模塊或者數據結構,或者他們的子集,或者他們的擴展集:
[0048]操作系統151,包含各種系統程序,用于實現各種基礎業(yè)務以及處理基于硬件的任務;
[0049]應用模塊152,包含設備控制服務程序、設備識別服務程序等各種應用程序,用于實現各種應用業(yè)務。
[0050]具體地,處理器11用于調用存儲器15中存儲的程序,執(zhí)行以下操作:
[0051]接收在線重建索引請求,所述在線重建索引請求包含數據表的標識;根據所述在線重建索引請求,對所述數據表的標識對應的數據表加架構共享鎖;獲得閂鎖,通過所述閂鎖獲得所述數據表的結構控制權;在所述獲得閂鎖后,為所述數據表的原始索引預留影子索引存儲空間,分配影子索引的入口地址,在所述數據表的根頁上添加所述影子索引的入口地址;在完成在所述數據表的根頁上添加所述影子索引的入口地址后,釋放所述閂鎖;根據所述原始索引的數據,在所述影子索引存儲空間中創(chuàng)建影子索引;在完成在所述影子索引存儲空間中創(chuàng)建影子索引后,重新獲得Η鎖;在重新獲得Η鎖后,將所述數據表的根頁的索引入口地址更新為影子索引入口地址;在所述數據表的根頁的索引入口地址更新為影子索引入口地址后,釋放所述重新獲得的閂鎖和所述架構共享鎖。
[0052]上述技術方案中,所本發(fā)明實施例的方案在啟動在線重建索引時,無需加schema排它鎖,而改為先加上共享鎖,防止重建期間的DDL操作,數據庫服務器內部通過獲取到latch,使原始索引TI1瞬間靜止無并發(fā),在數據表T的root頁上添加影子索引的入口地址后,開始創(chuàng)建影子索引。在創(chuàng)建影子索引中,如果有事務操作,要加獨立的共享鎖,從而互不干擾。在創(chuàng)建影子索引完成后,首先獲取latch,搶得控制權,更改根頁的索引的入口地址,即影子索引被扶正,棄用原來的原始索引,完成切換。
[0053]請參閱圖2,圖2是本發(fā)明實施例提供的一種在線重建索引裝置的結構示意圖,用于執(zhí)行本發(fā)明實施例提供的在線重建索引的方法,如圖2所示,該在線重建索引裝置包括:
[0054]接收模塊21,用于接收在線重建索引請求,所述在線重建索引請求包含數據表的標識;鎖處理模塊22,用于根據所述在線重建索引請求,對所述數據表的標識對應的數據表加架構共享鎖,鎖處理模塊22,還用于獲得閂鎖,通過所述閂鎖獲得所述數據表的結構控制權;入口地址分配模塊23,用于在鎖處理模塊獲得閂鎖后,為所述數據表的原始索引預留影子索引存儲空間,分配所述影子索引的入口地址,在所述數據表的根頁上添加所述影子索引的入口地址;所述鎖處理模塊,還用于所述影子索引創(chuàng)建模塊完成在所述數據表的根頁上添加所述影子索引的入口地址后,釋放所述閂鎖;影子索引創(chuàng)建模塊24,用于根據所述原始索引的數據,在所述影子索引存儲空間中創(chuàng)建影子索引;所述鎖處理模塊,還用于所述影子索引創(chuàng)建模塊完成在所述影子索引存儲空間中創(chuàng)建影子索引后,重新獲得閂鎖;入口地址處理模塊25,用于所述鎖處理模塊重新獲得閂鎖后,將所述數據表的根頁的索引入口地址更新為影子索引入口地址;鎖處理模塊22,還用于所述入口地址處理模塊更新所述數據表的根頁的索引入口地址后,釋放所述重新獲得的閂鎖和所述架構共享鎖。
[0055]接收模塊21接收到數據客戶端發(fā)送的在線重建索引請求會后,將該在線重建索引請求發(fā)送給鎖處理模塊22,鎖處理模塊22接收到該在線重建索引請求后,根據在線重建索引請求,確認需要進行在線重建索引,此時根據該數據表的標識查詢到其對應的數據表,并核實數據表的加鎖情況,如果該數據表上無排它鎖,對數據表加共享鎖以及申請并獲得閂鎖,這樣就可以獲得線程控制權,從而可以實現創(chuàng)建影子索引,這里的共享鎖可以是schema級別的。入口地址分配模塊23,為所述數據表的原始索引分配影子索引存儲空間,此時影子索引存儲空間內容為空,分配所述影子索引的入口地址,在所述數據表的根頁上添加所述影子索引的入口地址,還需要在數據字典上添加原始索引的影子索引的入口地址,然后鎖處理模塊22就釋放円鎖;影子索引創(chuàng)建模塊24根據所述原始索引的數據,在所述影子索引存儲空間中創(chuàng)建影子索引,例如:將所述原始索引的數據復制到所述影子索引中,然后重新調整索引數據,成為一個簡潔層次少的索引。在完成在影子索引中重建所述原始索引后,鎖處理模塊22重新獲得閂鎖。在所述鎖處理模塊重新獲得閂鎖后,入口地址處理模塊25將所述數據表的根頁的索引入口地址更新為影子索引入口地址。鎖處理模塊22,在完成所述入口地址處理模塊在所述數據表的根頁的索引入口地址更新為影子索引入口地址后,釋放所述重新獲得的閂鎖和所述架構共享鎖。
[0056]如圖3所示,上述在線重建索引裝置,還包括:事務處理模塊26,用于接收對所述數據表的數據的更新請求,根據所述更新請求,對數據表的數據進行更新。也就是說,由于本發(fā)明避免使用了排它鎖,因此在在線重建索引過程中,仍然可以實現對數據表的數據的更新等DML操作。
[0057]如圖3所示,上述在線重建索引裝置,還包括:更新模塊27,用于在索引數據需要更新時,確定所述數據表的根頁中包含所述影子索引的入口地址,將需要更新的索引數據在所述原始索引和所述影子索引上進行更新。更新模塊可以實現當在線重建索引過程中,其它事務對該數據表進行更新所引起的索引數據的更新,可以將更新的索引數據同步添加到原始索引和影子索引中。
[0058]如圖3所示,上述在線重建索引裝置中的入口地址處理模塊25,具體用于將所述數據表的根頁上的索引入口地址更改為所述影子索引的入口地址,刪除所述原始索引的入口地址。通過更改根頁上的索引入口地址,可以完成在線重建索引,這樣以后新的事務訪問索引時,就會訪問到這個影子索引的入口地址,當原始索引的入口地址刪除后,這個影子索引的入口地址就為新的原始索引的入口地址了。
[0059]如圖3所示,上述在線重建索引裝置中的入口地址處理模塊25,具體用于將所述影子索引的入口地址修改為有效,刪除所述原始索引的入口地址。通過設置根頁上的索引入口地址為有效,可以完成在線重建索引,這樣以后新的事務訪問索引時,就會訪問到這個影子索引的入口地址,當原始索引的入口地址刪除后,這個影子索引的入口地址就為新的原始索引的入口地址了。
[0060]為了更清楚的說明本發(fā)明實施例,下面將詳細介紹所述在線重建索引裝置執(zhí)行上述實施例的操作過程。
[0061]圖4為本發(fā)明實施例在線重建索引方法實施例的流程圖,具體包括:
[0062]步驟401:接收在線重建索引請求,所述在線重建索引請求包含數據表的標識;
[0063]步驟402:根據所述在線重建索引請求,對所述數據表的標識對應的數據表加架構共享鎖,以及獲得R鎖,通過所述R鎖獲得所述數據表的結構控制權。
[0064]這樣就可以獲取到對數據表根頁的控制權。
[0065]步驟403:在獲得閂鎖后,為所述數據表的原始索引預留影子索引存儲空間,分配所述影子索引的入口地址,在所述數據表的根頁上添加所述影子索引的入口地址。
[0066]步驟404:在完成在所述數據表的根頁上添加所述影子索引的入口地址后,釋放所述閂鎖。
[0067]步驟405:根據所述原始索引的數據,在所述影子索引存儲空間中創(chuàng)建影子索引。
[0068]步驟406:在完成在所述影子索引存儲空間中創(chuàng)建影子索引后,重新獲得閂鎖。
[0069]步驟407:在重新獲得閂鎖后,將所述數據表的根頁的索引入口地址更新為影子索引入口地址。
[0070]步驟408:在所述數據表的根頁的索引入口地址更新為影子索引入口地址后,釋放所述重新獲得的閂鎖和所述架構共享鎖。
[0071]進一步的,還包括:接收對所述數據表的數據的更新請求,根據所述更新請求,對數據表的數據進行更新。
[0072]進一步的,在所述對數據表的數據進行更新后,還包括:當索引數據需要更新時,確定所述數據表的根頁中包含所述影子索引的入口地址,將需要更新的索引數據在所述原始索引和所述影子索引上進行更新。