php 备份mysql (1)
作者:shenmeng 发布时间:December 13, 2009 分类:默认分类
用php备份数据库成 *.sql ,输出成和mysqldump一样的文件,原理就是逐条取出数据,然后按照mysqldump文件格式写入文本。定义一个将单独数据表导出成字符串的函数,传入表名称,返回字符串:
function tabledump($table) {
$tabledump = "DROP TABLE IF EXISTS `$table`;\r\n";
//取得创建数据表的语句
$query = "SHOW CREATE TABLE `$table`";
$result = mysql_fetch_array(mysql_query($query));
$tabledump .= $result[1] . ";\r\n\r\n";
$tabledump .= "LOCK TABLES `$table` WRITE;\r\n";
$tabledump .="INSERT INTO `$table` VALUES ";
$rows = mysql_query("SELECT * FROM `$table`");
//字段数
$num_fields = mysql_num_fields($rows);
//记录数
$num_rows = mysql_num_rows($rows);
//记录计数
$counter_rows = 0 ;
//一次循环写入一个记录
while ($row = mysql_fetch_array($rows)){
$tabledump .= "(";
//一次循环写入一个字段
for($field = 0 ;$field < $num_fields ;$field ++){
switch(mysql_field_type($rows ,$field)){
//判断字段类型,数字类型数据不加引号,字符类加引号。
case "blob":
case "string":
case "date":
case "datetime":
case "time":
case "unknown":
if(!is_null($row[$field]))
//此处判断值是否为NULL,
//若不判断,写入时就会把NULL当成空字符串。
$tabledump.="'".mysql_escape_string($row[$field])."'";
else
$tabledump .= "NULL";
break;
case "int":
case "real":
case "timestamp":
default:
$tabledump .= mysql_escape_string($row[$field]);
break;
}
//不是最后一个字段就加逗号
if($field != ($num_fields -1)){
$tabledump .= ",";
}
}
//最后一个记录加右括号和分号。加入UNLOCK TABLES;
//不是最后一个记录加右括号和逗号
if($counter_rows == $num_rows -1){
$tabledump .=");\r\nUNLOCK TABLES;\r\n\r\n";
}else{
$tabledump .="),";
}
$counter_rows ++;
}
mysql_free_result($rows);
return $tabledump ;
}
调用函数备份整个数据库:
header("Content-type:text/html;charset=UTF-8");
//数据库参数:主机、数据库用户名、密码、要备份的数据库
$db_host= "localhost";
$db_user= "root";
$db_pass= "pass";
$db_name= "typecho";
//数据库连接,并选择数据库
if(!(@$link = mysql_connect($db_host, $db_user,$db_pass)))
die("Error : " . mysql_error());
if(!(@mysql_select_db($db_name)))
die("Error : " . mysql_error());
//指定使用utf8编码
mysql_query("SET NAMES utf8");
//取得数据库表名
$tables = mysql_query("SHOW TABLES FROM $db_name");
//打开备份文件,文件名为 日期加数据库名
$backup_file = date("Ymd", time()) . $db_name ;
$filehandle = fopen($backup_file . ".sql", "w");
//存储sql语句的字符串
$dump ='';
//备份,每循环一次备份一个表
while ($table = mysql_fetch_row($tables)) {
$dump .= tabledump($table[0]);
}
//写入备份文件
if ($filehandle) {
fwrite($filehandle, $dump);
} else {
die("无法打开备份文件,程序退出");
}
mysql_close($link);
fclose($filehandle);
已有 2 条评论 »
转载过去了~
值得转就转,呵呵