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);

标签: none

已有 2 条评论 »

  1. 11 11 January 2nd, 2010 at 12:28 am

    转载过去了~

    1. shenmeng shenmeng January 3rd, 2010 at 12:49 am

      值得转就转,呵呵

添加新评论 »

captcha
请输入验证码