IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Script d'import backup ".bak"


Sujet :

Administration SQL Server

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut Script d'import backup ".bak"
    Bonjour tout le monde,

    Alors voila le début d'un gros soucis pour moi et je risque de vous "embêter" pas mal ces jours ci...

    MISE EN CONDITION
    Au sein de mon entreprise nous travaillons sur deux environnements: PRé-PRODUCTION et PRODUCTION (je simplifie...) et donc avec deux bases de données pour chacun des environnements (sur 2 serveurs différents).
    Nous faisons des backup journaliers de la base de PRODUCTION dans un fichier .bak pour ensuite copier ce bakup sur le serveur SQL de PRE PRODUCTION. Aprés avoir importer ce fichier sur le serveur de PRE PRODUCTION nous faisons un restore de la base a partir de ce fichier .bak via SQL Server Management Studio.

    LE PROBLEME/MES QUESTIONS
    On me demande si on peut automatiser cela. C'est a dire me connecter sur le serveur de PRE PRODUCTION et sur celui-ci creer un script pour automatiser alors:
    - L'import du fichier .bak depuis le serveur de PRODUCTION (importer le fichier le plus récent...)
    - Arrêter le service SQL Server (commande NET STOP je crois ^^)
    - Faire un restore de la base avec notre fichier .bak


    Bref moi ca m'a l'air vraiment énorme comme boulot sachant que je ne sais meme pas comment creer un script sur SQL Server.

    Un script est-ce un fichier .bat ? Dois-je utiliser PowerShell? Si oui ba euuhh comment? lol

    Toute piste de votre part m'aiderai énormement!!

    Merci d'avance à vous tous!

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Pour une mise en jambe, tu peux déjà commencer par lire les 2 articles ci-dessous :
    http://fadace.developpez.com/mssql/sauve/
    http://blog.developpez.com/sqlpro/p7...ec-sql-server/

    A+

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    Une fois que tu auras lu ces articles...

    La tâche de transfert peut être simplifiée en sauvegardant dans un répertoire partagé sur la prod, accessible depuis la pré prod (il faut que le compte qui démarre le service SQL Server sur la préprod soit déclaré sur la prod avec le même mot de passe et avec le droit de lire le répertoire partagé). Ce qui donne:

    1) Backup de la base de prod dans le répertoire local, partagé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    backup database blablaprod to disk='G:\monpartage\blabla.bak' ...
    2) Restauration sur la préprod depuis le répertoire partagé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    restore database blablapreprod from disk='\\machineprod\monpartage\blabla.bak' with move ..., replace ...
    Tu n'as pas besoin d'arrêter aucun service, juste de t'assurer que personne n'est connecté au moment de la restauration sur la préprod.

    Tu peux automatiser tout ça en créant un package SSIS et Business Intelligence Studio. Il doit y avoir des tutorials un peu partout à ce sujet.

    David B.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut
    Tout d'abord merci pour vos réponse et vos articles.

    Pensez-vous qu'une débutante comme moi peut y arriver?

    Et seconde question pour David:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    backup DATABASE blablaprod TO disk='G:\monpartage\blabla.bak' ...
     
    restore DATABASE blablapreprod FROM disk='\\machineprod\monpartage\blabla.bak' WIT
    Tout ca je dois le faire dans un job planifié? ou autre part..?

    Thx =)

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    Le mieux est de le faire dans un package SSIS avec une tâche qui fait le backup sur une instance et une tâche qui fait la restauration sur l'autre. C'est difficile de le faire dans un job, car les actions ont lieu sur des instances différentes. (un exemple ici http://www.mssqltips.com/tutorial.asp?tutorial=200)

    A moyen terme, peut être qu'une petite formation ne serait pas du luxe. ;-]

    David B.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut
    Alors pour me faciliter la tâche, est-ce que je peux procéder comme ca:

    Le backup de PROD étant déjà fait grâce au plan de maintenance de nuit, le mettre dans le dossier partagé par lequel accède la PRé-PROD et faire ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    RESTORE DATABASE [MA_BASE]
    FROM DISK = '\\dossier_partagé\Ma_Base_Prod.bak' 
    WITH 
    MOVE 'PRE_PROD_MDF' TO 'G:\DATA\Microsoft SQL Server\MSSQL.3\MSSQL\Data\PRE_PROD.mdf',
    MOVE 'PRE_PROD_LDF' TO'G:\LOGS\Microsoft SQL Server\MSSQL.3\MSSQL\Logs\PRE_PROD.ldf'
    EDIT: Je ne suis même pas sur que la syntaxe en T-SQL de mon RESTORE est ok...

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    Il manque potentiellement un ", REPLACE" après les MOVE. Pour que ça marche il faudra avoir fait la déclaration du compte de service de la préprod sur la prod avec les droits affectés en lecture sur le partage.

    Sinon ça a l'air bon.

    David B.

  8. #8
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonsoir,

    En sus de ce que vous propose dbaffaleuf, un script powershell ou tout autre langage de script peut également vous aider à réaliser cette tâche. A vous d'opter pour la solution qui vous conviendra le mieux.

    ++

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Bonsoir,

    En sus de ce que vous propose dbaffaleuf, un script powershell ou tout autre langage de script peut également vous aider à réaliser cette tâche. A vous d'opter pour la solution qui vous conviendra le mieux.

    ++
    Script PowerShell = fichier.bat?
    Si oui je tape mon code dans le Bloc-Note et je l'enregistre en .bat?
    Désolé les gars mais je débute, donc excusez-moi si mes questions vous paraissent idiotes...

    Merci

    Pour David:

    Il manque potentiellement un ", REPLACE" après les MOVE. Pour que ça marche il faudra avoir fait la déclaration du compte de service de la préprod sur la prod avec les droits affectés en lecture sur le partage.
    Euh je regarde dans le tutoriel SQL-Server mais je ne vois aucune " REPLACE"... (http://fadace.developpez.com/mssql/sauve/#LIII-C)

    Concernant la déclaration du compte de service, je fais clic droit sur le dossier à partagé et j'ajoute le "Nom du service" SQL Server ou bien ce qui est marqué dans "Log on as"? (Je joins une capture d'écran des services de la Pré-Prod...



    Merci à vous!

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    Si la base de préprod ne s'appelle pas comme la base de prod (cf l'exemple avec blablaprod et blablapreprod), tu seras obligé d'utiliser WITH REPLACE. Cela t'empêche de recharger une base par erreur. Si les deux bases portent le même nom, tu n'es pas obligé de l'utiliser.

    Le compte de service pour la préprod est GLOBAL\EBS-SVC-DYNSQQA-DB. Comme il s'agit d'un compte de domaine, et si tes deux machines sont dans un domaine (le même, idéalement), ce n'est pas la peine de déclarer ce compte sur la machine de prod. Il suffit de lui octroyer les droits en lecture sur le répertoire partagé où est déposée la sauvegarde.

    David B.

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut
    Oui elle sont sur le même domaine et j'ai fais un test depuis la pré prod en tapant dans la fenetre RUn (Win+R) l'adresse du fichier partagé sur la prod et j'y accède. Ca veut dire que c'est bon hein?

    Sinon je veux créer un fichier .bat, les commandes ci-dessus sont toujours utilisable ou le langage change complètement?

    Donc le code est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RESTORE DATABASE [MA_BASE]
    FROM DISK = '\\dossier_partagé\Ma_Base_Prod.bak' 
    WITH REPLACE
    MOVE 'PRE_PROD_MDF' TO 'G:\DATA\Microsoft SQL Server\MSSQL.3\MSSQL\Data\PRE_PROD.mdf',
    MOVE 'PRE_PROD_LDF' TO'G:\LOGS\Microsoft SQL Server\MSSQL.3\MSSQL\Logs\PRE_PROD.ldf'
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RESTORE DATABASE [MA_BASE]
    FROM DISK = '\\dossier_partagé\Ma_Base_Prod.bak' 
    WITH 
    MOVE REPLACE 'PRE_PROD_MDF' TO 'G:\DATA\Microsoft SQL Server\MSSQL.3\MSSQL\Data\PRE_PROD.mdf',
    MOVE REPLACE 'PRE_PROD_LDF' TO'G:\LOGS\Microsoft SQL Server\MSSQL.3\MSSQL\Logs\PRE_PROD.ldf'
    Je n'ai pas trop compris ou tu mettais le REPLACE...


    Merci beaucoup David!

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    Citation Envoyé par CarlaJohnson Voir le message
    Oui elle sont sur le même domaine et j'ai fais un test depuis la pré prod en tapant dans la fenetre RUn (Win+R) l'adresse du fichier partagé sur la prod et j'y accède. Ca veut dire que c'est bon hein?
    Ca veut dire que le partage est accessible, maintenant ça ne veux pas dire que le compte de service de la préprod à le droit de lire le contenu du répertoire. La restauration de la base te le dira.

    Pour le REPLACE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RESTORE DATABASE [MA_BASE]
    FROM DISK = '\\dossier_partagé\Ma_Base_Prod.bak' 
    WITH REPLACE,
    MOVE 'PRE_PROD_MDF' TO 'G:\DATA\Microsoft SQL Server\MSSQL.3\MSSQL\Data\PRE_PROD.mdf',
    MOVE 'PRE_PROD_LDF' TO'G:\LOGS\Microsoft SQL Server\MSSQL.3\MSSQL\Logs\PRE_PROD.ldf'
    Il manquait la virgule après WITH REPLACE

    David B.

  13. #13
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Un petit conseil : La restauration de la base ne fonctionnera pas si un ou plusieurs utilisateurs sont connectés sur la base de données à restaurer, en l’occurrence MA_BASE (Pre_Prod)
    Avant de restaurer la base, une technique "ancienne" mais auissi valable consistait à déconnecter tous les autres utilisateurs. Une autre méthode, plus simple et plus fiable, permettant d’atteindre le même but, est décrite ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    USE master 
    GO 
    -- 1 
    ALTER DATABASE MA_BASE
       SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
    -- 2 
    RESTORE DATABASE [MA_BASE]
    FROM DISK = '\\dossier_partagé\Ma_Base_Prod.bak' 
    WITH 
    MOVE 'PRE_PROD_MDF' TO 'G:\DATA\Microsoft SQL Server\MSSQL.3\MSSQL\Data\PRE_PROD.mdf',
    MOVE 'PRE_PROD_LDF' TO 'G:\LOGS\Microsoft SQL Server\MSSQL.3\MSSQL\Logs\PRE_PROD.ldf', 
    REPLACE;
    -- 3 
    ALTER DATABASE MA_BASE SET MULTI_USER
    GO
    A+

  14. #14
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut
    Alors mes amis, je vous tiens informé de la direction que prends mon avancée dans ce "projet"

    J'ai créer un fichier .bat sur la PRE PROD qui récupère le backup du jour de la prod (car un backup est fait tous les jours à 1h).
    Je mets le code de mon fichier .bat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    @echo off
     
    REM On defini le repertoire ou stocké la copie
    set fold_dest=G:\EBSMEYDBC04Q02BCKP\DynamicsAxPR\
     
    REM On defini le repertoire ou allé chercher le backup
    set fold_src=\\EBSMEYDBC03P02\DynamicsAxPR\
     
    REM date du jour
    set J=%DATE:~7,2%
    set M=%DATE:~4,2%
    set Y=%DATE:~10,4%
    set H=0100
    set ext=.bak
     
    set backup_name=DynamicsAxPR_backup_%Y%%M%%J%%H%%ext%
     
    set backup_src=%fold_src%%backup_name%
     
    echo f | xcopy %backup_src% %fold_dest% 
     
     
    pause
    J'ai donc maintenant le backup de la base qui va me servir à la restauration de la PRé PROD (j'ai testé et la copie se passe très bien)

    Maintenant est-ce que je peux compléter ce "script" (je crois que je peux l'appeler comme ca...) pour faire le RESTORE de ma base?

    Merci à vous!!!!!

    EDIT: Dois-je utiliser la commande SQLCMD dans mon fichier .bat et copié le code dont on parlais plus haut?

    EDIT #2: Merci hmira pour ton conseil je vais en parler au chef meme si normalement notre client nous prévient quand plus personne n'utilise l'application et qu'on peut restaurer sans soucis!

  15. #15
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Pense aussi a la securite.
    Celle definie en prod et dans un autre environnement peuvent etre differentes.
    Il ne faut pas oublier de reappliquer les droits apres un restore.

  16. #16
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut
    Ok Ptit_Dje je suis tout à fait d'accord avec toi!

    Je voulais poser la question également mais plus tard car j'en pose déjà énormément mais vu que tu lances ce sujet on peut essayé de le régler en parallèle de mon autre soucis.

    Alors lorsque je fais un restore de la base "à la main" via SQL Management Studio" je dois "créer" l'ancien user avec les droit db_owner.

    Je m'explique encore un peu mieux.

    Avant restore dans l'onglet "Sécurity" de la base le user en db_owner=PréProd
    Apres le restore, le user n'est plus PréProd mais Prod
    (enfin je crois)
    Donc il faut que je redonne le droit au users PréProd en db_owner

  17. #17
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut
    Up...

  18. #18
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Oui effectivement...
    Pour un restore automatise ou a la main, les steps seront les memes.

    Scripte le drop du user prod.
    Scripte la creation du user preprod.
    Scripte l'attribution des droits du user preprod.

  19. #19
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 95
    Par défaut
    Merci à hmira. david, pti_dje pour vos réponse.

    J'ai fait un test de backp+restore et tout à marché nickel en script.

    Petit hic durant l'execution du .bat:

    Je dois arreter un service avant de faire un restore (pas de la base mais de certaine donnée sur le serveur AOS (je sais meme pas ce que ca veut dire... -_-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NET STOP "Nom_Du_Service"
    Cependant, le script doit être planifié via "Planificateur de tâche" et doit être exécuté en mode Administrateur.
    Comment faire cela sans que j'aille moi-même arrêter le service "à la main" sous Windows Server 2008 ?

    Je pense créer un autre topic pour cela non?

    UN GRAND MERCI A VOUS EN TOUT CAS !!!

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo