oracle大資料表複製備份個人經驗

2021-09-02 03:08:18 字數 3268 閱讀 9514

[b]前提:[/b]

資料庫倉庫a(就拿oracle11g為例)中有兩個使用者user1和user2,現在有user1中有表ldm_table1,且表ldm_table1有資料5千萬以上,ldm_table1中的資料是從其他庫b(資料來源)中抽取過來的,前期業務理解不夠或者需求有變,資料有變動需要重新從b中抽取資料到a庫表ldm_table1中。

重新抽取資料前想把原來的ldm_table1中的資料進行備份,備份到使用者user2中,以備將來恢復(重新抽取可能出錯等原因)。

前面差不多是廢話,可能舉例不恰當,反正就是想備份大表(5千萬以上記錄,我自己這麼認為,相對的),或者大表之間資料存在相互拷貝的一些方法。

[b]1.具體備份方法(這裡寫了16個並行,視情況而定):[/b]

create table user2.ldm_table1 nologging parallel (degree 16) as select * from user1.ldm_table1;

2.

truncate table user1.ldm_table1;

3.現在想把user2.ldm_table1中資料再恢復到user1.ldm_table1中,具體sql如下(我們不再create table了,因為user1.ldm_table1已經存在,並且索引什麼的都建立了,如果資料沒有超過1億):

[b]4.資料再多一些,比如幾個億的,用3中方法有些慢,所以我目前覺得還是用create方法(上述1中提到的)好些。但是採用重新建立表的方法時,需要drop掉原來的表,並且要建立索引,具體sql如下:[/b]

a.採用1中方法,

create table user1.ldm_table1 nologging parallel (degree 16) as select * from user2.ldm_table1;

b.建立主鍵(主鍵建立加並行好像不起作用)

c.建立索引(這裡加了24個並行,視情況)

create bitmap index user1.index_ldm_table1_rq  on user1.ldm_table1 (rq)parallel 24  local;

d.如果需要收集統計資訊,則執行

exec  dbms_stats.gather_table_stats('user1','ldm_table1,cascade=>true,estimate_percent=>10,method_opt=>'for all columns size auto',degree=>16);

[b]5.如果表user1.ldm_table1表存在分割槽,那麼重新恢復可就不是簡單create table(上述方法1)就能行的,因為採用上述方法1會丟失分割槽,所以這時應該用另一種方法,具體sql如下:(注意必須寫明各個字段,而字段後面不跟長度型別等)[/b]

create table user1.ldm_table1

(aaa,

bbb,

ccc,

....

)partition by range (n_dm)

(partition p00000000000 values less than (' 5500000')

tablespace ts_dat_ldm

pctfree 10

initrans 1

maxtrans 255

storage

(initial 160k

next 1m

minextents 1

maxextents unlimited

),partition p 5500000 values less than ('5501000')

tablespace ts_dat_ldm

pctfree 10

initrans 1

maxtrans 255

storage

(initial 160k

next 1m

minextents 1

maxextents unlimited

),........

)select

aaa,

bbb,

ccc,

.....

from user2.ldm_table1;

[b]6.有時候需要將表user2.ldm_table1中的部分資料提交到表user1.ldm_table1中,如果採用上述3中的方法會覺得有些慢,可以採用分部提交或者就迴圈提交,每次提交100萬,直至提交完畢,具體sql如下[/b]

--迴圈提交資料

[b]7.如果想刪除大表user1.ldm_table1中的部分資料,比如從幾億資料中刪除1000萬,可能採用delete方法比較慢,所以我們可以採用迴圈刪除的方法,具體sql如下:[/b]

--迴圈刪除資料

declare

v_cnt number:=0;

begin

loop

delete from user1.ldm_table1 where y_dm like '10025%'

and rownum<=10000;

v_cnt:=sql%rowcount;

commit;

exit when v_cnt<=0;

end loop

end;

/

--加並行快點

declare

v_cnt number:=0;

begin

execute immediate 'alter table user1.ldm_table1 nologging';

execute immediate 'alter session enable parallel dml';

loop

delete/*+parallel(16)*/ from user1.ldm_table1 where y_dm like '10025%'

and rownum<=10000;

v_cnt:=sql%rowcount;

commit;

exit when v_cnt<=0;

end loop

end;

/

[b]8.注意內容[/b]

如果索引很多(一般是超過5個,我覺得),可以考慮先刪除索引,後加入資料,最後建立索引

9.自己理解比較少,只能寫成這樣,歡迎討論。

複製備份表

1.複製表結構及其資料 create table table name new as select from table name old 2.只複製表結構 create table table name new as select from table name old where 1 2 或者 ...

mysql 如何複製 備份表資料

大家需要記住生產上運算元據一定需要小心小心再小心。所以當你需要更新生產上表資料的時候,需要先備份表資料。驗證沒有問題後再刪掉備份。直接使用如下sql create table new table name select field1,field2.from old table name 有時候運維會...

MySQL複製資料表

主題 下面是我在複製表結構以及資料時最常使用的搭配 table new 新錶 table old 原表 create table new like table old 完整複製原表的建表語句以建立新錶 insert into table new select from table old 完整複製原...