当前位置:首页 > PHP

php实现数据备份

2026-02-16 06:15:07PHP

PHP实现数据备份的方法

使用MySQL命令行工具

通过PHP的exec()shell_exec()函数调用系统命令实现MySQL数据库备份。以下代码示例展示如何备份指定数据库:

$dbHost = 'localhost';
$dbUser = 'username';
$dbPass = 'password';
$dbName = 'database_name';
$backupFile = 'backup_' . 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 "数据库备份失败";
}

使用PHP原生MySQL函数

对于无法使用命令行工具的环境,可以通过PHP的MySQL函数逐表备份数据:

php实现数据备份

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

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

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

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

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

$backupFile = 'backup_' . date("Y-m-d-H-i-s") . '.sql';
$handle = fopen($backupFile, 'w+');
fwrite($handle, $backupContent);
fclose($handle);

使用PDO实现数据备份

对于使用PDO连接数据库的情况,可以采用以下方法:

try {
    $pdo = new PDO('mysql:host=localhost;dbname=database_name', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
    $backupContent = "";

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

        $rows = $pdo->query("SELECT * FROM `$table`")->fetchAll(PDO::FETCH_ASSOC);
        if (count($rows) > 0) {
            $columns = array_keys($rows[0]);
            $backupContent .= "INSERT INTO `$table` (`" . implode('`, `', $columns) . "`) VALUES \n";

            $values = array();
            foreach ($rows as $row) {
                $rowValues = array();
                foreach ($row as $value) {
                    $rowValues[] = $pdo->quote($value);
                }
                $values[] = "(" . implode(', ', $rowValues) . ")";
            }
            $backupContent .= implode(",\n", $values) . ";\n\n";
        }
    }

    $backupFile = 'backup_' . date("Y-m-d-H-i-s") . '.sql';
    file_put_contents($backupFile, $backupContent);

} catch (PDOException $e) {
    echo "备份失败: " . $e->getMessage();
}

定时自动备份

结合Linux的crontab可以实现定时自动备份:

php实现数据备份

# 编辑crontab
crontab -e

# 添加以下内容,每天凌晨3点执行备份
0 3 * * * /usr/bin/php /path/to/backup_script.php

备份文件压缩

为节省存储空间,可以对备份文件进行压缩:

$backupFile = 'backup_' . date("Y-m-d-H-i-s") . '.sql';
$gzBackupFile = $backupFile . '.gz';

// 创建备份文件内容...
// $backupContent = ...

file_put_contents($backupFile, $backupContent);
$gz = gzopen($gzBackupFile, 'w9');
gzwrite($gz, file_get_contents($backupFile));
gzclose($gz);
unlink($backupFile); // 删除原始SQL文件

备份到远程服务器

通过FTP将备份文件传输到远程服务器:

$ftpServer = 'ftp.example.com';
$ftpUser = 'username';
$ftpPass = 'password';
$remoteFile = 'backups/' . basename($backupFile);

$connId = ftp_connect($ftpServer);
$loginResult = ftp_login($connId, $ftpUser, $ftpPass);

if (ftp_put($connId, $remoteFile, $backupFile, FTP_BINARY)) {
    echo "备份文件已成功上传到远程服务器";
} else {
    echo "上传备份文件失败";
}

ftp_close($connId);

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

相关文章

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节点。每个…