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