You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下PHP备份SQL Server数据库失败问题求助

问题描述

在Ubuntu Server 22.04系统中,使用SQL Server 2022 Express和PHP 8.3执行数据库备份命令BACKUP DATABASE WEBDEV TO DISK = '/temp/WEBDEV.bak'时遇到以下问题:

  • 通过SQL Server Management Studio执行该命令可正常生成备份文件
  • 通过PHP代码执行时,页面显示“Backup completed successfully”,但实际未创建备份文件
  • /temp/目录已设置为777权限,问题仍存在
  • SQL Server错误日志仅提示:

BACKUP failed to complete the command BACKUP DATABASE WEBDEV. Check the backup application log for detailed messages.

  • 无法找到详细的备份应用日志

使用的PHP代码如下:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$conn = new PDO("sqlsrv:server=localhost;database=WEBDEV;TrustServerCertificate=true", "bkuser", "thepassword");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "BACKUP DATABASE WEBDEV TO DISK = '/temp/WEBDEV.bak'";
try {
    $conn->exec($sql);
    echo "Backup completed successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}
解决思路

1. 验证SQL Server服务用户的实际权限

Linux上SQL Server默认以mssql用户运行,即使/temp/设为777,也可能存在父目录权限限制或SELinux约束:

  • 执行sudo -u mssql touch /temp/test.bak,如果无法创建文件,说明mssql用户权限不足
  • 若SELinux处于enforcing模式,执行sudo chcon -t mssql_data_t /temp/为目录设置正确的SELinux上下文

2. 改用SQL Server默认备份目录

SQL Server在Linux上的默认备份目录/var/opt/mssql/data/已配置好权限和SELinux规则,尝试修改备份路径:

BACKUP DATABASE WEBDEV TO DISK = '/var/opt/mssql/data/WEBDEV.bak'

测试是否能生成备份文件,排除路径权限问题。

3. 捕获SQL Server底层错误信息

PHP PDO可能未捕获到完整的SQL Server错误,可扩展代码获取更详细的错误:

try {
    $stmt = $conn->query($sql);
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        print_r($row);
    }
    echo "Backup completed successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
    // 获取SQL Server原生错误信息
    $errors = $conn->errorInfo();
    print_r($errors);
}

4. 查看完整的SQL Server日志

SQL Server在Linux上的备份日志与错误日志合并,路径为/var/opt/mssql/log/errorlog,执行tail -f /var/opt/mssql/log/errorlog实时监控,执行备份命令时观察是否有更具体的错误提示(如权限拒绝、磁盘空间不足)。

5. 确认数据库用户的备份权限

确保bkuser拥有BACKUP DATABASE权限,执行以下SQL授权:

USE master;
GRANT BACKUP DATABASE TO bkuser;

授权后重新测试PHP备份代码。

6. 检查磁盘剩余空间

执行df -h /temp/查看目标磁盘剩余空间,避免因磁盘满导致备份失败。


内容的提问来源于stack exchange,提问作者Roberto Guerrero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:07:11