【问题标题】:Php calling sqlserver backup database script, backup file created and then deletedphp调用sqlserver备份数据库脚本,创建备份文件然后删除
【发布时间】:2018-07-23 11:22:52
【问题描述】:

我有一个调用 sqlserver 备份脚本的 php。 该脚本,如果直接从 SSMS 执行,它会成功创建备份。但是,当通过 php 调用时,我可以看到在目标文件夹中创建的文件,但似乎当 php 完成时,该文件也被删除了。 我在哪里做错了?

PHP:

$strSQL = file_get_contents("archdata.sql");
if (!empty($strSQL)) {
  $query=$conn->prepare($strSQL);
  if ($query->execute()) {
    sleep(5);  
    echo "1";
  } else {
    echo "Error: " . $strSQL;
  }
}

archdata.sql:

SET @path = 'C:\Data\backups\'   
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)  
SET @fileName = @path + 'ProdDB _' + @fileDate + '.BAK' 
BACKUP DATABASE ProdDB TO DISK=@fileName WITH STATS = 1 

【问题讨论】:

  • 不是很合乎逻辑的答案,而是在sql文件末尾写GO
  • 嗨,不,添加 GO 不起作用。

标签: php sql-server pdo backup


【解决方案1】:

这是一个适合我的解决方案:

  • 执行sqlsrv_configure("WarningsReturnAsErrors", 0); 更改错误处理设置。
  • BACKUP DATABASE 语句中删除WITH STATS = 1

我能够通过使用 Apache 2.4、PHP 7.1.12 和 Microsoft PHP Driver for SQL Server(php_sqlsrv_71_ts_x86.dll,4.3 版)的测试用例重现此问题。唯一的区别是该示例使用 SQLSRV 驱动程序(我不能在我的测试环境中使用 PDO_SQLSRV 驱动程序)。

PHP

<?php
    sqlsrv_configure("WarningsReturnAsErrors", 0);

    // Connection
    $serverName = "127.0.0.1\instance,1433";
    $connectionInfo = array(
        "UID"=>"user",
        "PWD"=>"password",
        "Database"=>"ProdDB"
    );
    $conn = sqlsrv_connect($serverName, $connectionInfo);
    if ($conn === false) {
        echo "Unable to connect.</br>";
        die(var_export(sqlsrv_errors(), true));
    }

    // Backup database
    $strSQL = file_get_contents("archdata.sql");
    if (!empty($strSQL)) {
        $query = sqlsrv_query($conn, $strSQL);
        if ($query === false) {
            die(var_export(sqlsrv_errors(), true));
        } else {
            sleep(5);  
            echo "Success";
        }
    }   
?>

T-SQL (archdata.sql)

declare 
    @path varchar(100),
    @fileDate varchar(20),
    @fileName varchar(140)

SET @path = 'd:\Backup\'   
SELECT @fileDate = CONVERT(VARCHAR(20), GETDATE(), 112)  
SET @fileName = @path + 'ProdDB_' + @fileDate + '.BAK' 
BACKUP DATABASE ProdDB TO DISK=@fileName

不要忘记为“D:\Backup”文件夹授予必要的权限。

【讨论】:

  • 谢谢,Zhorov,我没有意识到 WITH STATS = 1 是问题所在。
猜你喜欢
  • 1970-01-01
  • 2022-08-13
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多