解决 navicat 导入大sql文件 ,单行过长问题。

前段时间维护一个项目,搞错需求。导致以为是翻新。。。把整个库拷贝了份。。(文件来源貌似是用mysql自带导出的,具体不清楚)

1g多,不算太多,主要一个问题出在sql是以:

insert into table (row…) values (value…), (value…), (value…)….

单行。。没错。。就是单行。很多sql程序,处理该机制是一直循环识别到换行符号。。导致一个问题。内存不够。在内存比较足的机器足足运行了超过半天还不到一半,没耐性的哥想原因。顺便写了写脚本解决。

$file_source = 'c:/xxxx.sql';
$file_target = 'c:/xxxx2.sql';
$rh = fopen ( $file_source, 'rb' );
$wh = fopen ( $file_target, 'wb' );
if ($rh === false || $wh === false) {
	// error reading or opening file
	return true;
}
$count = 0;
$begin = 0;
$span = 300;
$lasttable = '';
while ( ! feof ( $rh ) ) {
	$line = fgets ( $rh );
	if (preg_match ( '/INSERT INTO `(w+)`/ims', $line, $match )) {

		// if ($lasttable == $match [1])
		// continue;
		// // $line=preg_replace('/', $replacement, $subject)
		$lasttable = $match [1];
		// gddebug ( $line );
		// fputs ( $wh, $line );
		$line = preg_replace ( '/),(/ism', ");n INSERT INTO `{$lasttable}` VALUES (", $line );
		// gddebug ( $line );
		// exit ();
	}
	if (preg_match ( '/^--/ims', $line ))
		continue;
	if (preg_match ( '/^/*/ims', $line ))
		continue;
	if (preg_match ( '/LOCK TABLES/ims', $line ))
		continue;
	if (preg_match ( '/UNLOCK TABLES/ims', $line ))
		continue;
	fputs ( $wh, $line );
	// if ($count > $line) {
	// gddebug ( $line );
	// }
	$count ++;
	// if ($count > $begin + $span)
	// exit ();
	// exit;
}
fclose ( $rh );
echo ($count);

1g文件。40分钟导入~

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注