Sauvegarde de bases de données SQL SERVER avec PHP.

Dans le cadre d’un de mes mandats, j’ai dû développer un outil de transfert de bases de données d’un serveur à un autre via une interface Web.
J’ai donc décidé de le faire en PHP pour les références disponibles.

Dans les faits, une sauvegarde de bases de données devrait être prise et ensuite restaurée sur un autre serveur. Pour effectuer la connexion avec SQL SERVER, j’ai téléchargé le pilote SQL SERVER pour PHP sur le site de Microsoft.

Lors de la prise de la copie de sauvegarde avec l’outil, je recevais le message 3041. La sauvegarde s’arrêtait après quelques pages sauvegardées.
J’ai donc décidé de vérifier le tout sur internet et le seul message que j’ai trouvé était de placer un usleep(600) après la commande de backup.

Cela n’a fonctionné que partiellement. J’ai donc décidé d’ouvrir une demande d’aide sur le forum de Microsoft.

La réponse reçue a résolu mon problème. Voici donc ce qui a été envoyé par la personne de Microsoft et qui est très cohérente.

 

header(‘content-type: text/plain;charset=UTF-8’);

$query = ”

BACKUP DATABASE dbname TO DISK = N’C:\\dbname.bak’

WITH NOFORMAT, NOINIT, NAME = N’dbname Database Backup Test’,

SKIP, NOREWIND, NOUNLOAD

“;

$conn = sqlsrv_connect(‘SERVER’,array(‘UID’=>’USER’, ‘PWD’=>’PASSWORD’,’Database’=>’master’,’CharacterSet’=>’UTF-8′));

if ( !$conn )

{

    print_r(sqlsrv_errors());

    exit;

}

sqlsrv_configure(“WarningsReturnAsErrors”, 0);

if ( ($stmt = sqlsrv_query($conn, $query)) )

{

    do

    {

        print_r(sqlsrv_errors());

        echo ” * —End of result — *\r\n”;

    } while ( sqlsrv_next_result($stmt) ) ;

    sqlsrv_free_stmt($stmt);

}

sqlsrv_configure(“WarningsReturnAsErrors”, 1);

sqlsrv_close($conn);

En fait, étant donné que la commande de backup retourne des résultats tout au long du processus de sauvegarde, php voit cela comme un message d’erreur. C’est pour cela que le usleep (600) fonctionne que partiellement. L’utilisation de la boucle avec sqlsrv_next_result($stmt)pour vérifier les messages tout au long de la sauvegarde est nécessaire. La désactivation des messages d’avertissements est désactivée également avec sqlsrv_configure(“WarningsReturnAsErrors”, 0);.

Espérant que cela pourra aider quelqu’un d’autre.