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 de sauvegarde automatique


Sujet :

Administration SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Script de sauvegarde automatique
    Bonjour,

    Tout d'abord sachez que je n'ai que très peu de connaissance dans les bases de donnée en générale et très peu de connaissance dans le langage batch..

    Je souhaite sauvegarder l'intégralité des bases de données présente sur un serveur Microsoft SQL Server Manegement studio.

    Première question :

    - Peut-on réaliser ces sauvegardes "à chaud" ?
    - Existe t-il un outils pour faire ces sauvegarde ?
    - Est-il possible de passer par l'option backup databse de SQL Server ?

    Voici le script bath trouvé sur internet que je n'arrive pas à faire fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sqlcmd -S localhost -E -Q BACKUP DATABASE [base] TO  DISK = N'B:\base.BAK' WITH NOFORMAT, INIT,  NAME = N'base-Complète Base de données Sauvegarde', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    pause
    merci d'avance !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Un excellent outil pour faire des backups.

    Redgate backup.

    Il y a un période d'évaluation de 30 jours je crois et la licence est abordable à 1000$ pour une licence perpétuelle.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 815
    Points : 1 350
    Points
    1 350
    Billets dans le blog
    2
    Par défaut
    essayer utiliser un plan de maintenance pour faire tes sauvegarde avec une planification via l'agent

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Babyneedle Voir le message
    Un excellent outil pour faire des backups.

    Redgate backup.

    Il y a un période d'évaluation de 30 jours je crois et la licence est abordable à 1000$ pour une licence perpétuelle.
    Ce genre de conseil est stupide puisqu'il s'agit d'un outil payant qui ne fait qu’appeler la commande interne BACKUP de SQL Server.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par kyrylo Voir le message
    Bonjour,

    Tout d'abord sachez que je n'ai que très peu de connaissance dans les bases de donnée en générale et très peu de connaissance dans le langage batch..

    Je souhaite sauvegarder l'intégralité des bases de données présente sur un serveur Microsoft SQL Server Manegement studio.

    Première question :

    - Peut-on réaliser ces sauvegardes "à chaud" ?
    Oui, en utilisant la commande BACKUP de SQL Server. Les sauvegardes "à froid" n'ayant aucun intérêt et même plus sont fortement déconseillées !
    - Existe t-il un outils pour faire ces sauvegarde ?
    Oui, la commande BACKUP de SQL Server. Et pour planifier la chose, utiliser l'Agent SQL.
    - Est-il possible de passer par l'option backup databse de SQL Server ?
    Oui ! BACKUP n'est pas une option, mais une commande.

    Voici le script bath trouvé sur internet que je n'arrive pas à faire fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sqlcmd -S localhost -E -Q BACKUP DATABASE [base] TO  DISK = N'B:\base.BAK' WITH NOFORMAT, INIT,  NAME = N'base-Complète Base de données Sauvegarde', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    pause
    merci d'avance !
    Mieux vaut réaliser une procédure stockée et la jouer dans un travail de l'agent.

    Exemple : http://blog.developpez.com/sqlpro/p6...ses_de_donnees

    Autre exemple :
    http://blog.developpez.com/sqlpro/p8...ec_nettoyage_d

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Ce genre de conseil est stupide puisqu'il s'agit d'un outil payant qui ne fait qu’appeler la commande interne BACKUP de SQL Server.

    A +
    Et ce genre de commentaire est déplacé, surtout venant de la part d'un modérateur.

    Il a demandé s'il existait des outils, j'ai répondu à sa question. Il est suffisament intelligent pour faire sa propre opinion.

    Et puis, vous l'avez utilisé cet outil pour porter ce jugement?

    A+

  7. #7
    Membre expérimenté
    Homme Profil pro
    DBA SQL Server
    Inscrit en
    Octobre 2012
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA SQL Server
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 862
    Points : 1 736
    Points
    1 736
    Par défaut
    Tu trouveras différentes possibilités pour faire les backup ici :

    http://www.datacrossroad.be/category/tutos/

    Et ici :

    Ce que nous avons fait pour nous-même meurt avec nous, ce que nous avons fait pour les autres et le monde est immortel. Albert Pike

    http://www.datacrossroad.be

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Babyneedle Voir le message
    Et ce genre de commentaire est déplacé, surtout venant de la part d'un modérateur.
    je ne suis pas modérateur !

    Et puis, vous l'avez utilisé cet outil pour porter ce jugement?
    Il est probable que oui... J'en ais tellement vu et utilisé chez mes clients, et supprimé la plupart que je ne sais plus lesquels. En effet ces outils sont inutiles car il ne font qu'appeler la commande BACKUP. Bref, dépenser de l'argent pour ne rien faire est particulièrement stupide. MS SQL Server possède tous les outils en interne pour ce faire. Je me souviens même de backup Exec qui se vantais de savoir faire des sauvegardes SQL Server "base ouverte" et vendait l'Agent de Sauvegarde SQL responsable de ce "miracle" dans les 1000 € ! Bref, 1000 € pour une ligne de code... je pense que c'est l'arnaque du siècle. Même IBM dans les années 70 ne vendait pas ses lignes de code aussi cher...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Voici un exemple "as is" d'un outil que j'ai écrit en C# pour sauvegarder l'ensemble des bases de données des instances de notre réseau, avec possibilité de les restaurer sous forme de "log shipping" sur des serveurs de secours, qui restent en veille.

    program.cs
    Code c# : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    using System;
    using System.ComponentModel;
    using System.Globalization;
    using System.IO;
     
    [assembly: CLSCompliant(true)]
     
    namespace BackupSql
    {
        class Program
        {
            static void Main()
            {
                DateTime startTime = DateTime.Now;
                DateTime endTime;
     
                if (!Directory.Exists("log"))
                {
                    Directory.CreateDirectory("log");
                }
                TextWriter logFile = File.CreateText(string.Format(CultureInfo.CurrentCulture, "log/{0}.log", startTime.ToString("yyyyMMdd-HHmmss", CultureInfo.CurrentCulture)));
                Console.SetError(logFile);
     
                Console.Error.WriteLine("Program starts at {0}", startTime.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
                Console.WriteLine("Program starts at {0}", startTime.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
     
                InstanceList.Instance.Backup();
     
                Console.Error.WriteLine("Clean log files");
                DirectoryInfo di = new DirectoryInfo("log");
                FileInfo[] files = di.GetFiles("*.log", SearchOption.TopDirectoryOnly);
                DateTime lastTwoDays = startTime.AddDays(-2);
                foreach (FileInfo file in files)
                {
                    if (file.CreationTime < lastTwoDays)
                    {
                        Console.Error.WriteLine("\tDEL {0}", file.Name);
                        file.Delete();
                    }
                }
     
     
                endTime = DateTime.Now;
                Console.Error.WriteLine("Program ends at {0}", endTime.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
                Console.Error.WriteLine("Duration : {0} ms", endTime.Subtract(startTime).TotalMilliseconds);
                Console.WriteLine("Program ends at {0}", endTime.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
                Console.WriteLine("Duration : {0} ms", endTime.Subtract(startTime).TotalMilliseconds);
     
                logFile.Close();
                logFile.Dispose();
            }
        }
    }

    ServerList.cs
    Code sql : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
     
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Globalization;
    using System.IO;
    using System.Linq;
    using System.Xml;
    using System.Xml.XPath;
    using System.Threading.Tasks;
     
    namespace BackupSql
    {
        /// <summary>
        /// Type of SQL Server Backup
        /// </summary>
        public enum BackupType
        {
            /// <summary>
            /// FULL Backup : all the data is saved
            /// </summary>
            Full = 0,
            /// <summary>
            /// DIFFERENTIAL Backup : only data changed since last FULL Backup is saved
            /// </summary>
            Differential = 1,
            /// <summary>
            /// LOG Backup : all log entries since last LOG Backup are saved and released
            /// </summary>
            Log = 2,
        }
     
        /// <summary>
        /// Represents a SQL Server Database object
        /// </summary>
        public class Database
        {
            private string InstanceName;
            private BackupType TypeOfBackup = BackupType.Log;
            private DateTime StartBackup = DateTime.Now;
     
            /// <summary>
            /// Database name
            /// </summary>
            public string Name { get; set; }
     
            /// <summary>
            /// Last FULL Backup date
            /// </summary>
            public DateTime LastFull { get; set; }
     
            /// <summary>
            /// Last DIFFERENTIAL Backup date
            /// </summary>
            public DateTime LastDiff { get; set; }
     
            /// <summary>
            /// Last LOG Backup date
            /// </summary>
            public DateTime LastLog { get; set; }
     
            /// <summary>
            /// Instanciates a new Database object from configuration file
            /// </summary>
            /// <param name="instanceName">Full SQL Server Instance name</param>
            /// <param name="node">Configuration file XML Node for this database</param>
            public Database(string instanceName, IXPathNavigable node)
            {
                XmlNode nd = (node as XmlNode);
                this.InstanceName = instanceName;
                this.Name = nd.Attributes["name"].Value;
                DateTime lastfull = DateTime.MinValue;
                DateTime lastdiff = DateTime.MinValue;
                DateTime lastlog = DateTime.MinValue;
                if (!DateTime.TryParse(nd.Attributes["lastfull"].Value, out lastfull))
                {
                    Console.Error.WriteLine("Can't parse lastfull date format");
                    Console.WriteLine("Can't parse lastfull date format");
                }
     
                if (!DateTime.TryParse(nd.Attributes["lastdiff"].Value, out lastdiff))
                {
                    Console.Error.WriteLine("Can't parse lastdiff date format");
                    Console.WriteLine("Can't parse lastdiff date format");
                }
     
                if (!DateTime.TryParse(nd.Attributes["lastlog"].Value, out lastlog))
                {
                    Console.Error.WriteLine("Can't parse lastlog date format");
                    Console.WriteLine("Can't parse lastlog date format");
                }
     
                this.LastFull = lastfull;
                this.LastDiff = lastdiff;
                this.LastLog = lastlog;
     
                Console.Error.WriteLine("Last FULL : {0}", this.LastFull.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
                Console.Error.WriteLine("Last DIFF : {0}", this.LastDiff.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
                Console.Error.WriteLine("Last LOG : {0}", this.LastLog.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
            }
     
            /// <summary>
            /// Instanciates a new Database object from its name
            /// </summary>
            /// <param name="instanceName">Full SQL Server Instance name</param>
            /// <param name="name">Database name</param>
            public Database(string instanceName, string name)
            {
                this.InstanceName = instanceName;
                this.Name = name;
                this.LastFull = DateTime.MinValue;
                this.LastDiff = DateTime.MinValue;
                this.LastLog = DateTime.MinValue;
     
                Console.Error.WriteLine("Last FULL : {0}", this.LastFull.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
                Console.Error.WriteLine("Last DIFF : {0}", this.LastDiff.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
                Console.Error.WriteLine("Last LOG : {0}", this.LastLog.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture));
            }
     
            /// <summary>
            /// Force RECOVERY MODEL of the Database to FULL except for MASTER database that doesn't allow this
            /// </summary>
            public void SetRecoveryModel()
            {
                if (this.Name == "master")
                {
                    return;
                }
                using (SqlConnection cnx = new SqlConnection(string.Format(CultureInfo.CurrentCulture, "Server='{0}';Database=master;Trusted_Connection=True;", this.InstanceName)))
                {
                    cnx.Open();
                    string recovery_model_desc;
     
                    using (SqlCommand cmd = cnx.CreateCommand())
                    {
                        cmd.CommandText = "select recovery_model_desc from sys.databases where name = @name";
                        SqlParameter pName = cmd.CreateParameter();
                        pName.ParameterName = "name";
                        pName.SqlDbType = SqlDbType.VarChar;
                        pName.Size = 100;
                        pName.Value = this.Name;
                        cmd.Parameters.Add(pName);
                        cmd.Prepare();
                        recovery_model_desc = (string)cmd.ExecuteScalar();
                    }
     
                    if (recovery_model_desc != "FULL")
                    {
                        Console.Error.WriteLine("Changed recovery model to FULL on {0}", this.Name);
                        Console.WriteLine("Changed recovery model to FULL on {0}", this.Name);
     
                        using (SqlCommand cmd = cnx.CreateCommand())
                        {
                            cmd.CommandText = string.Format(CultureInfo.CurrentCulture, "alter database [{0}] set recovery full", this.Name);
                            cmd.ExecuteNonQuery();
                        }
                    }
     
                    if (cnx.State == ConnectionState.Open)
                    {
                        cnx.Close();
                    }
                }
            }
     
            /// <summary>
            /// Checks the backup destination path exists or creates it
            /// </summary>
            public void PreparePath()
            {
                if (!InstanceList.Instance.BackupUncPath.StartsWith("\\"))
                {
                    throw new Exception("The backup folder must be a UNC path!");
                }
                if (!Directory.Exists(InstanceList.Instance.BackupUncPath))
                {
                    throw new Exception("The backup folder doesn't exists!");
                }
                if (!Directory.Exists(string.Format(CultureInfo.CurrentCulture, "{0}\\{1}", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'))))
                {
                    Directory.CreateDirectory(string.Format(CultureInfo.CurrentCulture, "{0}\\{1}", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_')));
                }
                if (!Directory.Exists(string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name)))
                {
                    Directory.CreateDirectory(string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name));
                }
            }
     
            /// <summary>
            /// Backups the database
            /// </summary>
            public void Backup()
            {
                string backupCmdData = string.Empty;
                string backupFilenameData = string.Empty;
                string backupFilenameLog = string.Empty;
                string backupName = string.Format(CultureInfo.CurrentCulture, "Backup of {0}", this.Name);
     
                this.SetRecoveryModel();
                this.PreparePath();
     
                Console.Error.WriteLine("Starts backup of {0}", this.Name);
     
                if (this.LastFull.AddHours(InstanceList.Instance.IntervalFull) < this.StartBackup || this.Name == "master")
                {
                    backupCmdData = "BACKUP DATABASE @name TO DISK = @filename WITH NAME = @bckName, CHECKSUM";
                    this.TypeOfBackup = BackupType.Full;
                    backupFilenameData = string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}\\DATA_FULL_{3}.BAK", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name, this.StartBackup.ToString("yyyyMMddHHmmssfff", CultureInfo.CurrentCulture));
                }
                else if (this.LastDiff.AddHours(InstanceList.Instance.IntervalDiff) < this.StartBackup)
                {
                    backupCmdData = "BACKUP DATABASE @name TO DISK = @filename WITH DIFFERENTIAL, NAME = @bckName, CHECKSUM";
                    this.TypeOfBackup = BackupType.Differential;
                    backupFilenameData = string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}\\DATA_DIFFERENTIAL_{3}.BAK", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name, this.StartBackup.ToString("yyyyMMddHHmmssfff", CultureInfo.CurrentCulture));
                }
                Console.Error.WriteLine("Backup type is {0}", this.TypeOfBackup);
     
                string backupCmdLog = "BACKUP LOG @name TO DISK = @filename WITH NAME = @bckName, CHECKSUM";
                backupFilenameLog = string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}\\LOG_{3}.BAK", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name, this.StartBackup.ToString("yyyyMMddHHmmssfff", CultureInfo.CurrentCulture));
     
                using (SqlConnection cnx = new SqlConnection(string.Format(CultureInfo.CurrentCulture, "Server='{0}';Database=master;Trusted_Connection=True;", this.InstanceName)))
                {
                    try
                    {
                        cnx.Open();
                    }
                    catch
                    {
                        Console.Error.WriteLine("Unable to connect at {0}", this.Name);
                        Console.WriteLine("Unable to connect at {0}", this.Name);
                        backupFilenameData = string.Empty;
                        backupFilenameLog = string.Empty;
                        return;
                    }
     
                    using (SqlCommand cmd = cnx.CreateCommand())
                    {
                        cmd.CommandTimeout = 36000;
                        if (backupCmdData.Length > 0)
                        {
                            cmd.CommandText = backupCmdData;
     
                            SqlParameter pName = cmd.CreateParameter();
                            pName.ParameterName = "name";
                            pName.SqlDbType = SqlDbType.VarChar;
                            pName.Size = 50;
                            pName.Value = this.Name;
                            cmd.Parameters.Add(pName);
     
                            SqlParameter pFilename = cmd.CreateParameter();
                            pFilename.ParameterName = "filename";
                            pFilename.SqlDbType = SqlDbType.VarChar;
                            pFilename.Size = 256;
                            pFilename.Value = backupFilenameData;
                            cmd.Parameters.Add(pFilename);
     
                            SqlParameter pBackupName = cmd.CreateParameter();
                            pBackupName.ParameterName = "bckName";
                            pBackupName.SqlDbType = SqlDbType.VarChar;
                            pBackupName.Size = 50;
                            pBackupName.Value = backupName;
                            cmd.Parameters.Add(pBackupName);
     
                            Console.Error.WriteLine("Performs backup");
                            try
                            {
                                cmd.ExecuteNonQuery();
                            }
                            catch (Exception e)
                            {
                                Console.Error.WriteLine("Error during backup of {0} on {1} !!!", this.Name, this.InstanceName);
                                Console.Error.WriteLine(e.Message);
                                Console.WriteLine("Error during backup of {0} on {1} !!!", this.Name, this.InstanceName);
                                Console.WriteLine(e.Message);
                                backupFilenameData = string.Empty;
                            }
                            cmd.Parameters.Clear();
                        }
     
                        if (this.Name != "master")
                        {
                            cmd.CommandText = backupCmdLog;
     
                            SqlParameter pName2 = cmd.CreateParameter();
                            pName2.ParameterName = "name";
                            pName2.SqlDbType = SqlDbType.VarChar;
                            pName2.Size = 50;
                            pName2.Value = this.Name;
                            cmd.Parameters.Add(pName2);
     
                            SqlParameter pFilename2 = cmd.CreateParameter();
                            pFilename2.ParameterName = "filename";
                            pFilename2.SqlDbType = SqlDbType.VarChar;
                            pFilename2.Size = 256;
                            pFilename2.Value = backupFilenameLog;
                            cmd.Parameters.Add(pFilename2);
     
                            SqlParameter pBackupName2 = cmd.CreateParameter();
                            pBackupName2.ParameterName = "bckName";
                            pBackupName2.SqlDbType = SqlDbType.VarChar;
                            pBackupName2.Size = 50;
                            pBackupName2.Value = backupName;
                            cmd.Parameters.Add(pBackupName2);
     
                            Console.Error.WriteLine("Performs log backup");
                            try
                            {
                                cmd.ExecuteNonQuery();
                            }
                            catch (Exception e)
                            {
                                Console.Error.WriteLine("Error during log backup of {0} on {1} !!!", this.Name, this.InstanceName);
                                Console.Error.WriteLine(e.Message);
                                Console.WriteLine("Error during log backup of {0} on {1} !!!", this.Name, this.InstanceName);
                                Console.WriteLine(e.Message);
                                backupFilenameLog = string.Empty;
                            }
                        }
                    }
     
                    if (cnx.State == ConnectionState.Open)
                    {
                        cnx.Close();
                    }
                }
     
                if ((this.TypeOfBackup != BackupType.Log && backupFilenameData.Length == 0) || backupFilenameLog.Length == 0)
                {
                    Console.Error.WriteLine("Error during backup of {0} on {1}. Will not clean up older backups", this.Name, this.InstanceName);
                    Console.WriteLine("Error during backup of {0} on {1}. Will not clean up older backups", this.Name, this.InstanceName);
                    return;
                }
     
                Console.Error.WriteLine("Starts backup cleaning of {0}", this.Name);
     
                switch (this.TypeOfBackup)
                {
                    case BackupType.Full:
                        DirectoryInfo di1 = new DirectoryInfo(string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name));
                        FileInfo[] files1 = di1.GetFiles("*.BAK", SearchOption.TopDirectoryOnly);
                        foreach (FileInfo file in files1)
                        {
                            if (file.CreationTime < LastFull)
                            {
                                Console.Error.WriteLine("\tDEL {0}", file.Name);
                                file.Delete();
                            }
                        }
                        this.LastFull = this.StartBackup;
                        break;
                    case BackupType.Differential:
                        DirectoryInfo di2 = new DirectoryInfo(string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name));
                        FileInfo[] files2 = di2.GetFiles("LOG_*.BAK", SearchOption.TopDirectoryOnly);
                        foreach (FileInfo file in files2)
                        {
                            if (file.CreationTime < LastFull)
                            {
                                Console.Error.WriteLine("\tDEL {0}", file.Name);
                                file.Delete();
                            }
                        }
                        this.LastDiff = this.StartBackup;
                        break;
                    default:
                        this.LastLog = this.StartBackup;
                        break;
                }
            }
     
     
            /// <summary>
            /// Restores the database on another instance
            /// </summary>
            public void Restore(string remoteInstanceName)
            {
                if (this.Name == "master")
                {
                    return;
                }
                Console.Error.WriteLine("Starts restore of {0} on {1}", this.Name, remoteInstanceName);
                string restoreCmdData = "RESTORE DATABASE @name FROM DISK = @filename WITH NORECOVERY, REPLACE";
                string restoreCmdLog = "RESTORE LOG @name FROM DISK = @filename WITH NORECOVERY, REPLACE";
     
                using (SqlConnection cnx = new SqlConnection(string.Format(CultureInfo.CurrentCulture, "Server='{0}';Database=master;Trusted_Connection=True;", remoteInstanceName)))
                {
                    try
                    {
                        cnx.Open();
                    }
                    catch
                    {
                        Console.Error.WriteLine("Unable to connect at {0}", this.Name);
                        Console.WriteLine("Unable to connect at {0}", this.Name);
                        return;
                    }
     
                    using (SqlCommand cmd = cnx.CreateCommand())
                    {
                        cmd.CommandTimeout = 36000;
     
                        SqlParameter pName = cmd.CreateParameter();
                        pName.ParameterName = "name";
                        pName.SqlDbType = SqlDbType.VarChar;
                        pName.Size = 50;
                        cmd.Parameters.Add(pName);
     
                        SqlParameter pFilename = cmd.CreateParameter();
                        pFilename.ParameterName = "filename";
                        pFilename.SqlDbType = SqlDbType.VarChar;
                        pFilename.Size = 256;
                        cmd.Parameters.Add(pFilename);
     
                        if (this.LastFull == this.StartBackup)
                        {
                            cmd.CommandText = restoreCmdData;
                            pName.Value = this.Name;
                            pFilename.Value = string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}\\DATA_FULL_{3}.BAK", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name, this.StartBackup.ToString("yyyyMMddHHmmssfff", CultureInfo.CurrentCulture));
     
                            Console.Error.WriteLine("Performs FULL restore");
                            try
                            {
                                cmd.ExecuteNonQuery();
                            }
                            catch (Exception e)
                            {
                                Console.Error.WriteLine("Error during restore of {0} on {1} !!!", this.Name, remoteInstanceName);
                                Console.Error.WriteLine(e.Message);
                                Console.WriteLine("Error during restore of {0} on {1} !!!", this.Name, remoteInstanceName);
                                Console.WriteLine(e.Message);
                            }
                        }
     
                        cmd.CommandText = restoreCmdLog;
                        pName.Value = this.Name;
                        pFilename.Value = string.Format(CultureInfo.CurrentCulture, "{0}\\{1}\\{2}\\LOG_{3}.BAK", InstanceList.Instance.BackupUncPath, this.InstanceName.Replace('\\', '_'), this.Name, this.StartBackup.ToString("yyyyMMddHHmmssfff", CultureInfo.CurrentCulture));
     
                        Console.Error.WriteLine("Performs LOG restore");
                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception e)
                        {
                            Console.Error.WriteLine("Error during log retore of {0} on {1} !!!", this.Name, remoteInstanceName);
                            Console.Error.WriteLine(e.Message);
                            Console.WriteLine("Error during log restore of {0} on {1} !!!", this.Name, remoteInstanceName);
                            Console.WriteLine(e.Message);
                        }
                    }
     
                    if (cnx.State == ConnectionState.Open)
                    {
                        cnx.Close();
                    }
                }
            }
        }
     
        /// <summary>
        /// Represents a SQL Server Instance
        /// </summary>
        public class Instance
        {
            /// <summary>
            /// Instance full name (server\instance)
            /// </summary>
            public string Name { get; set; }
     
            /// <summary>
            /// List of databases of the instance
            /// </summary>
            public List<Database> Databases;
     
            /// <summary>
            /// Indicates the instance where the databases must be restored
            /// </summary>
            public string RestoreTo { get; set; }
     
            /// <summary>
            /// Instanciates a new Intance object
            /// </summary>
            /// <param name="serverNode">Configuration file XML node containing this instance</param>
            public Instance(XmlNode serverNode)
            {
                this.Name = serverNode.Attributes["name"].Value;
                if (serverNode.Attributes["restore"] != null)
                {
                    this.RestoreTo = serverNode.Attributes["restore"].Value;
                }
                else
                {
                    this.RestoreTo = string.Empty;
                }
                this.Databases = LoadDatabaseList(serverNode.SelectNodes("database"));
            }
     
            /// <summary>
            /// Loads databases of the instance, then complete them with configuration file
            /// </summary>
            /// <param name="databases">Configuration file xml nodes representing the instance databases</param>
            /// <returns></returns>
            public List<Database> LoadDatabaseList(XmlNodeList databases)
            {
                Console.Error.WriteLine("Loads databases list for {0}", this.Name);
                List<Database> list = new List<Database>();
                using (SqlConnection cnx = new SqlConnection(string.Format(CultureInfo.CurrentCulture, "Server='{0}';Database=master;Trusted_Connection=True;", this.Name)))
                {
                    try
                    {
                        cnx.Open();
                    }
                    catch
                    {
                        Console.Error.WriteLine("Unable to connect to MASTER on {0}", this.Name);
                        Console.WriteLine("Unable to connect to MASTER on {0}", this.Name);
                        return list;
                    }
     
                    using (SqlCommand cmd = cnx.CreateCommand())
                    {
                        cmd.CommandText = "select name from master.dbo.sysdatabases where name not in ('model', 'msdb', 'tempdb', 'ReportServer', 'ReportServerTempDB')";
                        SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult);
                        while (dr.Read())
                        {
                            bool found = false;
                            string databasename = dr.GetString(0);
                            Console.Error.WriteLine("\t- {0}", databasename);
     
                            foreach (XmlNode nd in databases)
                            {
                                if (nd.Attributes["name"].Value == databasename)
                                {
                                    list.Add(new Database(this.Name, nd));
                                    found = true;
                                    break;
                                }
                            }
     
                            if (!found)
                            {
                                list.Add(new Database(this.Name, databasename));
                            }
                        }
                    }
     
                    if (cnx.State == ConnectionState.Open)
                    {
                        cnx.Close();
                    }
                }
                return list;
            }
     
            /// <summary>
            /// Bakcups all the databases from the instance
            /// </summary>
            public void Backup()
            {
                Console.Error.WriteLine("Backups databases on {0}", this.Name);
                foreach (Database database in this.Databases)
                {
                    database.Backup();
                }
                if (this.RestoreTo.Length > 0)
                {
                    this.Restore();
                }
            }
     
            /// <summary>
            /// Restores all the databases to another instance
            /// </summary>
            public void Restore()
            {
                Console.Error.WriteLine("Restores databases from {0} to {1}", this.Name, this.RestoreTo);
                foreach (Database database in this.Databases)
                {
                    if (database.Name != "master")
                    {
                        database.Restore(this.RestoreTo);
                    }
                }
            }
        }
     
        /// <summary>
        /// Represents a list of Instance objects
        /// </summary>
        public sealed class InstanceList : List<Instance>
        {
            private static readonly InstanceList uniqueInstance = new InstanceList();
     
            /// <summary>
            /// UNC path to the backup
            /// </summary>
            public string BackupUncPath { get; set; }
     
            /// <summary>
            /// Interval between two FULL backups
            /// </summary>
            public int IntervalFull { get; set; }
     
            /// <summary>
            /// Interval between two DIFFERENTIAL backups
            /// </summary>
            public int IntervalDiff { get; set; }
     
            /// <summary>
            /// Instantiate a new InstanceList object
            /// </summary>
            private InstanceList()
            {
                Console.Error.WriteLine("Loads configuration");
                XmlDocument doc = new XmlDocument();
                doc.Load("servers.xml");
                this.BackupUncPath = doc.DocumentElement.SelectSingleNode("/backupsql/uncpath").InnerText;
                this.IntervalFull = int.Parse(doc.DocumentElement.SelectSingleNode("/backupsql/interval/full").InnerText, CultureInfo.CurrentCulture);
                this.IntervalDiff = int.Parse(doc.DocumentElement.SelectSingleNode("/backupsql/interval/diff").InnerText, CultureInfo.CurrentCulture);
                Console.Error.WriteLine("Backup path : {0}", this.BackupUncPath);
                Console.Error.WriteLine("Backup FULL intervall : {0}", this.IntervalFull);
                Console.Error.WriteLine("backup DIFF intervall : {0}", this.IntervalDiff);
                Console.Error.WriteLine("Instances to be backed up :");
                foreach (XmlNode nd in doc.DocumentElement.SelectNodes("/backupsql/servers/server"))
                {
                    Console.Error.WriteLine("\t- {0}", nd.Attributes["name"].Value);
                    this.Add(new Instance(nd));
                }
            }
     
            /// <summary>
            /// Saves configuration of the instance
            /// </summary>
            public void Save()
            {
                Console.Error.WriteLine("Saves configuration");
                XmlDocument doc = new XmlDocument();
                doc.Load("servers.xml");
                XmlNode ndInstances = doc.SelectSingleNode("/backupsql/servers");
                ndInstances.RemoveAll();
                foreach (Instance instance in this)
                {
                    XmlNode ndInstance = ndInstances.OwnerDocument.CreateElement("server");
                    XmlAttribute attInstanceName = ndInstance.OwnerDocument.CreateAttribute("name");
                    attInstanceName.Value = instance.Name;
                    XmlAttribute attInstanceRestoreTo = ndInstance.OwnerDocument.CreateAttribute("restore");
                    attInstanceRestoreTo.Value = instance.RestoreTo;
                    foreach (Database database in instance.Databases)
                    {
                        XmlNode ndDatabase = ndInstance.OwnerDocument.CreateElement("database");
                        XmlAttribute attDatabaseName = ndDatabase.OwnerDocument.CreateAttribute("name");
                        XmlAttribute attDatabaseLastFull = ndDatabase.OwnerDocument.CreateAttribute("lastfull");
                        XmlAttribute attDatabaseLastDiff = ndDatabase.OwnerDocument.CreateAttribute("lastdiff");
                        XmlAttribute attDatabaseLastLog = ndDatabase.OwnerDocument.CreateAttribute("lastlog");
                        attDatabaseName.Value = database.Name;
                        attDatabaseLastFull.Value = database.LastFull.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture);
                        attDatabaseLastDiff.Value = database.LastDiff.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture);
                        attDatabaseLastLog.Value = database.LastLog.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.CurrentCulture);
                        ndDatabase.Attributes.Append(attDatabaseName);
                        ndDatabase.Attributes.Append(attDatabaseLastFull);
                        ndDatabase.Attributes.Append(attDatabaseLastDiff);
                        ndDatabase.Attributes.Append(attDatabaseLastLog);
                        ndInstance.AppendChild(ndDatabase);
                    }
                    ndInstance.Attributes.Append(attInstanceName);
                    ndInstance.Attributes.Append(attInstanceRestoreTo);
                    ndInstances.AppendChild(ndInstance);
                }
                doc.Save("servers.xml");
            }
     
            /// <summary>
            /// Backups all the  SQL Server Instances
            /// </summary>
            public void Backup()
            {
                Console.Error.WriteLine("Starts backup of all instances");
     
                Task[] tasks = new Task[this.Count];
     
                for (int i = 0; i < this.Count; i++)
                {
                    var value = i;
                    tasks[value] = new Task(() => this[value].Backup());
                    tasks[value].Start();
                }
                Task.WaitAll(tasks);
     
                this.Save();
                Console.Error.WriteLine("Ends backup of all instances");
            }
     
            /// <summary>
            /// Singleton
            /// </summary>
            public static InstanceList Instance
            {
                get
                {
                    return uniqueInstance;
                }
            }
        }
    }

    servers.xml
    Code xml : 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
    24
    25
    26
    27
    28
    29
     
    <?xml version="1.0" encoding="utf-8" ?>
    <!-- SAMPLE FILE CONTENTS :
     
    <backupsql>
      <uncpath>\\localhost\Backup</uncpath>
      <interval>
        <full>24</full>
        <diff>1</diff>
      </interval>
      <servers>
        <server name="localhost">
          <database name="master" lastfull="1900-01-01 00:00:00.000" lastdiff="1900-01-01 00:00:00.000" lastlog="1900-01-01 00:00:00.000"/>
        </server>
      </servers>
    </backupsql>
     
    -->
     
    <backupsql>
      <uncpath>\\localhost\Backup</uncpath>
      <interval>
        <full></full>
        <diff></diff>
      </interval>
      <servers>
        <server name="localhost"/>
      </servers>
    </backupsql>

    Cet outil se contente de lancer la commande backup de SQL Server afin de sauvegarder base et logs à intervals réguliers (tourne toutes les 10 minutes).

    On a pu le mettre à l'épreuve à plusieurs reprises, ça marche nickel chrome. Même si je ne doute pas qu'une expertise de la part d'un vrai DBA permettrait de l'améliorer considérablement

    Si tu sais pas quoi faire de tes 1000 €, je veux bien te filer mon RIB par MP
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 146
    Points : 100
    Points
    100
    Par défaut
    gratuit et très bien:

    https://ola.hallengren.com/

    Une petitie notice bien complète ici:

    https://www.simple-talk.com/sql/data...s-free-script/

    Dans tous les cas il est inutile d'utiliser un logiciel qui coûte chère a moins que vous ayez de l'argent à gaspiller.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Merci à tous pour vos contributions !!
    Je vais essayer vos outils en espérant trouver celui qui me conviendra et viendrais à nouveau vous solliciter si jamais j'ai des questions.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    j'ai essayé la méthode de janlouk et de SQLpro : Créer un Backup Maintenance plan et le jouer dans un travail de l'agent.
    Aucun problème pour la sauvegarde tout est ok.

    Cependant, je n'arrive pas à configuré la sauvegarde sur un disque réseau mapper.
    Il ne me propose pas que les disques locaux "physique" :

    Nom : sql_disquereseau.png
Affichages : 572
Taille : 70,0 Ko
    J'ai suivi la procédure décrite ici : https://msdn.microsoft.com/fr-fr/lib...or=-2147217396 et je me suis assuré que le lecteur partagé est bien mappé sur un lecteur réseau dans la session où SQL Server est exécuté.

    Avez-vous une idée ? dois-je ouvrir une nouvelle discussion ?

    merci à StringBuilder pour son outil très complet (peut être un peu trop pour moi )

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Normal, Microsoft ne recommande pas la sauvegarde sur un disque réseau, car les risques de corruption des données sont trop grands.

    Il est préférable de sauvegarder en local, puis de copier la sauvegarde avec un outil tiers, qui vérifiera le checksum du fichier une fois copier par exemple.
    On ne jouit bien que de ce qu’on partage.

  14. #14
    Membre expérimenté
    Homme Profil pro
    DBA SQL Server
    Inscrit en
    Octobre 2012
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA SQL Server
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 862
    Points : 1 736
    Points
    1 736
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Il est préférable de sauvegarder en local, puis de copier la sauvegarde avec un outil tiers, qui vérifiera le checksum du fichier une fois copier par exemple.
    A voir si c'est mieux avec un soft, mais ne serait-ce pas plus simple de créer un job qui lance un .bat ? Et dans le .bat, il y a la commande qui fait la copie du fichier vers le share drive.
    Ce que nous avons fait pour nous-même meurt avec nous, ce que nous avons fait pour les autres et le monde est immortel. Albert Pike

    http://www.datacrossroad.be

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par kyrylo Voir le message
    Cependant, je n'arrive pas à configuré la sauvegarde sur un disque réseau mapper.
    C'est normal et prévu "as is". Cependant il est possible de sauvegarder directement vers un disque sur un autre serveur à condition d'utiliser la convention UNC de nommage des ressources distantes et non des lecteurs mappé !
    Par exemple \\MonServeur\MonPartage\monFichier
    Mais le compte système du service SQL Server doit avoir les droits en écriture sur la ressources distante.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [Batch] SCRIPT sauvegarde automatique avec un batch
    Par jonathan681 dans le forum Scripts/Batch
    Réponses: 27
    Dernier message: 28/06/2011, 13h13
  2. Script de sauvegarde automatique
    Par jpclutier dans le forum Administration
    Réponses: 12
    Dernier message: 30/11/2010, 20h00
  3. [Batch] Script de sauvegarde automatique
    Par Maanu61 dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 11/12/2009, 14h48
  4. sauvegarde automatique
    Par bourvil dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/11/2003, 14h13

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