}
}
#转移数据
my @placeholders = map {'?'} @fields;
my $insert_sql = "INSERT DELAYED INTO $table VALUES(" .(join ', ', @placeholders) . ");n";
my $insert = $target->prepare($insert_sql);
my $select = $src->prepare("SELECT * FROM $table;");
$select->execute;
$select->{'LongReadLen'} = 1000;
$select->{'LongTruncOk'} = 1;
$target->do("SET AUTOCOMMIT = 0;");
$target->do("START TRANSACTION;");
my $rows = 0;
while(my @row = $select->fetchrow_array)
{
$insert->execute(@row);
$rows++;
}
$target->do("COMMIT;");
#结束,输出任务信息
my $elapsed = time - $start;
print "Child process $$ for table $db.$table done, $rows records, $elapsed seconds.n";
exit(0);
}
}
print "Waiting for child processesn";
#等待所有子进程结束
while (wait() != -1) {}
my $total_elapsed = time - $total_start;
print "All tasks from $db finished, $total_elapsed seconds.n";
这个脚本会根据每一个表fork出一个子进程和相应的数据库连接,因此做这种迁移之前得确保目标MySQL数据库配置的最大连接数能承受。
然后在bash下执行
for x in {1..11};do ./qq.pl QunInfo$x; done
for x in {1..11};do ./qq.pl GroupData$x; done
就不用管了,脚本会根据MSSQL这边表结构来在MySQL那边创建一样的结构并配置索引。









