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

