現在有數十萬張表要從A庫通過insert into tablename select * from tablename@dblink的方式導入到B庫中。
B機上80個cpu,160G內存。希望能夠大量并發執行。怎么寫腳本呢?
誰有這方面的經驗,麻煩指點一下。謝謝。
下面是我的腳本:
#!/usr/bin/sh
#最大進程數
v_max_session="310"
#進程計數器,用來計算當前正在執行的進程數量
v_session_counter=0
v_pipe_name=""
v_log_name=""
v_table_owner=""
v_table_name=""
v_part_name=""
v_param_file="list_table.txt"
f_insert_data()
{
sqlplus -s ${v_dest_tns} << EOF
set timing on time on autocommit on
prompt truncate table ...
declare
v_sql varchar2(300);
begin
begin
v_sql :='truncate table ${v_table_owner}.${v_table_name} reuse storage';
execute immediate v_sql;
insert into trunlog values ('${v_table_owner}','${v_table_name}','',sysdate,'truncate successfull',v_sql);
commit;
exception when others then
insert into trunlog values ('${v_table_owner}','${v_table_name}','',sysdate,'fail successfull',v_sql);
commit;
end;
begin
v_sql :='insert /*+ append */ into ${v_table_owner}.${v_table_name} nologging select * from??${v_table_owner}.${v_table_name}@JLDM';
execute immediate v_sql;
insert into trunlog values ('${v_table_owner}','${v_table_name}','',sysdate,'insert successfull',v_sql);
exception when others then
insert into trunlog values ('${v_table_owner}','${v_table_name}','',sysdate,'insert fail',v_sql);
commit;
end;
insert into trunlog values ('${v_table_owner}','${v_table_name}','',sysdate,'truncate successfull',v_sql);
exception when others then
insert into trunlog values ('${v_table_owner}','${v_table_name}','',sysdate,'fail','');
commit;
end;
/
exit;
EOF
}
while read v_table_owner v_table_name v_part_name
do
while [??$v_session_counter -ge $v_max_session ]
do
echo ". \c"
sleep 1
v_session_counter=0
ps -ef | grep -v grep | grep sqlplus | wc -l | read v_session_counter
done
f_insert_data
v_session_counter=0
ps -ef | grep -v grep | grep imp | wc -l | read v_session_counter
echo "session counter: ${v_session_counter}"
done
list_table.txt里面的內容如下:
JLCRM DW_NEWBUSI_SVC_MM_439 DW_NEWBUSI_SVC_MM200508
PARAM DIM_STAT_SP_TMP NULL
JLCRM DW_IMEI_USER_MM_431 DW_IMEI_USER_MM200509
DM DM_SMS_BASE_437_20090816 NULL
JLCRM DW_IMEI_USER_MM_432 DW_IMEI_USER_MM200509
DM DM_OWE_BASE_439_20090816 NULL
JLCRM DW_IMEI_USER_MM_433 DW_IMEI_USER_MM200509
DM DM_SMS_BASE_438_20090816 NULL
JLCRM DW_IMEI_USER_MM_434 DW_IMEI_USER_MM200509
第一列是用戶名,第二列是表名,第三列是分區名。
我要實現的功能是,并發度300個。一起做insert into select 操作。
但我運行時發現,不能并發。每次只有一個insert操作。
麻煩有經驗的朋友幫忙看看,改一下。謝謝。