当前位置:首页 > PHP

php实现数据库备份

2026-01-28 23:49:35PHP

使用 mysqldump 命令

在 PHP 中调用系统命令 mysqldump 是最常见的数据库备份方法。该方法适用于 MySQL 或 MariaDB 数据库。

$dbHost = 'localhost';
$dbUser = 'username';
$dbPass = 'password';
$dbName = 'database_name';
$backupFile = 'backup_' . date('Y-m-d') . '.sql';

$command = "mysqldump --host=$dbHost --user=$dbUser --password=$dbPass $dbName > $backupFile";
system($command);

该方法会生成一个 SQL 文件,包含数据库结构和数据。

使用 PHP 原生函数

对于小型数据库,可以使用 PHP 的数据库函数逐表备份:

php实现数据库备份

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

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

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

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

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

$handle = fopen('backup.sql','w+');
fwrite($handle,$return);
fclose($handle);

使用 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;\n";
    $create = $db->query("SHOW CREATE TABLE $table")->fetch(PDO::FETCH_ASSOC);
    $output .= $create['Create Table'] . ";\n\n";

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

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

定时自动备份

结合 cron 任务可以实现定时自动备份:

php实现数据库备份

// backup.php 文件内容
$filename = 'backup_' . date('Y-m-d') . '.sql.gz';
$command = "mysqldump --host=localhost --user=username --password=password database_name | gzip > $filename";
system($command);

然后在 crontab 中添加:

0 3 * * * /usr/bin/php /path/to/backup.php

备份到远程服务器

将备份文件传输到远程服务器增加安全性:

$localFile = 'backup.sql';
$remoteFile = '/remote/path/backup.sql';
$sshUser = 'username';
$sshHost = 'remote.server.com';

// 生成备份文件
// ...

// 使用 SCP 传输
$command = "scp $localFile $sshUser@$sshHost:$remoteFile";
system($command);

注意事项

数据库备份时应考虑以下安全措施:

  • 不要在 PHP 文件中硬编码数据库凭据
  • 备份文件应存储在 web 根目录之外
  • 对备份文件设置适当的文件权限
  • 考虑加密敏感数据备份
  • 定期测试备份文件的恢复功能

对于大型数据库,建议使用专业备份工具或数据库管理系统自带的功能,PHP 方法更适合中小型数据库的定期备份需求。

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

相关文章

react中如何应用数据库

react中如何应用数据库

在React中应用数据库的方法 React本身是一个前端库,不直接与数据库交互。通常需要通过后端服务或API来连接数据库。以下是几种常见方法: 使用后端API 创建独立的后端服务(如Node.js、…

php实现excel导入数据库

php实现excel导入数据库

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

php实现数据库连接池

php实现数据库连接池

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

java如何查询数据库

java如何查询数据库

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

java如何取出数据库数据

java如何取出数据库数据

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

java如何连数据库

java如何连数据库

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