【原创】大数据量MySQL文件导入程序
很多使用mysql建站的朋友都会遇到一个问题,就是在向mysql中导入大量数据时遇到各种挫折。使用phpmyadmin导出数据库备份很容易,但是要执行相反的操作简直就是一场恶梦。这段代码就是针对这个问题而写的,起源于今天帮一个朋友恢复一个discuz论坛数据库。
使用前请首先按照代码注释修改要导入的SQL文件名、数据库主机名、数据库用户名、密码、数据库名,同时将数据库文件和本文本一起ftp导网站目录,然后以web方式访问此文件即可。
注:
1、此代码当php运行于safe mode的时候超时设置语句set_time_limit失效,可能会导致导入中途失败,解决办法是将要导入的文件分成多个,逐块导入。
2、本部分代码是今天刚刚出炉,只是经过简单的测试,证明其可运行于负翁自己的计算机和朋友的服务器上,并不一定适合所有的php/mysql环境。欢迎跟贴反馈意见。
3、落伍(www.im286.com)负翁版权所有,可随意使用,但请保留版权信息
下载地址(因为目前512j空间限制了泛域名解析导致下载失效,与客服沟通未果:(,等找到好的空间后再提供下载吧)
[url=http://temp.ebugs.org/temp/im286/importsql.rar]http://temp.ebugs.org/temp/im286/importsql.rar[/url]
[code]
<?
/******************************************/
/* PhyMyAdmin Data Importer */
/* www.ebugs.org */
/* Copyright 富翁 in im286.com 2005.04.09 */
/* 转载请注明出处 */
/******************************************/
//用来快速Mysql的大数据备份
//使用前请首先按照代码注释修改要导入的SQL文件名、数据库主机名、数据库用户名、密码、数据库名
//同时将数据库文件和本文本一起ftp导网站目录,然后以web方式访问此文件即可
//落伍(www.im286.com)负翁版权所有,可随意使用,但保留版权信息
$file_name="a.sql"; //要导入的SQL文件名
$dbhost="localhost"; //数据库主机名
$dbuser="anonymous"; //数据库用户名
$dbpass=""; //数据库密码
$dbname="test"; //数据库名
set_time_limit(0); //设置超时时间为0,表示一直执行。当php在safe mode模式下无效,此时可能会导致导入超时,此时需要分段导入
$fp = @fopen($file_name, "r") or die("不能打开SQL文件 $file_name");//打开文件
mysql_connect($dbhost, $dbuser, $dbpass) or die("不能连接数据库 $dbhost");//连接数据库
mysql_select_db($dbname) or die ("不能打开数据库 $dbname");//打开数据库
echo "正在执行导入操作<span><br>";
while($SQL=GetNextSQL()){
if (!mysql_query($SQL)){
echo "<font color=red>执行出错:".mysql_error()."</font><br>";
echo "SQL语句为:<br>".$SQL."<br>";
};
}
echo "导入完成</span>";
fclose($fp) or die("Can't close file $file_name");//关闭文件
mysql_close();
//从文件中逐条取SQL
function GetNextSQL() {
global $fp;
$sql="";
while ($line = @fgets($fp, 40960)) {
$line = trim($line);
//以下三句在高版本php中不需要,在部分低版本中也许需要修改
$line = str_replace("\\\\","\\",$line);
$line = str_replace("\'","'",$line);
$line = str_replace("\\r\\n",chr(13).chr(10),$line);
// $line = stripcslashes($line);
if (strlen($line)>1) {
if ($line[0]=="-" && $line[1]=="-") {
continue;
}
}
$sql.=$line.chr(13).chr(10);
if (strlen($line)>0){
if ($line[strlen($line)-1]==";"){
break;
}
}
}
return $sql;
}
?>
[/code]
可以导入那些工具导出的sql
嗯,是啊。就是为了解决这个问题的。但是测试不充分,因为php和mysql的版本太多了,交叉测试很罗索。
且php和mysql的配置也许还会影响效果。 先来支持一下 谢谢!~ *** 作者被禁止或删除 内容自动屏蔽 *** 占位先 *** 作者被禁止或删除 内容自动屏蔽 *** [quote]Originally posted by [i]long_9[/i] at 2005-4-9 22:31
我是说,能导入从哪些工具导出的数据库?还是任何工具导出的数据库都可以恢复,执行导入?
现在用MYSQL_TOOL导,任何工具下导出的都可以执行导入?你的?????? [/quote]
能导入phpmyadmin导出的数据,如果是写的规范的SQL理论上也应该能导入。
你的MySQL_Tool导的意思是说mysql提供有导入工具吧?
是啊,mysql命令行一句source a.sql就可以实现,但是我们平时做网站是没有机会接触控制台的。
给我们的只有一个ftp+web。 我一般用FAISUNSQL
还有帝国备份也不错 占位~~~~~~~~ 测试了下,倒入30m的sql成功 FAISUNSQ不错。我导过几百M的mysql 我用Mysql-Front导入的...
不过还是支持一下楼主 *** 作者被禁止或删除 内容自动屏蔽 *** 你直接复制代码吧。
目前512j已经要沦落为奸商了,取消泛域名,造成我多个网站域名失效。。。
只好如此了。 512j原来就挺垃圾的 [quote]Originally posted by [i]负翁[/i] at 2005-4-9 22:38
能导入phpmyadmin导出的数据,如果是写的规范的SQL理论上也应该能导入。
你的MySQL_Tool导的意思是说mysql提供有导入工具吧?
是啊,mysql命令行一句source a.sql就可以实现,但是我们平时做网站是没有机会 ... [/quote]
是用工具导出的数据库,不知道你这个能不能导入在其他工具下导出的数据库!:lol: [quote]Originally posted by [i]谢谢合作[/i] at 2005-4-10 09:51
是用工具导出的数据库,不知道你这个能不能导入在其他工具下导出的数据库!:lol: [/quote]
俺的这个只是很简单的一部分,要求的数据格式是标准的mysql数据格式。
即使:
1、每个SQL语句都是以“;”结尾的
2、注释支持以“--”开头的,不支持“/**/”类型的注释。
如果满足这两条,都应该没有问题。
只是里面注释的几句也许根据实际情况调一下,毕竟不同mysql \php\phpmyadmin的版本很多。
且一旦服务器php运行与safe mode情况,那么这个基本就失效了,因为safe mode模式下不允许设置脚本运行时间,一旦超时,则立马byebye,此时只有分段导入 如果在本机上做测试的话还有个方法。是我在CSDN上问到的,拿来大家分享。
我的mysql装在了C:\下 。目的数据库是bb,要导入的sql文件在c:\down\bb.sql
先退出mysql,在mysql\bin目录下执行。
c:\mysql\bin>mysql -uroot -p bb< c:\down\bb.sql
就OK了!如果在本机上做的话不妨试试大家/
