当前位置:首页 > PHP

php实现数据库备份

2026-04-03 05:34:16PHP

使用 mysqldump 命令备份数据库

通过 PHP 的 exec()shell_exec() 函数调用系统命令 mysqldump 实现备份。需要确保服务器已安装 MySQL 客户端工具,且 PHP 有执行系统命令的权限。

$dbHost = 'localhost';
$dbUser = 'username';
$dbPass = 'password';
$dbName = 'database_name';
$backupFile = '/path/to/backup/' . $dbName . '_' . date("Y-m-d_H-i-s") . '.sql';

$command = "mysqldump --host={$dbHost} --user={$dbUser} --password={$dbPass} {$dbName} > {$backupFile}";
exec($command, $output, $returnVar);

if ($returnVar === 0) {
    echo "备份成功,文件保存在: " . $backupFile;
} else {
    echo "备份失败,错误代码: " . $returnVar;
}

使用 PHP MySQLi 扩展逐表备份

通过 MySQLi 查询数据库结构及数据,逐表生成 SQL 语句并写入文件。适合无系统命令执行权限的环境。

php实现数据库备份

$db = new mysqli('localhost', 'username', 'password', 'database_name');
$backupFile = '/path/to/backup/backup_' . date("Y-m-d_H-i-s") . '.sql';
$handle = fopen($backupFile, 'w');

// 获取所有表名
$tables = $db->query("SHOW TABLES");
while ($table = $tables->fetch_array()) {
    $tableName = $table[0];
    fwrite($handle, "-- 表结构: {$tableName}\n");

    // 导出表结构
    $createTable = $db->query("SHOW CREATE TABLE {$tableName}")->fetch_array();
    fwrite($handle, $createTable[1] . ";\n\n");

    // 导出表数据
    $rows = $db->query("SELECT * FROM {$tableName}");
    while ($row = $rows->fetch_assoc()) {
        $values = array_map([$db, 'real_escape_string'], $row);
        fwrite($handle, "INSERT INTO {$tableName} VALUES ('" . implode("', '", $values) . "');\n");
    }
    fwrite($handle, "\n");
}

fclose($handle);
$db->close();

使用 PDO 实现数据备份

通过 PDO 获取数据并生成 SQL 文件,兼容多种数据库类型。

php实现数据库备份

$pdo = new PDO('mysql:host=localhost;dbname=database_name', 'username', 'password');
$backupFile = '/path/to/backup/backup_' . date("Y-m-d_H-i-s") . '.sql';
$handle = fopen($backupFile, 'w');

// 获取所有表名
$tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
foreach ($tables as $table) {
    fwrite($handle, "-- 表结构: {$table}\n");

    // 导出表结构
    $createTable = $pdo->query("SHOW CREATE TABLE {$table}")->fetch(PDO::FETCH_ASSOC);
    fwrite($handle, $createTable['Create Table'] . ";\n\n");

    // 导出表数据
    $rows = $pdo->query("SELECT * FROM {$table}");
    while ($row = $rows->fetch(PDO::FETCH_ASSOC)) {
        $values = array_map([$pdo, 'quote'], $row);
        fwrite($handle, "INSERT INTO {$table} VALUES (" . implode(", ", $values) . ");\n");
    }
    fwrite($handle, "\n");
}

fclose($handle);

备份文件压缩与下载

将生成的 SQL 文件压缩为 ZIP 格式,并提供下载链接。

$backupFile = '/path/to/backup/backup.sql';
$zipFile = '/path/to/backup/backup.zip';

// 创建 ZIP 文件
$zip = new ZipArchive();
if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
    $zip->addFile($backupFile, 'backup.sql');
    $zip->close();

    // 提供下载
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . basename($zipFile) . '"');
    readfile($zipFile);
    unlink($zipFile); // 删除临时文件
}

定时自动备份

结合 Cron 任务实现定时备份。创建 PHP 脚本后,通过服务器 Cron 设置定期执行。

# 每天凌晨 3 点执行备份
0 3 * * * /usr/bin/php /path/to/backup_script.php

注意事项

  • 确保备份目录有写入权限。
  • 敏感数据库信息应避免硬编码,建议使用配置文件或环境变量。
  • 大数据库备份可能消耗较多内存,需调整 PHP 内存限制。
  • 定期清理旧备份文件,避免磁盘空间不足。

标签: 备份数据库
分享给朋友:

相关文章

react如何连接mssql数据库

react如何连接mssql数据库

在React中连接MSSQL数据库 React本身是前端框架,不直接连接数据库。需要通过后端服务(如Node.js)与MSSQL交互,React再通过API调用后端。以下是完整方案: 后端服务搭建(…

react如何请求数据库数据

react如何请求数据库数据

在React中请求数据库数据的常见方法 React本身是一个前端库,不直接与数据库交互。通常需要通过后端API或服务来间接访问数据库。以下是几种常见实现方式: 使用Fetch API与后端通信 通过…

php实现数据库连接池

php实现数据库连接池

PHP 实现数据库连接池的方法 PHP 本身没有内置的数据库连接池功能,但可以通过多种方式实现类似效果。以下是几种常见的方法: 使用 PDO 持久连接 PDO 支持持久连接,可以在多个请求之间保持连…

js实现数据库操作

js实现数据库操作

JavaScript 实现数据库操作的方法 JavaScript 可以通过多种方式操作数据库,包括浏览器端的本地存储、服务器端的数据库连接以及使用 ORM 框架等。以下是几种常见的实现方法: 浏览器…

java如何连接mysql数据库

java如何连接mysql数据库

加载MySQL驱动 确保项目中包含MySQL的JDBC驱动。可以通过Maven添加依赖: <dependency> <groupId>mysql</groupI…

java如何取出数据库数据

java如何取出数据库数据

使用JDBC连接数据库 确保已加载JDBC驱动,建立数据库连接。以MySQL为例,驱动类名为com.mysql.cj.jdbc.Driver,连接URL格式为jdbc:mysql://hostname…