两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

數(shù)據(jù)庫間的數(shù)據(jù)遷移方法和系統(tǒng)的制作方法

文檔序號:6486665閱讀:203來源:國知局
數(shù)據(jù)庫間的數(shù)據(jù)遷移方法和系統(tǒng)的制作方法
【專利摘要】一種數(shù)據(jù)庫間的數(shù)據(jù)遷移方法,包括以下步驟:讀鎖源數(shù)據(jù)庫的從數(shù)據(jù)庫,記錄從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置;將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出至目標數(shù)據(jù)庫;讀鎖源數(shù)據(jù)庫,獲取所述更新位置之后源數(shù)據(jù)庫產(chǎn)生的更新,將所述更新同步到所述目標數(shù)據(jù)庫。上述方法中,只有在將上述更新位置之后源數(shù)據(jù)庫產(chǎn)生的所有更新同步到目標數(shù)據(jù)庫期間,業(yè)務不能訪問數(shù)據(jù)庫,而源數(shù)據(jù)庫的大部分數(shù)據(jù)已經(jīng)由從數(shù)據(jù)庫導出至目標數(shù)據(jù)庫,該期間更新的數(shù)據(jù)量較小,因而該期間花費的時間也較少,因此上述方法能減少業(yè)務中斷訪問數(shù)據(jù)庫的時間。此外,還提供一種數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng)。
【專利說明】數(shù)據(jù)庫間的數(shù)據(jù)遷移方法和系統(tǒng)
【【技術(shù)領域】】
[0001]本發(fā)明涉及數(shù)據(jù)庫技術(shù),特別地涉及一種數(shù)據(jù)庫間的數(shù)據(jù)遷移方法和系統(tǒng)。
【【背景技術(shù)】】
[0002]數(shù)據(jù)庫技術(shù)是信息系統(tǒng)的一項核心技術(shù),目前常用的數(shù)據(jù)庫類型有多種,例如,DB2、Oracle、SQL Server、mySQL等,各種類型的數(shù)據(jù)庫的功能側(cè)重點不同,都具體有自己的優(yōu)勢。例如,mySQL是一個小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,MySQL被廣泛地應用在Internet上的中小型網(wǎng)站中。
[0003]為了保證數(shù)據(jù)的存儲安全,主數(shù)據(jù)庫一般都具有一個以上用于備份的從數(shù)據(jù)庫。主從數(shù)據(jù)庫的版本一般是相同的。以MySQL為例,MySQL支持單向、異步復制的主從備份。MySQL在進行主從備份時,一個服務器充當主服務器,一個或多個其它服務器充當從服務器。在主服務器上啟用二進制日志,二進制日志用于跟蹤所有對主數(shù)據(jù)庫的更新(插入、刪除、修改等等)。每個從服務器從主服務器接收記錄在二進制日志中的更新。當一個從服務器連接主服務器時,從服務器通知主服務器自己在二進制日志中讀取的最后一次更新的位置。從服務器接收該位置以后發(fā)生的任何更新,并在本機上執(zhí)行相同的更新,然后封鎖并等待主服務器通知新的更新。從服務器執(zhí)行備份不會干擾主服務器,在備份過程中主服務器可以繼續(xù)處理更新。
[0004]為了適應的新的需求,同種類型的數(shù)據(jù)庫往往具有較多不同的版本。隨著業(yè)務功能的變化,存儲業(yè)務數(shù)據(jù)的數(shù)據(jù)庫版本也需要變化,因此需要將業(yè)務訪問的源數(shù)據(jù)庫的數(shù)據(jù)遷移到目標數(shù)據(jù)庫。
[0005]傳統(tǒng)方法 在不同版本的數(shù)據(jù)庫間進行數(shù)據(jù)遷移之前,必須先讀鎖數(shù)據(jù)庫,即禁止寫數(shù)據(jù)庫,只提供讀數(shù)據(jù)庫的服務。在此期間,業(yè)務必須中斷對數(shù)據(jù)庫的訪問。當源數(shù)據(jù)庫的數(shù)據(jù)全部遷移到目標數(shù)據(jù)庫以后,將業(yè)務訪問的數(shù)據(jù)庫配置修改為目標數(shù)據(jù)庫,業(yè)務才能恢復對數(shù)據(jù)庫的訪問。然而,由于業(yè)務的歷史數(shù)據(jù)比較龐大,將源數(shù)據(jù)庫的數(shù)據(jù)遷移至目標數(shù)據(jù)庫往往需要幾個小時甚至幾天的時間。
[0006]因此,為了將業(yè)務的訪問從源數(shù)據(jù)庫切換到與源數(shù)據(jù)庫不同版本的目標數(shù)據(jù)庫,業(yè)務對數(shù)據(jù)庫的訪問需要中斷較長的時間。

【發(fā)明內(nèi)容】

[0007]基于此,有必要提供一種能減少業(yè)務中斷訪問數(shù)據(jù)庫時間的數(shù)據(jù)庫間的數(shù)據(jù)遷移方法。
[0008]一種數(shù)據(jù)庫間的數(shù)據(jù)遷移方法,包括以下步驟:
[0009]讀鎖源數(shù)據(jù)庫的從數(shù)據(jù)庫,記錄從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置;
[0010]將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出至目標數(shù)據(jù)庫;
[0011]讀鎖源數(shù)據(jù)庫,獲取所述更新位置之后源數(shù)據(jù)庫產(chǎn)生的更新,將所述更新同步到所述目標數(shù)據(jù)庫。[0012]基于此,還有必要提供一種能減少業(yè)務中斷訪問數(shù)據(jù)庫時間的數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng)。
[0013]一種數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng),包括:
[0014]讀寫控制模塊,用于讀鎖源數(shù)據(jù)庫的從數(shù)據(jù)庫;
[0015]位置記錄模塊,用于記錄從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置;
[0016]數(shù)據(jù)導出模塊,用于將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出至目標數(shù)據(jù)庫;
[0017]所述讀寫控制模塊還用于讀鎖源數(shù)據(jù)庫;
[0018]剩余更新同步模塊,用于獲取所述更新位置之后源數(shù)據(jù)庫產(chǎn)生的更新,將所述更新同步到所述目標數(shù)據(jù)庫。
[0019]上述數(shù)據(jù)庫間的數(shù)據(jù)遷移方法和系統(tǒng),在將源數(shù)據(jù)庫的數(shù)據(jù)遷移至目標數(shù)據(jù)庫時,讀鎖源數(shù)據(jù)庫的從數(shù)據(jù)庫,記錄從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置;將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出到目標數(shù)據(jù)庫;讀鎖源數(shù)據(jù)庫,獲取上述更新位置之后源數(shù)據(jù)庫產(chǎn)生的更新,將更新同步到目標數(shù)據(jù)庫。上述方法和系統(tǒng),在讀鎖源數(shù)據(jù)庫之前,業(yè)務可以對源數(shù)據(jù)庫進行訪問,而在將所有更新同步到目標數(shù)據(jù)庫之后,源數(shù)據(jù)庫與目標數(shù)據(jù)庫的數(shù)據(jù)是一致的,業(yè)務可切換到目標數(shù)據(jù)庫訪問數(shù)據(jù),因而只有在將上述更新位置之后源數(shù)據(jù)庫產(chǎn)生的所有更新同步到目標數(shù)據(jù)庫期間,業(yè)務不能訪問數(shù)據(jù)庫,而源數(shù)據(jù)庫的大部分數(shù)據(jù)已經(jīng)由從數(shù)據(jù)庫導出至目標數(shù)據(jù)庫,該期間更新的數(shù)據(jù)量較小,因而該期間花費的時間也較少,因此上述方法和系統(tǒng)能減少業(yè)務中斷訪問數(shù)據(jù)庫的時間。
【【專利附圖】

【附圖說明】】
[0020]圖1為一個實施例中的數(shù)據(jù)庫間的數(shù)據(jù)遷移方法的流程示意圖;
[0021]圖2為一個實施例中步驟S60的流程示意圖;
[0022]圖3為一個實施例中的數(shù)據(jù)庫間的數(shù)據(jù)遷移方法的原理示意圖;
[0023]圖4為一個實施例中的數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng)的結(jié)構(gòu)示意圖;
[0024]圖5為一個實施例中數(shù)據(jù)導出模塊的結(jié)構(gòu)示意圖。
【【具體實施方式】】
[0025]如圖1所示,在一個實施例中,一種數(shù)據(jù)庫間的數(shù)據(jù)遷移方法,包括以下步驟:
[0026]步驟S20,讀鎖源數(shù)據(jù)庫的從數(shù)據(jù)庫,記錄從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置。
[0027]具體的,從數(shù)據(jù)庫為源數(shù)據(jù)庫的備份數(shù)據(jù)庫。在步驟S20之前,可每間隔預設時間,獲取源數(shù)據(jù)庫的更新中尚未同步到從數(shù)據(jù)庫的更新,在從數(shù)據(jù)庫中執(zhí)行相同的更新。因而,源數(shù)據(jù)庫的大部分數(shù)據(jù)同步到了從數(shù)據(jù)庫中。
[0028]具體的,更新事件在源數(shù)據(jù)庫中對應的更新位置為該更新事件在記錄了源數(shù)據(jù)庫的更新的日志文件中的位置。進一步,更新事件在日志文件中的位置指的是更新事件位于該日志文件中的偏移量。源數(shù)據(jù)庫一般具有多個日志文件,更新事件所在的日志文件的文件名以及更新事件在該日志文件中的偏移量即可唯一確定更新事件在源數(shù)據(jù)庫中對應的更新位置。因此,步驟S20可記錄更新事件所在的日志文件的文件名以及更新事件在該日志文件中的偏移量。
[0029]具體的,讀鎖從數(shù)據(jù)庫,即給從數(shù)據(jù)庫加讀鎖,禁止對從數(shù)據(jù)庫進行寫操作,只提供讀從數(shù)據(jù)庫的服務。
[0030]步驟S40,將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出到目標數(shù)據(jù)庫。
[0031]在一個實施例中,步驟S40的具體過程包括:將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件,備份文件中包含重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)的命令語句;在目標數(shù)據(jù)庫中執(zhí)行所述命令語句。
[0032]具體的,對于支持SQL語言的數(shù)據(jù)庫,可將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為包含SQL命令語句的備份文件,進一步的,在目標數(shù)據(jù)庫中執(zhí)行備份文件中的SQL命令語句以重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)。
[0033]步驟S60,讀鎖源數(shù)據(jù)庫,獲取更新位置之后源數(shù)據(jù)庫產(chǎn)生的更新,將獲取的更新同步到目標數(shù)據(jù)庫。
[0034]具體的,可給源數(shù)據(jù)庫加讀鎖,禁止對源數(shù)據(jù)庫進行寫操作,只提供讀源數(shù)據(jù)庫的服務。
[0035]具體的,在一個實施例中,可獲取從數(shù)據(jù)庫最后一次執(zhí)行的更新事件所在的源數(shù)據(jù)庫的日志文件中該更新事件之后的所有更新,將獲取的更新同步到目標數(shù)據(jù)庫。進一步的,將從數(shù)據(jù)庫最后一次執(zhí)行的更新事件所在的日志文件之后產(chǎn)生的所有源數(shù)據(jù)庫的日志文件全量導入目標數(shù)據(jù)庫,即獲取從數(shù)據(jù)庫最后一次執(zhí)行的更新事件所在的日志文件之后產(chǎn)生的所有源數(shù)據(jù)庫的日志文件中的更新,在目標數(shù)據(jù)庫中執(zhí)行與獲取的更新相同的更新操作。
[0036]在一個實施例中,在步驟S60之后,上述數(shù)據(jù)庫間的數(shù)據(jù)遷移方法還包括步驟:可將業(yè)務訪問從源數(shù)據(jù)庫切換到目標數(shù)據(jù)庫。
[0037]具體的,可修改業(yè)務訪問的數(shù)據(jù)庫的相關(guān)配置,將源數(shù)據(jù)庫的相關(guān)信息對應修改為目標數(shù)據(jù)庫的相關(guān)信息,并啟動對目標數(shù)據(jù)庫的訪問。
[0038]上述數(shù)據(jù)庫間的數(shù)據(jù)遷移方法,在讀鎖源數(shù)據(jù)庫之前,業(yè)務可以對源數(shù)據(jù)庫進行訪問,而在將所有更新同步到目標數(shù)據(jù)庫之后,源數(shù)據(jù)庫與目標數(shù)據(jù)庫的數(shù)據(jù)是一致的,業(yè)務可切換到目標數(shù)據(jù)庫訪問數(shù)據(jù),因而只有在將上述更新位置之后源數(shù)據(jù)庫產(chǎn)生的所有更新同步到目標數(shù)據(jù)庫期間,業(yè)務不能訪問數(shù)據(jù)庫,而源數(shù)據(jù)庫的大部分數(shù)據(jù)已經(jīng)由從數(shù)據(jù)庫導出至目標數(shù)據(jù)庫,該期間更新的數(shù)據(jù)量較小,因而該期間花費的時間也較少,因此上述方法和系統(tǒng)能減少業(yè)務中斷訪問數(shù)據(jù)庫的時間。
[0039]如圖2所示,在一個實施例中,步驟S60的具體過程包括:
[0040]步驟S602,按照更新產(chǎn)生順序獲取上述更新位置之后源數(shù)據(jù)庫發(fā)生的更新,將獲取的更新同步到目標數(shù)據(jù)庫,并監(jiān)測剩余的未同步到目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量是否小于閾值,重復執(zhí)行以上步驟,直到剩余的未同步到目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量小于閾值。
[0041]具體的,更新記錄在日志文件中,因此,可通過監(jiān)測日志文件的總大小來監(jiān)測日志文件中記錄的更新量的大小。具體的,在一個實施例中,可監(jiān)測記錄剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新的至少一個日志文件的總大小是否小于預設值。[0042]具體的,在一個實施例中,當源數(shù)據(jù)庫具有多個未同步到目標數(shù)據(jù)庫的日志文件時,將最后一個日志文件以前的未同步到目標數(shù)據(jù)庫中的日志文件導入目標數(shù)據(jù)庫。當只有一個未同步到目標數(shù)據(jù)庫的日志文件時,判斷該日志文件的大小是否小于預設值,若否,則等待產(chǎn)生新的日志文件或執(zhí)行產(chǎn)生新的日志文件的命令。產(chǎn)生新的日志文件后,重復執(zhí)行上述步驟,直到只剩下一個未同步到目標數(shù)據(jù)庫的日志文件且該日志文件的小于預設值。
[0043]步驟S604,若剩余的未同步到目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量小于閾值,則讀鎖源數(shù)據(jù)庫,獲取剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新,將剩余的更新同步到目標數(shù)據(jù)庫。
[0044]具體的,在一個實施例中,當只有一個未同步到目標數(shù)據(jù)庫的日志文件且該日志文件的小于預設值時,則讀鎖源數(shù)據(jù)庫。進一步的,將最后一個日志文件導入目標數(shù)據(jù)庫。
[0045]本實施例中,不斷地將源數(shù)據(jù)庫中新產(chǎn)生且未同步到目標數(shù)據(jù)庫中的更新同步到目標數(shù)據(jù)庫,當剩余的未同步到目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量小于閾值時,讀鎖源數(shù)據(jù)庫,并將剩余的未同步的所有更新同步到目標數(shù)據(jù)庫。由于本實施例在剩余更新量較小時再讀鎖源數(shù)據(jù)庫,將少量的更新同步到目標數(shù)據(jù)庫所花費的時間也較少,因此讀鎖源數(shù)據(jù)庫的時間也較少,從而可進一步的縮小業(yè)務中斷訪問數(shù)據(jù)庫的時間。
[0046]在一個實施例中,源數(shù)據(jù)庫、從數(shù)據(jù)庫和目標數(shù)據(jù)為MYSQL數(shù)據(jù)庫。
[0047]在步驟S20之前,可啟用用于跟蹤所有對源數(shù)據(jù)庫的更新(插入、刪除、修改等等)的日志。
[0048]在一個實施例中,從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置為該更新事件在源數(shù)據(jù)庫的日志文件中的位置。步驟S20可記錄更新事件所在的日志文件的文件名以及更新事件在該日志文件中的偏移量。
[0049]步驟S40的具體過程為:將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件,備份文件中包含重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)的SQL命令;在目標數(shù)據(jù)庫中執(zhí)行SQL命令。
[0050]具體的,可通過mysqldump工具將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件。mysqldump是MYSQL用于轉(zhuǎn)存儲數(shù)據(jù)庫的實用程序,在此不再贅述。進一步的,可通過MYSQL客戶端在目標數(shù)據(jù)庫中執(zhí)行SQL命令。
[0051]在一個實施例中,步驟S60的具體過程包括:讀鎖源數(shù)據(jù)庫,獲取源數(shù)據(jù)庫的日志文件中上述更新位置之后的更新日志;將獲取的更新日志中記錄的更新轉(zhuǎn)換為SQL命令;在目標數(shù)據(jù)庫中執(zhí)行轉(zhuǎn)換而成的SQL命令。
[0052]具體的,可獲取從數(shù)據(jù)庫最后一次執(zhí)行的更新事件所在的源數(shù)據(jù)庫的日志文件,并獲取該日志文件中該更新事件之后的所有更新日志;進一步的,獲取該日志文件之后產(chǎn)生的日志文件中所記錄的所有更新日志。
[0053]進一步的,可將獲取的更新日志中記錄的更新通過mysqlbinlog工具轉(zhuǎn)換為SQL命令。mysqlbinlog工具為將MYSQL的日志文件轉(zhuǎn)換為SQL命令的實用程序,在此不再贅述。進一步的,可通過MYSQL客戶端在目標數(shù)據(jù)庫中執(zhí)行轉(zhuǎn)換而成的SQL命令。
[0054]下面結(jié)合圖3說明上述數(shù)據(jù)庫間的數(shù)據(jù)遷移方法的原理。
[0055](I)源數(shù)據(jù)庫301的更新單向異步備份到從數(shù)據(jù)庫302,日志文件303記錄源數(shù)據(jù)庫301的更新。[0056](2)讀鎖從數(shù)據(jù)庫302,記錄從數(shù)據(jù)庫302最后一次執(zhí)行的更新事件在日志文件303中的更新位置。
[0057](3)將從數(shù)據(jù)庫302中存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件304,備份文件304中包含重構(gòu)從數(shù)據(jù)庫302存儲的數(shù)據(jù)的命令語句。
[0058](4)在目標數(shù)據(jù)庫305中執(zhí)行備份文件304中包含的命令語句。
[0059](5)讀鎖源數(shù)據(jù)庫301。
[0060](6)獲取日志文件303中從數(shù)據(jù)庫302最后一次執(zhí)行的更新事件的更新位置之后的源數(shù)據(jù)庫301產(chǎn)生的所有更新,將獲取的更新同步到目標數(shù)據(jù)庫305。
[0061]如圖4所示,在一個實施例中,一種數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng),包括讀寫控制模塊
10、位置記錄模塊20、數(shù)據(jù)導出模塊30、剩余更新同步模塊40,其中:
[0062]讀寫控制模塊10用于讀鎖源數(shù)據(jù)庫的從數(shù)據(jù)庫。
[0063]具體的,從數(shù)據(jù)庫為源數(shù)據(jù)庫的備份數(shù)據(jù)庫。在一個實施例中,上述數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng)還包括從數(shù)據(jù)庫更新模塊(圖中未示出),用于每間隔預設時間,獲取源數(shù)據(jù)庫的更新中尚未同步到從數(shù)據(jù)庫的更新,在從數(shù)據(jù)庫中執(zhí)行相同的更新。從數(shù)據(jù)庫更新模塊將源數(shù)據(jù)庫的大部分數(shù)據(jù)同步到了從數(shù)據(jù)庫中。
[0064]具體的,讀寫控制模塊10給從數(shù)據(jù)庫加讀鎖,禁止對從數(shù)據(jù)庫進行寫操作,只提供讀從數(shù)據(jù)庫的服務。
[0065]位置記錄模塊20用于記錄從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置。
[0066]具體的,更新事件在源數(shù)據(jù)庫中對應的更新位置為該更新事件在記錄了源數(shù)據(jù)庫的更新的日志文件中的位置。進一步,更新事件在日志文件中的位置指的是更新事件位于該日志文件中的偏移量。源數(shù)據(jù)庫一般具有多個日志文件,更新事件所在的日志文件的文件名以及更新事件在該日志文件中的偏移量即可唯一確定更新事件在源數(shù)據(jù)庫中對應的更新位置。因此,位置記錄模塊20可記錄更新事件所在的日志文件的文件名以及更新事件在該日志文件中的偏移量。
[0067]數(shù)據(jù)導出模塊30用于將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出到目標數(shù)據(jù)庫。
[0068]如圖5所示,在一個實施例中,數(shù)據(jù)導出模塊30包括備份模塊320和命令執(zhí)行模塊340,其中:
[0069]備份模塊320用于將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件,備份文件中包含重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)的命令語句。
[0070]命令執(zhí)行模塊340用于在目標數(shù)據(jù)庫中執(zhí)行上述命令語句。
[0071]具體的,對于支持SQL語言的數(shù)據(jù)庫,備份模塊320可將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為包含SQL命令語句的備份文件,進一步的,命令執(zhí)行模塊340可在目標數(shù)據(jù)庫中執(zhí)行備份文件中的SQL命令語句以重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)。
[0072]讀寫控制模塊10還用于讀鎖源數(shù)據(jù)庫。
[0073]具體的,讀寫控制模塊10可給源數(shù)據(jù)庫加讀鎖,禁止對源數(shù)據(jù)庫進行寫操作,只提供讀源數(shù)據(jù)庫的服務。
[0074]剩余更新同步模塊40用于獲取更新位置之后源數(shù)據(jù)庫產(chǎn)生的更新,將獲取的更新同步到目標數(shù)據(jù)庫。[0075]具體的,在一個實施例中,剩余更新同步模塊40可獲取從數(shù)據(jù)庫最后一次執(zhí)行的更新事件所在的源數(shù)據(jù)庫的日志文件中該更新事件之后的所有更新,將獲取的更新同步到目標數(shù)據(jù)庫。進一步的,剩余更新同步模塊40可將從數(shù)據(jù)庫最后一次執(zhí)行的更新事件所在的日志文件之后產(chǎn)生的所有源數(shù)據(jù)庫的日志文件全量導入目標數(shù)據(jù)庫,即獲取從數(shù)據(jù)庫最后一次執(zhí)行的更新事件所在的日志文件之后產(chǎn)生的所有源數(shù)據(jù)庫的日志文件中的更新,在目標數(shù)據(jù)庫中執(zhí)行與獲取的更新相同的更新操作。
[0076]在一個實施例中,上述數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng)還包括訪問切換模塊(圖中未示出),用于將業(yè)務訪問從源數(shù)據(jù)庫切換到目標數(shù)據(jù)庫。
[0077]具體的,訪問切換模塊可修改業(yè)務訪問的數(shù)據(jù)庫的相關(guān)配置,將源數(shù)據(jù)庫的相關(guān)信息對應修改為目標數(shù)據(jù)庫的相關(guān)信息,并啟動對目標數(shù)據(jù)庫的訪問。
[0078]上述數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng),在讀鎖源數(shù)據(jù)庫之前,業(yè)務可以對源數(shù)據(jù)庫進行訪問,而在將所有更新同步到目標數(shù)據(jù)庫之后,源數(shù)據(jù)庫與目標數(shù)據(jù)庫的數(shù)據(jù)是一致的,業(yè)務可切換到目標數(shù)據(jù)庫訪問數(shù)據(jù),因而只有在將上述更新位置之后源數(shù)據(jù)庫產(chǎn)生的所有更新同步到目標數(shù)據(jù)庫期間,業(yè)務不能訪問數(shù)據(jù)庫,而源數(shù)據(jù)庫的大部分數(shù)據(jù)已經(jīng)由從數(shù)據(jù)庫導出至目標數(shù)據(jù)庫,該期間更新的數(shù)據(jù)量較小,因而該期間花費的時間也較少,因此上述系統(tǒng)能減少業(yè)務中斷訪問數(shù)據(jù)庫的時間。
[0079]在一個實施例中,剩余更新同步模塊40包括更新模塊和監(jiān)測模塊(圖中未示出),其中:
[0080]更新模塊用于在讀寫控制模塊10讀鎖源數(shù)據(jù)庫之前,按照更新產(chǎn)生順序獲取上述更新位置之后源數(shù)據(jù)庫發(fā)生的更新,將獲取的更新同步到目標數(shù)據(jù)庫。
[0081]監(jiān)測模塊用于監(jiān)測剩余的未同步到目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量是否小于閾值。
[0082]本實施例中,讀寫控制模塊10還用于若剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量小于閾值,則讀鎖源數(shù)據(jù)庫。
[0083]更新模塊還用于在讀寫控制模塊10讀鎖源數(shù)據(jù)庫之后,獲取剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新,將剩余的更新同步到所述目標數(shù)據(jù)庫。
[0084]具體的,更新記錄在日志文件中,因此,監(jiān)測模塊可通過監(jiān)測日志文件的總大小來監(jiān)測日志文件中記錄的更新量的大小。具體的,在一個實施例中,監(jiān)測模塊可監(jiān)測記錄剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新的至少一個日志文件的總大小是否小于預設值。
[0085]具體的,在一個實施例中,當源數(shù)據(jù)庫具有多個未同步到目標數(shù)據(jù)庫的日志文件時,更新模塊可將最后一個日志文件以前的未同步到目標數(shù)據(jù)庫中的日志文件導入目標數(shù)據(jù)庫。當只有一個未同步到目標數(shù)據(jù)庫的日志文件時,更新模塊可等待產(chǎn)生新的日志文件或執(zhí)行產(chǎn)生新的日志文件的命令。產(chǎn)生新的日志文件后,更新模塊可繼續(xù)將最后一個日志文件以前的未同步到目標數(shù)據(jù)庫中的日志文件導入目標數(shù)據(jù)庫。
[0086]而監(jiān)測模塊可監(jiān)測是否只剩下一個未同步到目標數(shù)據(jù)庫的日志文件且該日志文件的小于預設值,若是,則通知讀寫模塊10讀寫源數(shù)據(jù)庫,并通知更新模塊將最后一個日志文件導入目標數(shù)據(jù)庫。
[0087]當只有一個未同步到目標數(shù)據(jù)庫的日志文件且該日志文件的小于預設值時,讀寫控制模塊10讀鎖源數(shù)據(jù)庫,進一步的,更新模塊將最后一個日志文件導入目標數(shù)據(jù)庫。
[0088]本實施例中,不斷地將源數(shù)據(jù)庫中新產(chǎn)生且未同步到目標數(shù)據(jù)庫中的更新同步到目標數(shù)據(jù)庫,當剩余的未同步到目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量小于閾值時,讀鎖源數(shù)據(jù)庫,并將剩余的未同步的所有更新同步到目標數(shù)據(jù)庫。由于本實施例在剩余更新量較小時再讀鎖源數(shù)據(jù)庫,將少量的更新同步到目標數(shù)據(jù)庫所花費的時間也較少,因此讀鎖源數(shù)據(jù)庫的時間也較少,從而可進一步的縮小業(yè)務中斷訪問數(shù)據(jù)庫的時間。
[0089]在一個實施例中,源數(shù)據(jù)庫、從數(shù)據(jù)庫和目標數(shù)據(jù)為MYSQL數(shù)據(jù)庫。
[0090]在一個實施例中,上述系統(tǒng)還包括日志記錄模塊(圖中未示出),用于啟用用于跟蹤所有對源數(shù)據(jù)庫的更新(插入、刪除、修改等等)的日志。
[0091]在一個實施例中,從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置為該更新事件在源數(shù)據(jù)庫的日志文件中的位置。位置記錄模塊20可記錄更新事件所在的日志文件的文件名以及更新事件在該日志文件中的偏移量。
[0092]數(shù)據(jù)導出模塊30用于將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件,備份文件中包含重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)的SQL命令,進一步的,在目標數(shù)據(jù)庫中執(zhí)行SQL命令。
[0093]具體的,數(shù)據(jù)導出模塊30可通過mysqldump工具將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件。mysqldump是MYSQL用于轉(zhuǎn)存儲數(shù)據(jù)庫的實用程序,在此不再贅述。
[0094]剩余更新同步模塊40用于獲取源數(shù)據(jù)庫的日志文件中上述更新位置之后的更新日志;將獲取的更新日志中記錄的更新轉(zhuǎn)換為SQL命令;并在目標數(shù)據(jù)庫中執(zhí)行轉(zhuǎn)換而成的SQL命令。
[0095]具體的,剩余更新同步模塊40可獲取從數(shù)據(jù)庫最后一次執(zhí)行的更新事件所在的源數(shù)據(jù)庫的日志文件,并獲取該日志文件中該更新事件之后的所有更新日志;進一步的,可獲取該日志文件之后產(chǎn)生的日志文件中所記錄的所有更新日志。
[0096]進一步的,剩余更新同步模塊40可將獲取的更新日志中記錄的更新通過mysqlbinlog工具轉(zhuǎn)換為SQL命令。mysqlbinlog工具為將MYSQL的日志文件轉(zhuǎn)換為SQL命令的實用程序,在此不再贅述。
[0097]本領域普通技術(shù)人員可以理解實現(xiàn)上述實施例方法中的全部或部分流程,是可以通過計算機程序控制相關(guān)的硬件來完成的,所述的程序可存儲于一計算機可讀取存儲介質(zhì)中,該程序在執(zhí)行時,可包括如上述各方法的實施例的流程。其中,所述的存儲介質(zhì)可為磁碟、光盤、只讀存儲記憶體(Read-Only Memory, ROM)或隨機存儲記憶體(Random AccessMemory, RAM)等。
[0098]以上所述實施例僅表達了本發(fā)明的幾種實施方式,其描述較為具體和詳細,但并不能因此而理解為對本發(fā)明專利范圍的限制。應當指出的是,對于本領域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進,這些都屬于本發(fā)明的保護范圍。因此,本發(fā)明專利的保護范圍應以所附權(quán)利要求為準。
【權(quán)利要求】
1.一種數(shù)據(jù)庫間的數(shù)據(jù)遷移方法,包括以下步驟: 讀鎖源數(shù)據(jù)庫的從數(shù)據(jù)庫,記錄從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置; 將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出至目標數(shù)據(jù)庫; 讀鎖源數(shù)據(jù)庫,獲取所述更新位置之后源數(shù)據(jù)庫產(chǎn)生的更新,將所述更新同步到所述目標數(shù)據(jù)庫。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出至目標數(shù)據(jù)庫的步驟包括: 將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件,所述備份文件中包含重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)的命令語句; 在所述目標數(shù)據(jù)庫中執(zhí)行所述命令語句。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述讀鎖源數(shù)據(jù)庫,獲取所述更新位置之后源數(shù)據(jù)庫發(fā)生的更新,將所述更新同步到所述目標數(shù)據(jù)庫的步驟包括: 按照更新產(chǎn)生順序獲取所述更新位置之后源數(shù)據(jù)庫發(fā)生的更新,將獲取的更新同步到所述目標數(shù)據(jù)庫,并監(jiān)測剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量是否小于閾值; 若剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量小于閾值,則讀鎖源數(shù)據(jù)庫,獲取剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新,將剩余的更新同步到所述目標數(shù)據(jù)庫。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述監(jiān)測剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量是否小于閾值的步驟包括: 監(jiān)測記錄剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新的日志文件的大小是否小于預設值。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述將所述更新同步到所述目標數(shù)據(jù)庫的步驟之后,所述方法還包括: 將業(yè)務訪問從所述源數(shù)據(jù)庫切換到所述目標數(shù)據(jù)庫。
6.根據(jù)權(quán)利要求1-5任一所述的方法,其特征在于,所述源數(shù)據(jù)庫、從數(shù)據(jù)庫和目標數(shù)據(jù)為MYSQL數(shù)據(jù)庫; 所述將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出到目標數(shù)據(jù)庫的步驟包括: 將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件,所述備份文件中包含重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)的SQL命令; 在所述目標數(shù)據(jù)庫中執(zhí)行所述SQL命令。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述更新位置為從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫的日志文件中的位置; 所述獲取所述更新位置之后源數(shù)據(jù)庫產(chǎn)生的更新,將所述更新同步到所述目標數(shù)據(jù)庫的步驟包括: 獲取源數(shù)據(jù)庫的日志文件中所述更新位置之后的更新日志; 將所述更新日志中記錄的更新轉(zhuǎn)換為SQL命令; 在所述目標數(shù)據(jù)庫中執(zhí)行轉(zhuǎn)換而成的SQL命令。
8.一種數(shù)據(jù)庫間的數(shù)據(jù)遷移系統(tǒng),其特征在于,包括: 讀寫控制模塊,用于讀鎖源數(shù)據(jù)庫的從數(shù)據(jù)庫; 位置記錄模塊,用于記錄從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫中對應的更新位置; 數(shù)據(jù)導出模塊,用于將從數(shù)據(jù)庫中存儲的數(shù)據(jù)導出至目標數(shù)據(jù)庫; 所述讀寫控制模塊還用于讀鎖源數(shù)據(jù)庫; 剩余更新同步模塊,用于獲取所述更新位置之后源數(shù)據(jù)庫產(chǎn)生的所有更新,將所述更新同步到所述目標數(shù)據(jù)庫。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述數(shù)據(jù)導出模塊包括: 備份模塊,用于將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件,所述備份文件中包含重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)的命令語句; 命令執(zhí)行模塊,在所述目標數(shù)據(jù)庫中執(zhí)行所述命令語句。
10.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述剩余更新同步模塊包括: 更新模塊,用于在讀寫控制模塊讀鎖源數(shù)據(jù)庫之前,按照更新產(chǎn)生順序獲取所述更新位置之后源數(shù)據(jù)庫發(fā)生的更新,將獲取的更新同步到所述目標數(shù)據(jù)庫; 監(jiān)測模塊,用于監(jiān)測剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量是否小于閾值; 所述讀寫控制模塊用于若剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新量小于閾值,則讀鎖源數(shù)據(jù)庫; 所述更新模塊還用于在所述讀寫控制模塊讀鎖源數(shù)據(jù)庫之后,獲取剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新,將剩余的更新同步到所述目標數(shù)據(jù)庫。
11.根據(jù)權(quán)利要求10所述的系統(tǒng),其特征在于,所述剩余更新同步模塊還用于監(jiān)測記錄剩余的未同步到所述目標數(shù)據(jù)庫的源數(shù)據(jù)庫的更新的日志文件的大小是否小于預設值。
12.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括: 訪問切換模塊,用于在將所述更新同步到所述目標數(shù)據(jù)庫之后,將業(yè)務訪問從所述源數(shù)據(jù)庫切換到所述目標數(shù)據(jù)庫。
13.根據(jù)權(quán)利要求8-12任一所述的系統(tǒng),其特征在于,所述源數(shù)據(jù)庫、從數(shù)據(jù)庫和目標數(shù)據(jù)為MYSQL數(shù)據(jù)庫; 數(shù)據(jù)導出模塊用于將從數(shù)據(jù)庫存儲的數(shù)據(jù)導出轉(zhuǎn)存儲為備份文件,所述備份文件中包含重構(gòu)從數(shù)據(jù)庫存儲的數(shù)據(jù)的SQL命令,并在所述目標數(shù)據(jù)庫中執(zhí)行所述SQL命令。
14.根據(jù)權(quán)利要求13所述的系統(tǒng),其特征在于,所述更新位置為從數(shù)據(jù)庫最后一次執(zhí)行的更新事件在源數(shù)據(jù)庫的日志文件中的位置; 剩余更新同步模塊用于獲取源數(shù)據(jù)庫的日志文件中所述更新位置之后的更新日志,將所述更新日志中記錄的更新轉(zhuǎn)換為SQL命令,并在所述目標數(shù)據(jù)庫中執(zhí)行轉(zhuǎn)換而成的SQL命令。
【文檔編號】G06F17/30GK103530290SQ201210226102
【公開日】2014年1月22日 申請日期:2012年7月3日 優(yōu)先權(quán)日:2012年7月3日
【發(fā)明者】鄒偉, 徐曉明 申請人:深圳市騰訊計算機系統(tǒng)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
通道| 墨竹工卡县| 五常市| 琼结县| 长乐市| 广宁县| 克拉玛依市| 乌兰浩特市| 孟连| 黄平县| 鄂尔多斯市| 上高县| 达日县| 平利县| 高清| 象山县| 泰安市| 丰镇市| 广汉市| 新和县| 新野县| 平顶山市| 岑溪市| 汶川县| 观塘区| 浦城县| 冕宁县| 万州区| 新源县| 武胜县| 兖州市| 遂宁市| 大关县| 巴里| 韶山市| 朝阳区| 永宁县| 新竹县| 克山县| 长垣县| 英吉沙县|