前段时间维护一个项目,搞错需求。导致以为是翻新。。。把整个库拷贝了份。。(文件来源貌似是用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分钟导入~