Ciao a tutti, spiego subito il problema che mi ritrovo: devo eseguire dei backup su un SQL SERVER 2000, copiarli su un nuovo server che supporta SQL 2008 ed eseguire quindi i ripristini uno alla volta.
Tenete presente che questo programma dovrebbe spostare circa un migliaio di database anche molto pesanti, relativi ad anni passati e, soprattutto, 146 database del corrente anno una volta al giorno.
Ho creato un programma che esegue i vari passaggi:
- Esegue i vari backup (uno alla volta) dei database che si trovano su un SQL SERVER 2000 con relativa query BACKUP DATABASE che si crea di volta in volta un file di backup in base al nome del database, alla data e all'ora in cui viene eseguito.
- Verifica il corretto backup con la query RESTORE VERIFYONLY.
- Copia il file backup appena creato sul nuovo server e cancella quello presente sul vecchio server.
- Fa il restore sul nuovo server (che come detto, è un SQL SQRVER 2008) con la query di RESTORE DATABASE.
Tutto questo in teoria... perchè il problema principale è che il comando che lancia la query (sqlsrv_query , preciso che il mio programma è lanciato da un terzo server che supporta le librerie PHP di SQL SERVER 2008) è come se venisse interrotto e la query va sempre in errore nonostante i backup o le verifiche o gli stessi ripristini siano andati a buon fine (e questo vuol dire che le query sono corrette anche perchè sono state verificate con il Management Studio).
Io penso che come accade sul Management Studio, dove all'esecuzione della query mi vengono restituiti dei messaggi di completamento delle varie operazioni (ad esempio quando viene eseguito il backup, Man Studio mi ritorna messaggio che mi dicono l'avanzamento della fase di backup, ad esempio "41 percent backed up.") e che questi messaggi vengano interpretati da sqlsrv_query come messaggi di errore e che quindi vada in errore.
Sul manuale ho trovato alcuni stati di errore SQLSTATE che potrebbero anche essere evitati ed infatti ho dovuto creare una funzione di rilevazione di questo tipo di stati e che quindi mi evita la rilevazione dell'errore, di seguito il codice di esempio.
sqlsrv_query($connect, $sql) or trigger_error("La query ha ritornato falso : ".erroriQuerySql2008($backup, $bkPathFile, "Errore durante il Backup del database", $bkDBName, $Log));
//funzione per segnalare più esplicitamente gli errori derivanti dalle query SQL 2008
function erroriQuerySql2008($result, $path, $errore, $bkDBName, $Log){
$errText="";
if($result===false){
if(($errors=sqlsrv_errors())!=null){
foreach($errors as $error){
$errText.="SQLSTATE: ".$error[ 'SQLSTATE']."\n";
$errText.="code: ".$error[ 'code']."\n";
$errText.="message: ".$error[ 'message']."\n";
if($error['SQLSTATE'] == '01000' || $error[ 'SQLSTATE'] == '01001' || $error[ 'SQLSTATE'] == '01003' || $error[ 'SQLSTATE'] == '01S02' ){
$errText = "ma non ci sono errori!!! \n";
return $errText;
}else{
echo $errore;
$array = explode("\", $path);
$Log->BackupLog("Server: ".$array[2]." DB: ".$bkDBName, $errore, basename($_SERVER["PHP_SELF"]));
$GLOBALS['erroriBackup']++;
return $errText;
}
}
}
}
}
Il problema persiste nel momento in cui mi ritrovo di cmq che i restore non vengono effettuati in nessun caso.
In più nel momento in cui provo a fare anche solamente eseguire il tutto per i db del 2012 senza fare i restore molte volte durante la verifica del backup mi ritrovo errori di questo tipo:
SQLSTATE: 42000
code: 3201
message: [Microsoft][SQL SERVER Native Client 10.0][SQL server]Cannot open backup device <percorso del file di backup>. Device error or device off-line. See the SQL Server error log for more details.
in <percorso del programma> on line <nr linea>
L'sql server non riesce ad aprire il backup il device, nonostante questo sia online e funzionante: il risultato di tutto ciò è che in genere di 146 db del 2012, circa 35/38 a seconda, e non sempre gli stessi, non vengono copiati nel nuovo server...
Qualche idea? Non so se sono stato abbastanza chiaro su quello che sto cercando di risolvere...
Tenete anche presente che ho provato ad effettuare anche con il Man Studio le copie dei database con il comando di Wizard, ma questo non parte nemmeno perchè mi dà errore durante la "configurazione del pacchetto di Integration Services" e quindi andando in errore subito senza nemmeno eseguire una sola azione.