簡體   English   中英

使用 PHP 備份 SQL Server 數據庫

[英]Backup SQL Server database using PHP

我正在嘗試使用 PHP 備份調用存儲過程的 MS SQL 數據庫。

當我在 SSMS 上執行 de SP 時,一切正常。 但是,當我從 PHP 腳本調用它時,我可以在備份文件夾中看到一個“.bak”,並且在 PHP 完成處理后,BackUp.bak 文件消失了。

下面是存儲過程:

DECLARE @date VARCHAR(10)
SET @date = (SELECT date FROM tbl_date)

Declare @fileName VARCHAR(100)
SET @fileName = ('C:\db_backup\BackUp_' + @date + '.bak')

BACKUP DATABASE DbName
TO DISK = @fileName
   WITH FORMAT,
      MEDIANAME = 'SQLServerBackups',
      NAME = 'Full Backup of DbName';

下面是我稱之為 SP 的 PHP 代碼:

$serverName = "server";
$connectionInfo = array( "Database"=>"DbName", "UID"=>"UserName", "PWD"=>"P@ssword", "CharacterSet"=>"UTF-8", "ReturnDatesAsStrings" => "false");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

$BackupDB = "Exec DBBackup";
sqlsrv_query($conn, $BackupDB);

我正在運行 Apache 2.4.46 和 SQL Server Express 2019。

我的目標是使用 PHP 創建一個“.bak”文件。

我嘗試使用 SP,因為原始代碼是用 Classic ASP 編寫的,並且它以這種方式完美運行。

我願意嘗試不同的方法。

謝謝你。

說明:

您正在使用 SQL Server 的 PHP 驅動程序,因此以下說明是解決您問題的附加選項:

  • 看來這個問題可能是驅動程序特定的問題。 SQL Server 用批處理創建的結果集填充連接的輸出緩沖區 - 有關受影響行數的信息(例如,在INSERT\\DELETE\\UPDATE語句的情況下)或進度狀態(從BACKUP\\RESTORE DATABADE返回) BACKUP\\RESTORE DATABADE語句)。 這些結果集必須由 PHP 腳本處理。 這種行為似乎是設計使然,PHP 腳本應該刷新所有掛起的結果集。 獲取結果集后,SQL Server 完成批處理的執行。 您需要使用的適當函數\\方法是sqlsrv_next_result() (對於驅動程序的 SQLSRV 版本)和PDOStatement::nextRowset() (對於驅動程序的 PDO_SQLSRV 版本)。
  • 對於 SQLSRV 版本的驅動程序,您需要使用sqlsrv_configure("WarningsReturnAsErrors", 0);更改錯誤和警告處理sqlsrv_configure("WarningsReturnAsErrors", 0); .

例子:

我能夠從問題中重現該問題,以下示例是有效的解決方案:

使用 SQLSRV 版本的驅動程序:

<?php
// Server information
$server   = "server\instance,port";
$database = "database";
$uid      = "username"; 
$pwd      = "password";

// Configuration
sqlsrv_configure("WarningsReturnAsErrors", 0);

// Connection
$cinfo = array(
    "UID" => $uid,
    "PWD" => $pwd,
    "Database" => $database
);
$conn = sqlsrv_connect($server, $cinfo);
if ($conn === false) {
    echo "Unable to connect.";
    die( print_r( sqlsrv_errors(), true));
}

// Statement
$sql = "
    DECLARE @date VARCHAR(19)
    SET @date = CONVERT(VARCHAR(19), GETDATE(), 126)
    SET @date = REPLACE(@date, ':', '-')
    SET @date = REPLACE(@date, 'T', '-')
    
    DECLARE @fileName VARCHAR(100)
    SET @fileName = ('d:\backup\BackUp_' + @date + '.bak')
    
    BACKUP DATABASE dbname
    TO DISK = @fileName
    WITH 
        FORMAT,
        STATS = 1, 
        MEDIANAME = 'SQLServerBackups',
        NAME = 'Full Backup of dbname';
";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
    echo "Unable to execute query.";
    die( print_r( sqlsrv_errors(), true));
}

// Clear buffer
while (sqlsrv_next_result($stmt) != null){};
echo "Success";

// End
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

使用 PDO_SQLSRV 版本的驅動程序:

<?php
// Server information
$server   = "server\instance,port";
$database = "database";
$uid      = "username"; 
$pwd      = "password";

// Connection
try {
    $conn = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server".$e->getMessage());
}

// Statement
$sql = "
    DECLARE @date VARCHAR(19)
    SET @date = CONVERT(VARCHAR(19), GETDATE(), 126)
    SET @date = REPLACE(@date, ':', '-')
    SET @date = REPLACE(@date, 'T', '-')
    
    DECLARE @fileName VARCHAR(100)
    SET @fileName = ('d:\backup\BackUp_' + @date + '.bak')
    
    BACKUP DATABASE dbname
    TO DISK = @fileName
    WITH 
        FORMAT,
        STATS = 1, 
        MEDIANAME = 'SQLServerBackups',
        NAME = 'Full Backup of dbname';
";
try {
    $stmt = $conn->prepare($sql);
    $stmt->execute();
} catch (PDOException $e) {
    die ("Error executing query. ".$e->getMessage());
}

// Clear buffer
try {
    while ($stmt->nextRowset() != null){};
    echo "Success";
} catch (PDOException $e) {
    die ("Error executing query. ".$e->getMessage());
}

// End
$stmt = null;
$conn = null;
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM