当前位置:首页 > PHP

php实现数据库备份

2026-02-13 21:57:26PHP

PHP实现数据库备份的方法

使用mysqldump命令

通过PHP的exec()shell_exec()函数调用系统命令mysqldump可以快速备份MySQL数据库。

$db_host = 'localhost';
$db_user = 'username';
$db_pass = 'password';
$db_name = 'database_name';
$backup_file = 'backup_' . date('Y-m-d') . '.sql';

$command = "mysqldump --host=$db_host --user=$db_user --password=$db_pass $db_name > $backup_file";
exec($command);

确保PHP有执行系统命令的权限,并且mysqldump路径已加入系统环境变量。

使用PHP原生MySQL函数

如果无法使用命令行工具,可以通过PHP的MySQL函数逐表备份数据。

$conn = new mysqli('localhost', 'username', 'password', 'database_name');
$tables = array();
$result = $conn->query("SHOW TABLES");

while ($row = $result->fetch_row()) {
    $tables[] = $row[0];
}

$output = '';
foreach ($tables as $table) {
    $result = $conn->query("SELECT * FROM $table");
    $num_fields = $result->field_count;

    $output .= "DROP TABLE IF EXISTS $table;";
    $row2 = $conn->query("SHOW CREATE TABLE $table")->fetch_row();
    $output .= "\n\n" . $row2[1] . ";\n\n";

    while ($row = $result->fetch_row()) {
        $output .= "INSERT INTO $table VALUES(";
        for ($j = 0; $j < $num_fields; $j++) {
            $row[$j] = addslashes($row[$j]);
            $row[$j] = str_replace("\n", "\\n", $row[$j]);
            if (isset($row[$j])) {
                $output .= '"' . $row[$j] . '"';
            } else {
                $output .= '""';
            }
            if ($j < ($num_fields - 1)) {
                $output .= ',';
            }
        }
        $output .= ");\n";
    }
    $output .= "\n\n\n";
}

$backup_file = 'backup_' . date('Y-m-d') . '.sql';
file_put_contents($backup_file, $output);

使用PDO实现备份

PDO提供了更现代的数据库访问方式,适合多种数据库类型。

$db = new PDO('mysql:host=localhost;dbname=database_name', 'username', 'password');
$tables = $db->query('SHOW TABLES')->fetchAll(PDO::FETCH_COLUMN);

$output = '';
foreach ($tables as $table) {
    $output .= "DROP TABLE IF EXISTS $table;";
    $create = $db->query("SHOW CREATE TABLE $table")->fetch(PDO::FETCH_ASSOC);
    $output .= "\n\n" . $create['Create Table'] . ";\n\n";

    $rows = $db->query("SELECT * FROM $table")->fetchAll(PDO::FETCH_ASSOC);
    foreach ($rows as $row) {
        $output .= "INSERT INTO $table VALUES(";
        $values = array_map(function($value) {
            return '"' . str_replace('"', '\"', $value) . '"';
        }, array_values($row));
        $output .= implode(',', $values) . ");\n";
    }
    $output .= "\n\n\n";
}

file_put_contents('backup.sql', $output);

自动备份与压缩

为节省空间,可以自动压缩备份文件。

$backup_file = 'backup_' . date('Y-m-d') . '.sql';
$gzbackup_file = $backup_file . '.gz';

// 生成SQL备份文件后
$data = file_get_contents($backup_file);
$gzdata = gzencode($data, 9);
file_put_contents($gzbackup_file, $gzdata);
unlink($backup_file); // 删除原始SQL文件

定时自动备份

结合crontab可以实现定时自动备份。

php实现数据库备份

# 在服务器crontab中添加(每天凌晨3点执行)
0 3 * * * /usr/bin/php /path/to/backup_script.php

备份脚本需要有写入权限,建议存储在非web可访问目录确保安全。对于大型数据库,建议分批处理或使用专业备份工具。

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

相关文章

php数据库实现

php数据库实现

PHP 连接 MySQL 数据库 使用 mysqli 扩展连接 MySQL 数据库: <?php $servername = "localhost"; $username = "usernam…

php实现excel导入数据库

php实现excel导入数据库

PHP实现Excel导入数据库的方法 准备工作 确保服务器已安装PHPExcel库或PhpSpreadsheet(PHPExcel的后续版本)。可通过Composer安装: composer req…

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…

java如何连数据库

java如何连数据库

连接数据库的基本步骤 在Java中连接数据库通常使用JDBC(Java Database Connectivity)技术。JDBC提供了一套标准接口,允许Java程序与各种数据库进行交互。 添加数据…

java如何连接access数据库

java如何连接access数据库

使用JDBC-ODBC桥连接Access数据库 在Java中连接Access数据库可以通过JDBC-ODBC桥实现,以下是具体步骤: 确保系统已安装Microsoft Access数据库和相应的OD…