Question
Restauration BD via Powershell
- THIBURCE
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 17
- Remerciements reçus 0
il y a 10 ans 4 mois #20928
par THIBURCE
Restauration BD via Powershell a été créé par THIBURCE
Bonjour,
Je souhaite faire une restauration de ma base de données sur mon serveur. Celle-ci n'est pas connu du serveur, j'ai donc un fichier de sauvegarde à utiliser.
Le problème vient des changements de fichiers Data et Log de la base de données. Je souhaite redéfinir ceux-ci sauf que j'obtiens une erreur lorsque je fais le ReadFileList. \"Exception lors de l'appel de « ReadFileList » avec « 1 » argument(s) : « Une exception s'est produite lors de l'exécution d'une instruction ou d'un lot Transact-SQL. »\"
Est-ce que je peux avoir plus d'explication venant de l'erreur avec une certaine commande du style $_ mais avec une méthode ?
Mon fichier de sauvegarde n'a pas d'extension .bak je ne sais pas si cela peut gêner.
Mon serveur est bien connecté vu que je peux récupérer des informations dessus.
Si cela ne fonctionne vraiment pas je pense faire un script SQL dans lequel je vais mettre les bons paramètres et l'exécuter via Powershell.
Merci d'avance
[code:1]##Fontcion qui restaure une base de données
# $nomServeur = nom du serveur SQl Server
# $nomBD = nom de la base de données restaurée
# $fileSave = chemin du fichier de sauvegarde
# $user = utilisateur du serveur
# $password = mot de passe du serveur
# $dossierFichierBD : dossier contenant les fichiers lié à la base de données
# $etatReplace = indique si on doit remplacer une base de données existante
# $noRecovery = mode de restauration pour savoir si la restauration
# doit se terminer ou si on doit encore restaurer des morceaux de la base
# $journaux = true ou false si on veut restaurer des journaux ou non
# $finRestore = true ou false, indique si c'est la dernière étape pour la restauration
# $complete = true ou false, indique si on a une sauvegarde complête ou différentielle
# return = renvoie une erreur si il y en a sinon renvoi une chaine vide
Function restaureBD
{
Param(
[Parameter(Mandatory=$true)]
$nomServeur,
$nomBD,
$fileSave,
$user,
$password,
$dossierFichierBD,
$etatReplace,
$noRecovery,
$journaux,
$finRestore,
$complete
)
# On charge l'assembly SMO permettant d'utiliser les outils de restauration
$smo = [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
$elemSmo = $smo.FullName.Split(',')
$elemSmo1 = $elemSmo[1].Split('=')
$elemSmo2 = $elemSmo1[1].Split('.')
if ($elemSmo2[0] -ne '9') {
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMOExtended') | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SQLWMIManagement') | Out-Null
}
[string]$erreur = \"\"
try
{
# On créer un objet de restauration
$restore = New-Object Microsoft.SqlServer.Management.Smo.Restore
# On indique le nom de la base qui va être restaurée
$restore.Database = $nomBD
# On initialise la connexion au serveur
$serveur = New-Object Microsoft.SqlServer.Management.Smo.Server($nomServeur)
$conContext = $serveur.ConnectionContext
$conContext.LoginSecure = $false
$conContext.Login = $user
$conContext.Password = $password
if($finRestore)
{
# On définit le type de restauration à effectuer, ici soit d'une base de données soit des journaux
$restore.Action = [Microsoft.SqlServer.Management.Smo.RestoreActionType]::«»Database
}
else
{
# On définit le fichier de sauvegarde pour la restauration
$restore.Devices.AddDevice($fileSave, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) | Out-Null
if($journaux)
{
# On définit le type de restauration à effectuer, ici des journaux
$restore.Action = [Microsoft.SqlServer.Management.Smo.RestoreActionType]::Log
}
else
{
# On définit le type de restauration à effectuer, ici soit d'une base de données soit des journaux
$restore.Action = [Microsoft.SqlServer.Management.Smo.RestoreActionType]::«»Database
if($complete)
{
# On définit le nouvel emplacement des fichiers de la base de données
$fichiersBD = $restore.ReadFileList($serveur)
$oldNameData = $fichierBD.Select(\"Type = 'D'\"«»)[0].LogicalName
$oldNameLog = $fichierBD.Select(\"Type = 'L'\"«»)[0].LogicalName
$DataFile = \"{0}\{1}{2}\" -F $dossierFichierBD, $nomBD, \"_Data.mdf\"
$LogFile = \"{0}\{1}{2}\" -F $dossierFichierBD, $nomBD, \"_Log.ldf\"
$relocateFileData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($oldNameData, $DataFile)
$relocateFileLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($oldNameLog, $LogFile)
$restore.RelocateFiles.Add($relocateFileData) | Out-Null
$restore.RelocateFiles.Add($relocateFileLog) | Out-Null
# On définit si il faut remplacer une base qui existe
$restore.ReplaceDatabase = $etatReplace
}
}
}
# On définit si la restauration doit fermer la base et donc supprimer
# tous les morceaux non terminés des transactions à la sauvegarde par exemple
$restore.NoRecovery = $noRecovery
# On définit que l'on veut attendre la fin de la restauration avant de continuer
$restore.Wait() | Out-Null
# On restaure la base
$restore.SQLRestore($serveur) | Out-Null
}
catch
{
$erreur = \"Erreur : Erreur de restauration : $_\"
}
return $erreur
}
[/code:1]<br><br>Message édité par: Riza, à: 22/10/15 12:50
Je souhaite faire une restauration de ma base de données sur mon serveur. Celle-ci n'est pas connu du serveur, j'ai donc un fichier de sauvegarde à utiliser.
Le problème vient des changements de fichiers Data et Log de la base de données. Je souhaite redéfinir ceux-ci sauf que j'obtiens une erreur lorsque je fais le ReadFileList. \"Exception lors de l'appel de « ReadFileList » avec « 1 » argument(s) : « Une exception s'est produite lors de l'exécution d'une instruction ou d'un lot Transact-SQL. »\"
Est-ce que je peux avoir plus d'explication venant de l'erreur avec une certaine commande du style $_ mais avec une méthode ?
Mon fichier de sauvegarde n'a pas d'extension .bak je ne sais pas si cela peut gêner.
Mon serveur est bien connecté vu que je peux récupérer des informations dessus.
Si cela ne fonctionne vraiment pas je pense faire un script SQL dans lequel je vais mettre les bons paramètres et l'exécuter via Powershell.
Merci d'avance
[code:1]##Fontcion qui restaure une base de données
# $nomServeur = nom du serveur SQl Server
# $nomBD = nom de la base de données restaurée
# $fileSave = chemin du fichier de sauvegarde
# $user = utilisateur du serveur
# $password = mot de passe du serveur
# $dossierFichierBD : dossier contenant les fichiers lié à la base de données
# $etatReplace = indique si on doit remplacer une base de données existante
# $noRecovery = mode de restauration pour savoir si la restauration
# doit se terminer ou si on doit encore restaurer des morceaux de la base
# $journaux = true ou false si on veut restaurer des journaux ou non
# $finRestore = true ou false, indique si c'est la dernière étape pour la restauration
# $complete = true ou false, indique si on a une sauvegarde complête ou différentielle
# return = renvoie une erreur si il y en a sinon renvoi une chaine vide
Function restaureBD
{
Param(
[Parameter(Mandatory=$true)]
$nomServeur,
$nomBD,
$fileSave,
$user,
$password,
$dossierFichierBD,
$etatReplace,
$noRecovery,
$journaux,
$finRestore,
$complete
)
# On charge l'assembly SMO permettant d'utiliser les outils de restauration
$smo = [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
$elemSmo = $smo.FullName.Split(',')
$elemSmo1 = $elemSmo[1].Split('=')
$elemSmo2 = $elemSmo1[1].Split('.')
if ($elemSmo2[0] -ne '9') {
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMOExtended') | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SQLWMIManagement') | Out-Null
}
[string]$erreur = \"\"
try
{
# On créer un objet de restauration
$restore = New-Object Microsoft.SqlServer.Management.Smo.Restore
# On indique le nom de la base qui va être restaurée
$restore.Database = $nomBD
# On initialise la connexion au serveur
$serveur = New-Object Microsoft.SqlServer.Management.Smo.Server($nomServeur)
$conContext = $serveur.ConnectionContext
$conContext.LoginSecure = $false
$conContext.Login = $user
$conContext.Password = $password
if($finRestore)
{
# On définit le type de restauration à effectuer, ici soit d'une base de données soit des journaux
$restore.Action = [Microsoft.SqlServer.Management.Smo.RestoreActionType]::«»Database
}
else
{
# On définit le fichier de sauvegarde pour la restauration
$restore.Devices.AddDevice($fileSave, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) | Out-Null
if($journaux)
{
# On définit le type de restauration à effectuer, ici des journaux
$restore.Action = [Microsoft.SqlServer.Management.Smo.RestoreActionType]::Log
}
else
{
# On définit le type de restauration à effectuer, ici soit d'une base de données soit des journaux
$restore.Action = [Microsoft.SqlServer.Management.Smo.RestoreActionType]::«»Database
if($complete)
{
# On définit le nouvel emplacement des fichiers de la base de données
$fichiersBD = $restore.ReadFileList($serveur)
$oldNameData = $fichierBD.Select(\"Type = 'D'\"«»)[0].LogicalName
$oldNameLog = $fichierBD.Select(\"Type = 'L'\"«»)[0].LogicalName
$DataFile = \"{0}\{1}{2}\" -F $dossierFichierBD, $nomBD, \"_Data.mdf\"
$LogFile = \"{0}\{1}{2}\" -F $dossierFichierBD, $nomBD, \"_Log.ldf\"
$relocateFileData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($oldNameData, $DataFile)
$relocateFileLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile($oldNameLog, $LogFile)
$restore.RelocateFiles.Add($relocateFileData) | Out-Null
$restore.RelocateFiles.Add($relocateFileLog) | Out-Null
# On définit si il faut remplacer une base qui existe
$restore.ReplaceDatabase = $etatReplace
}
}
}
# On définit si la restauration doit fermer la base et donc supprimer
# tous les morceaux non terminés des transactions à la sauvegarde par exemple
$restore.NoRecovery = $noRecovery
# On définit que l'on veut attendre la fin de la restauration avant de continuer
$restore.Wait() | Out-Null
# On restaure la base
$restore.SQLRestore($serveur) | Out-Null
}
catch
{
$erreur = \"Erreur : Erreur de restauration : $_\"
}
return $erreur
}
[/code:1]<br><br>Message édité par: Riza, à: 22/10/15 12:50
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.050 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Restauration BD via Powershell