利用游標進行資料庫資料備份

2021-06-15 00:04:09 字數 2111 閱讀 2892

今天同事問我乙個問題:他需要每天將tablea中指定條件下的資料copy到tableb中,並刪除tableb中已被copy的資料,應該用什麼方法高效一些?聽到這個方法之後第一反映就是想到在我上家公司的時候,也做了同樣的資料備份工作,不過當時指令碼是我老大寫的,我只是看了一眼,大概是將需要備份的資料查詢出來,在迴圈結果集逐條將資料移走,為了減少資料壓力,並每處理500記錄之後commit一次。當時只是看了這種想法,也沒多想這種寫法用到了什麼,結果也只是告訴同事這樣乙個思路。

現在回來諮詢了下度娘,終於找到了原來使用的是游標(這裡使用的是oracle,當然游標在db2,mysql等資料庫中也是可以使用的)

現在簡單舉例利用游標進行資料備份(移動)

背景:表a

testa(

id int,

name varchar2(20)

表btestb(

id int,

name varchar2(20)

第一種游標使用方法

declare

--型別定義

cursor c_job

isselect id,name

from testa;

--定義乙個游標變數c_row c_job%rowtype ,該型別為游標c_job中的一行資料型別

c_row c_job%rowtype;

begin

for c_row in c_job loop

insert into testb(id,name)values(c_row.id,c_row.name);

delete from testa where id=c_row.id and name=c_row.name;

end loop;

commit;

end;

在上面一種方法中,一次性將資料全部,如果資料量較小的話,倒沒有什麼影響,但如果是大量的資料,一次做commit,會大的增加資料庫的資源消耗,因此可以採用下面的方法來拿到rownum(oracle有此關鍵字)來定資料量commit

declare

--型別定義

cursor c_job

isselect id,name,rownum

from testb;

--定義乙個游標變數c_row c_job%rowtype ,該型別為游標c_job中的一行資料型別

c_row c_job%rowtype;

begin

for c_row in c_job loop

insert into testa(id,name)values(c_row.id,c_row.name);

delete from testb where id=c_row.id and name=c_row.name;

if c_row.rownum=2 then

commit;

end if;

end loop;

commit;

end;

當然如果不用rownum的話,也可以定義變數來進行i++的操作記錄

declare

--定義變數i為int型別,值為0;

i int:=0;

--型別定義

cursor c_job

isselect id,name,rownum

from testa;

--定義乙個游標變數c_row c_job%rowtype ,該型別為游標c_job中的一行資料型別

c_row c_job%rowtype;

begin

for c_row in c_job loop

i:=i+1;--進行i+1

insert into testb(id,name)values(c_row.id,c_row.name);

delete from testa where id=c_row.id and name=c_row.name;

if i=2 then

commit;

end if;

end loop;

commit;

end;

對於游標不熟悉的同鞋,這裡提供乙份游標學習資料,希望可以幫忙到大家(其實我也是剛才學習到,吼吼)

oracle游標使用方法及語法大全

oracle游標詳解

用游標來對資料庫的多行資料進行操作

我們知道,在儲存過程中用dml語句,只能查詢單條記錄,如果要對多條資料進行處理,那麼就要用到游標,下面以例子來說明 如果對scott使用者下的emp表中的使用者名為clerk的每個使用者進行薪金加100的操作。create or replace procedure p salary iscursor...

mysqldump進行資料庫備份

最近,遇到乙個場景需要對mysql資料庫進行備份,本文記錄一下。1.對整個資料庫備份,包括表結構和資料 格式 mysqldump h資料庫ip u使用者名稱 p 資料庫名 d xx.sql 檔案存放路徑 示例 mysqldump h132.72.192.432 uroot p test home c...

xtrabackup進行資料庫備份

最近需要將線上資料庫的資料同步到線下測試環境,所以在找資料庫同步的方法,發現了xtrabackup這個工具,便想試下是否可行。開源,免費,備份速度快,感覺挺強大有木有,廢話不多說,開始安裝。wget rpm ivh percona release 0.1 4.noarch.rpm yum y nog...