php实现mysql数据库的备份和还原
基本代码参照自 http://my.oschina.net/netljx/blog/11104
备份的主要php代码:
<?php
require_once '../modules/all_table.php';
//该文件提供一些必要的配置参数,如$cfg_dbhost,$cfg_dbuser,$cfg_dbpwd,$cfg_dbname等
@header("Expires: -1");
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");//禁止缓存
header("Content-Type: application/json; charset=utf-8");
$dbhost = $cfg_dbhost; //数据库主机名
$dbuser = $cfg_dbuser; //数据库用户名
$dbpass = $cfg_dbpwd; //数据库密码
$dbname = $cfg_dbname; //数据库名
$filename=date("Y-m-d_H-i-s")."-".$dbname.".sql";
$tmpFile = str_replace('\\','/',(dirname(__FILE__)))."/backupdb/".$filename;
//备份文件存放的目录,当前php代码文件下的backupdb文件夹下
$cmd=$mysqldump_dir."mysqldump -h$dbhost -u$dbuser -p$dbpass $dbname > ".$tmpFile;
//最重要的一点是$mysqldump_dir目录
前面用网上的代码去实现都不能备份,原因就是,没有用$mysqldump_dir,该变量为mysql的bin文件夹位置
例如:我的mysql是安装在D:\myEnv\下,所以$mysqldump_dir=D:\myEnv\mysql\bin 因为程序要调用mysqldump方法是用到D:\myEnv\mysql\bin下的mysqldump.exe。所以要指定位置。下面还原数据库方法也是一样。
exec($cmd);
echo "<tr><td colspan='2' style='font-size:15px;text-align:center;' nowrap>数据库备份信息</td></tr>";
echo "<tr><td nowrap>备份文件名</td><td>".$filename."</td></tr>";
echo "<tr><td nowrap>备份文件目录</td><td>".str_replace('\\','/',$tmpFile)."</td></tr>";
echo "<tr><td nowrap>操作命令</td><td style='color:green;'>".$cmd."</td></tr>";
if (filesize($tmpFile)>0){
//文件大小>0说明已经写入咯内容,到目前位置,我还没找到比较好的方法判断exec(
$cmd)命令执行成功,所以采用的这种方法。
echo "<tr><td colspan='2' style='font-size:15px;color:#006600' nowrap>数据库备份成功</td></tr>";
}
else{
echo "<tr><td colspan='2' style='font-size:15px;color:red' nowrap>数据库备份失败</td></tr>";
echo "<tr><td nowrap>提示信息</td><td style='color:red;'>".$cmd."</td></tr>";
}
exit;
?>
数据库还原的主要代码:
<?php
require_once((dirname(__FILE__).'/../modules/all_table.php'));
@header("Expires: -1");
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
header("Content-Type: application/json; charset=utf-8");
if ( !empty( $_POST['sqlFile'] ) )
{
$file_name = $_POST['sqlFile']; //要导入的SQL文件名
$file_name=str_replace('\\','/',$file_name);
if (strstr($file_name,'/')){
$file_name=substr($file_name,strrpos($file_name,"/")+1);
}
$back_name=substr($file_name,strrpos($file_name,"."));
$dbhost = $cfg_dbhost; //数据库主机名
$dbuser = $cfg_dbuser; //数据库用户名
$dbpass = $cfg_dbpwd; //数据库密码
$dbname = $cfg_dbname; //数据库名
if($back_name!='.sql'){
echo "<br><span style='color:red;'>只能导入sql文件,禁止导入其他文件</span>";
exit();
}
//如果换文件存储目录需要修改
$filepath = str_replace('\\','/',(dirname(__FILE__)))."/backupdb/".$file_name;
$fp = @fopen($filepath, "r") or die("不能打开SQL文件 $filepath");//打开文件
mysql_connect($dbhost, $dbuser, $dbpass) or die("不能连接数据库 $dbhost");//连接数据库
mysql_select_db($dbname) or die ("不能打开数据库 $dbname");//打开数据库
echo "<p>正在清空数据库,请稍等....<br>";
$result = mysql_query("SHOW tables");
while ($currow=mysql_fetch_array($result))
{
mysql_query("drop TABLE IF EXISTS $currow[0]");
echo "清空数据表【".$currow[0]."】成功!<br>";
}
echo "<br>恭喜你清理MYSQL成功<br>";
echo "正在执行导入数据库操作<br>";
// 导入数据库的MySQL命令
exec($mysqldump_dir."mysql -h$dbhost -u$dbuser -p$dbpass $dbname < ".$filepath);
//$mysqldump_dir同备份代码原理一样,如果是备份和还原本地代码,-h$dbhost参数可以删除。
echo "<br/><span style='color:green;'>数据库还原成功!</span><br/>".$time=date("Y-m-d H:i:s" ,time());
echo "<br/>【数据库命令】".$mysqldump_dir."mysql -h$dbhost -u$dbuser -p$dbpass $dbname < ".$filepath;
mysql_close();
exit();
}
else{
echo "<br><span style='color:red;'>请导入备份数据库文件</span>";
}
?>
网页:
<form id="restore" name="restore" method="post" action="">
<fieldset style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; PADDING-BOTTOM: 8px; PADDING-TOP: 8px; HEIGHT: 60%">
<legend style="MARGIN-BOTTOM: 10px;width:auto;" ><b>数据库还原</b></legend>
<table>
<tr><td> </td><td> </td></tr>
<tr>
<th>
【数据库SQL文件】:
</th>
<td>
<input class='file1' type="file" name="sqlFile" id="sqlFile" >
</td>
</tr>
<tr><td colspan='2' align="center"> </td></tr>
<tr><td colspan='2' align="center"><input class='b' type="button" onclick='Restore()' value="还原"></td></tr>
</table>
</fieldset>
</form>
重点是还原和备份代码调用exec()方法时的
$mysqldump_dir.。