用perl做數(shù)據(jù)庫遷移,從MSSQL到MYSQL(三)

用perl做數(shù)據(jù)庫遷移,從MSSQL到mysql(三)–V1.1版~多線程+handlerSocket 從前邊的程序的運行情況來看,程序是可以運行的,但速度太扯了,在讀寫1000W條之前速度還是可以的(大概2000條/秒左右),但過了1000W之后(變成400條/秒左右),當然這個與SQL SERV

用perl做數(shù)據(jù)庫遷移,從MSSQL到MYSQL(三)–V1.1版~多線程+handlerSocket

從前邊的程序的運行情況來看,程序是可以運行的,但速度太扯了,在讀寫1000w條之前速度還是可以的(大概2000條/秒左右),但過了1000w之后(變成400條/秒左右),香港虛擬主機,當然這個與sql server讀取,網(wǎng)絡(luò)還有服務(wù)器等性能都是有關(guān)系的,但,這速度,不曉得有測試過的朋友受不受不了,我反正是受不了的,于是想了下,單線程慢,咱得改吧。改成多線程,多進程嘛。

另外再啰嗦一句,經(jīng)小弟實測,改之后,效率真是快很多。。。。

不再啰嗦,直接上代碼吧。

DBI; 3 use Switch; 4 use strict; 5 use Net::HandlerSocket; 6 use threads; ::HiRes ; = ; = ; = ; =; = ; = 9999; =DBI->,$source_user_name,$source_user_psd); 19 #獲取所有的用戶表,不導(dǎo)有地理字段的表 =$dbh->prepare(select name,object_id from sys.all_objects ao where type=’U’ and not exists( ); 23 $sth->execute(); #線程數(shù)。。。這個很糾結(jié),小弟的服務(wù)器,在導(dǎo)的時候,美國服務(wù)器,5個線程以上,服務(wù)器會掛起~~~~ =(not defined $ARGV[0])?5:$ARGV[0]; =(not defined $ARGV[1])?3000:$ARGV[1]; ; 32 while (@data=$sth->fetchrow_array()) 33 { 34 ##測試時用 ($select_columns,$insert_columns,$column_count,$sort_column,$column_types); 37 #獲取某個表的列,并構(gòu)建 查詢,插入,列總數(shù),列類型 38 ##輸入?yún)?shù)如下: 39 ###data[0]:表名,data[1]:對像ID 40 ##返回參數(shù)描述如下: 41 ###$select_columns:構(gòu)建SELECT的時候,列字符串 42 ###$insert_columns:構(gòu)建insert的時候,列字符串。之所以要把這兩分開,因為有些類型在select的時候,會用到列屬性方法,例如geometry.STAsText() 43 ###$column_count:列數(shù),其實可以從@$column_types得到,但@$columns_types是后邊加的,此參數(shù)也就沒有去掉 44 ###$sort_column:用來排序的字段,因為總結(jié)了一下,一般第一個字段都是標識字段,主鍵,因此,這里只取的第一個字段 45 ###$columns_types:列的類型列表,一個數(shù)組。因為sql server里邊的某些類型的值,在進mysql的時候,需要做處理,例如geometry ($select_columns,$insert_columns,$column_count,$sort_column,$column_types)=get_columns($data[0],$data[1]); 48 #查詢結(jié)果。如果是導(dǎo)入失敗,會返回False,否則為空 = export_data_in ($select_columns,$insert_columns,$column_count,$sort_column,$data[0],$column_types); 51 52 } ->disconnect; export_data_in 61 { ($select_columns,$insert_columns,$columns_count,$sort_column,$table_name,$column_types) = @_; =0; =DBI->,$source_user_name,$source_user_psd); =); 67 $sth_sc->execute(); =$sth_sc->fetchrow_array(); = 0; = $per_records1; 72 while($begin_cnt @data_count[0]) 73 { ; (my $count=1;$count$threads_cnt;$count++) 77 { 78 ##基本,香港空間,下邊的SQL語句成了本程序最大的性能瓶頸了。小弟的測試中,前1000W條數(shù)據(jù)還好,但,在1000W條之后,此SQL語句的查詢性能急劇下降,當然,小弟是在遠程測試上邊導(dǎo)的,(當然,我的表沒分區(qū)的,有MSSQL優(yōu)化經(jīng)驗的知道,表是可以分區(qū)的) =select * 81 FROM 82 ( 83 SELECT $select_columns,ROW_NUMBER() OVER (ORDER BY $sort_column) AS RowNum 84 FROM $table_name 85 ) as t ; ; =threads->new(&export_data, $table_name,$sql_select,$insert_columns,$columns_count,$column_types); 91 push(@threads,$res0); 92 $begin_cnt = $begin_cnt + $per_records; 93 $end_cnt = $end_cnt + $per_records; 94 } (@threads) 97 { 98 $_->join; 99 } 100 } } export_data 105 { =time; 107 my ($table_name,$sql_select,$insert_columns,$columns_count,$column_types)=@_; =DBI->,$source_user_name,$source_user_psd); =$dbh_mssql->prepare($sql_select); 111 $sth_select->execute(); 112 $sth_select->{LongTruncOk}=1; =rand(3200); =“”; ; 118 ##還是改成fetchrow_arrayref(),小弟測試了下,這個的速度,真不是之前fetchrow_array能比的 ($select_data=$sth_select->fetchrow_arrayref()) 121 { 122 if($data_str ne “”) 123 { ; 125 } =.,@{; 128 129 } ,time$startTime); 131 $startTime=time; 132 ##測試的時候,查看數(shù)據(jù)的語句。 ($data_str ne “”) 135 { ; = { host => $aim_ip, port => $hs_port }; = new Net::HandlerSocket($args); = , ); ->get_error() if $res != 0; = $hs->execute_multi(eval($data_str)); ->get_error() if $hs->get_error() != 0; 144 $hs->close(); 145 } ; ,time$startTime); #這里啰嗦一下,也給大家展示一下我的結(jié)果 ^-^ 150 # exporting data t_p_areagroup_plate_userdiy_l;total:42758121;now:12825000 151 # exporting data t_p_areagroup_plate_userdiy_l;total:42758121;now:12830000 152 # exporting data t_p_areagroup_plate_userdiy_l;total:42758121;now:12835000 153 # exporting data t_p_areagroup_plate_userdiy_l;total:42758121;now:12840000 154 # exporting data t_p_areagroup_plate_userdiy_l;total:42758121;now:12845000 155 # 讀出時間18.9 seconds. 156 # 寫入時間1.3 seconds. 157 # 讀出時間23.3 seconds. 158 # 寫入時間1.4 seconds. 159 # 讀出時間23.7 seconds. 160 # 寫入時間1.1 seconds. 161 # 讀出時間25.6 seconds. 162 # 寫入時間0.6 seconds. 163 # 讀出時間25.6 seconds. 164 # 寫入時間0.9 seconds. } get_columns 169 { ; =select col.name,tp.name from sys.all_columns col 172 inner join sys.types tp on col.system_type_id=tp.system_type_id and col.user_type_id=tp.user_type_id ; =DBI->,$source_user_name,$source_user_psd); =$dbh2 -> prepare($sql); 176 $cols->execute(); = “”; = “”; = 0; =“”; ; ; 183 while(@col= $cols->fetchrow_array()) 184 { 185 my ($col_name,$type_name)=@col; 186 @cols_types[$cols_count]=$type_name; 187 if($cols_count>0) 188 { ; ; 191 } { ; 195 } ) 197 { ; ; 200 } { ; ; 205 } 206 $cols_count++; 207 } 208 $dbh2->disconnect; 209 ($cols_select,$cols_insert,$cols_count,$sort_column,@cols_types); 210 } 211 212

調(diào)用方法(將運行結(jié)果放到out.log):

1 nohup perl export_data_muti_thread_v0.5.pl 10 5000 > out.log &

?

?

另外再啰嗦一句。。。cnblogs的回復(fù)真不多,哪怕是拍磚也好呀。別這么死氣沉沉的。

posted on

用perl做數(shù)據(jù)庫遷移,從MSSQL到MYSQL(三)

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊14 分享