PHP kullanarak SQL Server veritabanını yedekleyin
PHP kullanarak bir Depolanan Prosedürü çağıran bir MS SQL veritabanını yedeklemeye çalışıyorum.
SSMS'de de SP çalıştırdığımda, her şey yolunda gidiyor. Ancak, onu PHP betiğinden çağırdığımda, yedekleme klasöründe bir ".bak" görüyorum ve PHP işlemeyi tamamladıktan hemen sonra BackUp.bak dosyası kayboluyor.
İşte Depolanan Prosedür:
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 olarak adlandırdığım PHP kodu aşağıdadır:
$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 ve SQL Server Express 2019 çalıştırıyorum.
Amacım PHP kullanarak bir ".bak" dosyası oluşturmak.
Bir SP kullanmayı denedim çünkü orijinal kod Klasik ASP ile yazılmış ve bu şekilde kusursuz çalışıyor.
Farklı yaklaşımları denemeye açığım.
Teşekkür ederim.
Yanıtlar
Açıklamalar:
SQL Server için PHP Sürücüsü kullanıyorsunuz, bu nedenle aşağıdaki açıklamalar sorununuzu çözmek için ek bir seçenektir:
- Görünüşe göre bu sorun muhtemelen sürücüye özgü bir sorun. SQL Server, bağlantının çıktı arabelleğini toplu iş tarafından oluşturulan sonuç kümeleriyle doldurur - etkilenen satırların sayısı hakkında bilgi (
INSERT\DELETE\UPDATEörneğin bir deyim durumunda ) veya ilerleme durumu (BACKUP\RESTORE DATABADEdeyimlerden döndürülür ). Bu sonuç kümeleri PHP betiği tarafından işlenmelidir. Görünüşe göre bu davranış tasarım gereğidir ve PHP betiği bekleyen tüm sonuç kümelerini temizlemelidir. Sonuç kümeleri getirildikten sonra SQL Server, toplu işin yürütülmesini tamamlar.sqlsrv_next_result()Kullanmanız gereken uygun işlevler \ yöntemler (sürücününPDOStatement::nextRowset()SQLSRV sürümü için ) ve ( sürücünün PDO_SQLSRV sürümü için). - Sürücünün SQLSRV sürümü için, hata ve uyarı işlemeyi kullanarak değiştirmeniz gerekir
sqlsrv_configure("WarningsReturnAsErrors", 0);.
Örnekler:
Sorunu sorudan yeniden oluşturabiliyorum ve aşağıdaki örnekler çalışma çözümleri:
Sürücünün SQLSRV sürümünü kullanarak:
<?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);
?>
Sürücünün PDO_SQLSRV sürümünü kullanarak:
<?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;
?>