Suite

Utiliser Python pour sauvegarder la géodatabase ArcSDE sur SQL Server Express ?


Est-il possible d'utiliser Python pour effectuer une sauvegarde des bases de données ArcSDE stockées dans SQL Server Express ? J'ai utilisé un exécutable personnalisé qui utilise Arcobjects

IDataServerManagerAdmin.BackupGeodatabase()

mais, je préférerais utiliser Python. L'exécutable rend notre personnel informatique un peu nerveux.


La sauvegarde d'une géodatabase sur un serveur de base de données, peut être effectuée à l'aide d'ArcCatalog et d'Arcobjects (IDataServerManagerAdmin.BackupGeodatabase()). Malheureusement, il n'est pas exposé à python ou à Arcpy.

Donc, pour automatiser le processus de sauvegarde, vous devez créer une procédure stockée dans MS SQL Server, puis créer un fichier batch pour appeler la procédure stockée. Enfin, planifiez le fichier batch.

Procédure stockée

USE [master] GO /****** Objet : StoredProcedure [dbo].[sp_BackupDatabases] ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[sp_BackupDatabases] @databaseName sysname = null, @backupType CHAR(1), @backupLocation nvarchar(200) AS SET NOCOUNT ON ; DECLARE @DBs TABLE ( ID int IDENTITY PRIMARY KEY, DBNAME nvarchar(500) ) -- Sélectionnez uniquement les bases de données en ligne au cas où TOUTES les bases de données sont choisies pour être sauvegardées -- Si une base de données spécifique est choisie pour être sauvegardée, choisissez uniquement celle-ci out from @DBs INSERT INTO @DBs (DBNAME) SELECT Name FROM master.sys.databases où state=0 AND [email protected] OU @DatabaseName IS NULL ORDER BY Name -- Filtre les bases de données qui n'ont pas besoin d'être sauvegardées IF @ backupType='F' BEGIN DELETE @DBs où DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks') END ELSE IF @backupType='D' BEGIN DELETE @DBs où DBNAME IN ('tempdb', 'Northwind','pubs','master','AdventureWorks') END ELSE IF @backupType='L' BEGIN DELETE @DBs où DBNAME IN ('tempdb','Northwind','pubs','master',' AdventureWorks') END ELSE BEGIN RETURN END -- Déclarer les variables DECLARE @BackupName varchar(100) DECLARE @BackupFile varchar(100) DECLARE @DBNAME varchar(300) DECLARE @sqlCommand NVARCHAR(1000) DECLARE @dateTime NVARCHAR(20) DECLARE @Loop dans t -- Parcourez les bases de données une par une SELECT @Loop = min(ID) FROM @DBs WHILE @Loop IS NOT NULL BEGIN -- Les noms de base de données doivent être au format [dbname] car certains ont - ou _ dans leur nom SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']' -- Définit la date et l'heure actuelles au format yyyyhhmmss SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101) ,'/',") + '_' + REPLACE(CONVERT(VARCHAR, GETDATE(),108),':',") -- Créer un nom de fichier de sauvegarde au format cheminfilename.extension pour les sauvegardes complètes, diff et de journal IF @backupType = 'F' SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',"),']',")+ '_FULL_'+ @dateTime+ '.BAK' ELSE IF @backupType = 'D' SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',"),']',")+ '_DIFF_'+ @dateTime+ '.BAK' ELSE IF @backupType = 'L' SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',"),']',")+ '_LOG_'+ @dateTime+ '.TRN' -- Fournissez à la sauvegarde un nom à stocker dans le média SI @backupType = 'F' SET @BackupName = REPLACE(REPL ACE(@DBNAME,'[',"),']',") +' sauvegarde complète pour '+ @dateTime IF @backupType = 'D' SET @BackupName = REPLACE(REPLACE(@DBNAME,'['," ),']',") +' sauvegarde différentielle pour '+ @dateTime IF @backupType = 'L' SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',"),']',") +' sauvegarde du journal pour '+ @dateTime -- Génère la commande SQL dynamique à exécuter IF @backupType = 'F' BEGIN SET @sqlCommand = 'BACKUP DATABASE ' [email protected]+ ' TO DISK ="[email protected]+"WITH INIT, NAME= "[email protected]+", NOSKIP, NOFORMAT' END IF @backupType = 'D' BEGIN SET @sqlCommand = 'BACKUP DATABASE ' [email protected]+ ' TO DISK ="[email protected]+"WITH DIFFERENTIAL, INIT, NAME="[email protected]+ ", NOSKIP, NOFORMAT' END IF @backupType = 'L' BEGIN SET @sqlCommand = 'BACKUP LOG ' [email protected]+ ' TO DISK ="[email protected]+"WITH INIT, NAME="[email protected]+", NOSKIP, NOFORMAT' END -- Exécutez la commande SQL générée EXEC(@sqlCommand) -- Accédez à la base de données suivante SELECT @Loop = min(ID) FROM @DBs where ID>@Loop END

Fichier de commandes

  1. pour les sauvegardes complètes de toutes les bases de données dans l'instance nommée locale de SQLEXPRESS à l'aide de l'authentification Windows

    sqlcmd -S .EXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='D:SQLBackups', @backupType='F'"

  2. Sauvegardes différentielles de toutes les bases de données dans l'instance nommée locale de SQLEXPRESS en utilisant un SQLLogin et son mot de passe

    sqlcmd -U SQLLogin -P mot de passe -S .SQLEXPRESS -Q "EXEC sp_BackupDatabases @backupLocation ='D:SQLBackups', @BackupType='D'"

Et planifiez-le avec le planificateur de tâches Windows.

Référence : Comment planifier et automatiser les sauvegardes des bases de données SQL Server dans SQL Server Express


Je suis d'accord avec la réponse de @Farid Cher selon laquelle, idéalement, vous devriez chercher à accomplir cela via une sauvegarde basée sur SQL, plutôt qu'une sauvegarde scriptée en externe. Cependant, si vous êtes déterminé à sauvegarder les données via python, je peux penser à 2 solutions possibles. Veuillez noter qu'aucun de ces éléments n'est de véritables sauvegardes de base de données. Cependant, ils peuvent toujours enregistrer en externe les données de votre base de données. Ainsi, en cas de perte de la base de données, vous pouvez créer une nouvelle base de données SDE et y copier les données sauvegardées.

Option 1) Créez une réplique unidirectionnelle à partir de votre base de données SDE vers un FileGDB qui se trouverait idéalement sur une autre machine sur un site différent (répliquez à l'aide d'une réplique basée sur l'archivage ou la gestion des versions traditionnelle). Ensuite, à partir de python, vous pouvez simplement planifier un script python qui utilise arcpy pour synchroniser la réplique à tout moment. Certaines des limitations de ceci sont qu'il ne sauvegardera qu'une seule version (quelle que soit la version à partir de laquelle vous créez la réplique). De plus, chaque fois que vous modifiez le schéma de votre base de données (ajout/modification de champs et/ou ajout/modification de classes d'entités/tables), vous devrez soit synchroniser les modifications de schéma et/ou recréer la réplique - selon le type de changement de schéma. De plus, toutes les classes d'entités que vous souhaitez sauvegarder devront être enregistrées comme versionnées ou avoir l'archivage activé, selon le type de réplica que vous utilisez.

Option 2) Vous pouvez écrire un script (ou rechercher dans les forums et les sites d'aide et reconstituer le code existant pour celui-ci), pour obtenir un script python qui parcourra chaque classe d'entités, ensemble de données d'entités, boîte à outils, table, etc. dans le SDE base de données et copiez l'ensemble de données dans un fichier FileGDB. Certaines choses à faire attention si vous utilisez cet itinéraire : si vous avez des classes de relations, soyez prudent car les outils de copie dans ArcGIS peuvent faire des choses intéressantes avec les données associées, votre script devra donc s'assurer que toutes les données sont correctement copiées (j'ai un exemple de code que je peux vous aider si vous voulez vraiment emprunter cette voie). Les limitations de ceci sont, bien que vous puissiez théoriquement le faire pour plusieurs versions de données, vous devrez faire une sauvegarde FileGDB distincte pour chaque version d'édition, ce qui signifie que vos besoins en espace de sauvegarde sur le disque dur et le temps requis pour exécuter la sauvegarde peuvent devenir volumineux/ longtemps rapidement. De plus, cette méthode de sauvegarde peut prendre beaucoup plus de temps que ce qui est réellement nécessaire pour une sauvegarde. Cela nécessite également de réécrire l'intégralité de la base de données chaque fois que vous souhaitez exécuter une sauvegarde, de sorte que cela peut représenter une grande consommation d'activité du disque dur (devrait être programmé pour s'exécuter à un moment d'arrêt pour le serveur/ordinateur) et aurait besoin ne doit certainement pas être sauvegardé sur un lecteur à semi-conducteurs FGDB ou un lecteur flash, car ce processus pourrait relativement rapidement maximiser les limitations d'écriture sur le disque en fonction de la fréquence et de la taille de la base de données. De plus, cette méthode peut (selon les outils de copie que vous utilisez) préserver les valeurs des champs GlobalID, mais n'est certainement PAS garantie de les préserver, donc ne l'utilisez pas si les globalids préservés sont une exigence pour vous.

Encore une fois, je suggère fortement d'utiliser une sauvegarde basée sur SQL pour obtenir une véritable sauvegarde de la base de données à l'aide de la méthode de fichier batch planifié décrite dans une autre réponse, mais, si vous devez absolument faire quelque chose via Python, j'espère que ce qui précède vous donne quelques idées pour travailler avec.


Voir la vidéo: для Начинающих - Работа с Базами Данных SQL Server (Octobre 2021).