时光绘梦集
0
位置:PHP正文

散人玩家 2025/05/09 周5

php导出mysql数据库备份

我在虚拟主机管理面板遇到了无法下载mysql数据库备份的情况,因为数据库备份目录无权限,就想到了用php手动导出mysql数据库备份到网站目录,然后再下载备份的数据库文件。

代码分享如下:

<?php
#mysql数据库连接
const MYSQL=['host','user','pass','dbname'];

#备份文件
$backup_file = __DIR__ .'/'.date('YmdHis').'.sql.gz';

$mysqli = new mysqli(MYSQL[0],MYSQL[1],MYSQL[2],MYSQL[3]);
$mysqli->set_charset("utf8");

// 获取所有表名
$tables = $mysqli->query("SHOW TABLES");
if (!$tables) {
    die("获取表失败: " . $mysqli->error);
}

// 生成备份内容
$backup_content = "\n\n";
while ($table = $tables->fetch_row()) {
    $table_name = $table[0];
    // 生成表结构
    $create_table = $mysqli->query("SHOW CREATE TABLE `$table_name`");
    $create_table_sql = $create_table->fetch_row()[1];
    $backup_content .= "-- 表结构:$table_name\nDROP TABLE IF EXISTS `$table_name`;\n".$create_table_sql . ";\n\n";
    // 导出表数据
    $rows = $mysqli->query("SELECT * FROM `$table_name`");
    if ($rows->num_rows > 0) {
        $backup_content .= "-- 数据:$table_name\nLOCK TABLES `$table_name` WRITE;\n\nINSERT INTO `$table_name` VALUES";
    $top=true;
        while ($row = $rows->fetch_assoc()) {
            $columns = array_map(function ($col) use ($mysqli) {
                if (is_string($col) && preg_match('/[\x80-\xFF]/', $col)) {
                    // 处理可能的二进制数据,转换为十六进制
                    return '0x' . bin2hex($col);
                }
                return "'" . $mysqli->real_escape_string($col) . "'";
            }, array_values($row));
    if(!$top){$backup_content .=',';}
            $backup_content .= "(" . implode(', ', $columns) . ")";
        $top=false;
        }
        $backup_content .= ";\n\nUNLOCK TABLES;\n";
    }
}
// 对备份内容进行 GZ 压缩
$compressed_content = gzencode($backup_content, 9);

// 写入文件
if (file_put_contents($backup_file, $compressed_content) !== false) {
    $ret="数据库导出成功";
} else {
    $ret="数据库导出失败:无法写入文件";
}
$mysqli->close();