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