Más

¿Utiliza Python para hacer una copia de seguridad de la geodatabase de ArcSDE en SQL Server Express?

¿Utiliza Python para hacer una copia de seguridad de la geodatabase de ArcSDE en SQL Server Express?


¿Es posible utilizar Python para hacer una copia de seguridad de las bases de datos de ArcSDE almacenadas en SQL Server Express? He estado usando un ejecutable personalizado que usa Arcobjects

IDataServerManagerAdmin.BackupGeodatabase ()

pero preferiría usar Python. El ejecutable pone un poco nervioso a nuestro personal de TI.


La copia de seguridad de una geodatabase en un servidor de base de datos se puede realizar mediante ArcCatalog y Arcobjects (IDataServerManagerAdmin.BackupGeodatabase ()). Desafortunadamente, no está expuesto a Python o Arcpy.

Entonces, para automatizar el proceso de copia de seguridad, debe crear un procedimiento almacenado en MS SQL Server y luego crear un archivo por lotes para llamar al procedimiento almacenado. Finalmente, programe el archivo por lotes.

Procedimiento almacenado

USE [master] GO / ****** Object: StoredProcedure [dbo]. [Sp_BackupDatabases] ****** / SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREAR PROCEDIMIENTO [dbo]. [Sp_BackupDatabases] @databaseName sysname = nulo, @backupType CHAR (1), @backupLocation nvarchar (200) AS SET NOCOUNT ON; DECLARE @DBs TABLE (ID int IDENTITY PRIMARY KEY, DBNAME nvarchar (500)) - Elija solo las bases de datos que están en línea en caso de que se elija respaldar TODAS las bases de datos - Si se elige una base de datos específica para respaldar, solo elija esa out from @DBs INSERT INTO @DBs (DBNAME) SELECT Name FROM master.sys.databases donde state = 0 AND name = @ DatabaseName O @DatabaseName IS NULL ORDER BY Name - Filtra las bases de datos que no necesitan copia de seguridad IF @ backupType = 'F' BEGIN DELETE @DBs donde DBNAME IN ('tempdb', 'Northwind', 'pubs', 'AdventureWorks') END ELSE IF @ backupType = 'D' BEGIN DELETE @DBs donde DBNAME IN ('tempdb', 'Northwind', 'pubs', 'master', 'AdventureWorks') END ELSE IF @ backupType = 'L' BEGIN DELETE @DBs where DBNAME IN ('tempdb', 'Northwind', 'pubs', 'master', ' AdventureWorks ') END ELSE BEGIN RETURN END - Declarar variables DECLARAR @BackupName varchar (100) DECLARAR @BackupFile varchar (100) DECLARAR @DBNAME varchar (300) DECLARAR @sqlCommand NVARCHAR (1000) DECLARAR @dateTime NVARCHAR (20) DECLARAR @Loop en t - Recorre las bases de datos una por una SELECT @Loop = min (ID) FROM @DBs MIENTRAS que @Loop NO ES NULL BEGIN - Los nombres de las bases de datos deben estar en formato [dbname] ya que algunos tienen - o _ en su nombre SET @DBNAME = '[' + (SELECT DBNAME FROM @DBs WHERE ID = @Loop) + ']' - Establece la fecha y hora actuales n formato yyyyhhmmss SET @dateTime = REPLACE (CONVERT (VARCHAR, GETDATE (), 101) , '/', ") + '_' + REPLACE (CONVERT (VARCHAR, GETDATE (), 108), ':',") - Crea un nombre de archivo de copia de seguridad en la ruta  nombre de archivo.formato de extensión para copias de seguridad completas, de diferencias y de registro 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' - Proporcione a la copia de seguridad un nombre para almacenar en el medio SI @backupType = 'F' SET @BackupName = REPLACE (REPL ACE (@DBNAME, '[', "), ']',") + 'copia de seguridad completa para' + @dateTime IF @backupType = 'D' SET @BackupName = REPLACE (REPLACE (@DBNAME, '[', " ), ']', ") + 'copia de seguridad diferencial para' + @dateTime IF @backupType = 'L' SET @BackupName = REPLACE (REPLACE (@DBNAME, '[',"), ']', ") + ' log backup for '+ @dateTime - Genere el comando SQL dinámico que se ejecutará IF @backupType =' F 'BEGIN SET @sqlCommand =' BACKUP DATABASE '+ @ DBNAME +' TO DISK = "+ @ BackupFile +" WITH INIT, NAME = "+ @ BackupName +", NOSKIP, NOFORMAT 'END IF @backupType =' D 'BEGIN SET @sqlCommand =' BACKUP DATABASE '+ @ DBNAME +' TO DISK = "+ @ BackupFile +" CON DIFFERENTIAL, INIT, NAME = "+ @ BackupName + ", NOSKIP, NOFORMAT 'END IF @backupType =' L 'BEGIN SET @sqlCommand =' BACKUP LOG '+ @ DBNAME +' TO DISK =" + @ BackupFile + "WITH INIT, NAME =" + @ BackupName + ", NOSKIP, NOFORMAT ' END - Ejecute el comando SQL generado EXEC (@sqlCommand) - Ir a la siguiente base de datos SELECT @Loop = min (ID) FROM @DBs donde ID> @Loop END

Archivo por lotes

  1. para realizar copias de seguridad completas de todas las bases de datos en la instancia con nombre local de SQLEXPRESS mediante la autenticación de Windows

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

  2. Copias de seguridad diferenciales de todas las bases de datos en la instancia con nombre local de SQLEXPRESS mediante el uso de SQLLogin y su contraseña

    sqlcmd -U SQLLogin -P contraseña -S. SQLEXPRESS -Q "EXEC sp_BackupDatabases @backupLocation = 'D: SQLBackups', @ BackupType = 'D'"

Y programarlo con el Programador de tareas de Windows.

Referencia: Cómo programar y automatizar copias de seguridad de bases de datos de SQL Server en SQL Server Express


Estoy de acuerdo con la respuesta de @Farid Cher de que, idealmente, debería buscar lograr esto a través de una copia de seguridad basada en SQL, en lugar de una copia de seguridad con un script externo. Sin embargo, si está decidido a hacer una copia de seguridad de los datos a través de Python, puedo pensar en 2 posibles soluciones. Tenga en cuenta que ninguno de estos son verdaderos respaldos de la base de datos. Sin embargo, aún pueden guardar externamente los datos de su base de datos, por lo que, en caso de pérdida de la base de datos, podría crear una nueva base de datos SDE y copiar los datos respaldados en ella.

Opción 1) Cree una réplica unidireccional desde su base de datos SDE a un FileGDB que idealmente estaría en otra máquina en un sitio diferente (replicar usando archivado o réplica tradicional basada en versiones). Luego, desde Python, simplemente puede programar un script de Python que use arcpy para sincronizar la réplica en cualquier momento que lo necesite. Algunas de las limitaciones de esto son que solo hará una copia de seguridad de una versión (cualquiera que sea la versión de la que cree la réplica). Además, cada vez que cambie el esquema de su base de datos (agregando / cambiando campos y / o agregando / cambiando clases / tablas de entidad) necesitará sincronizar los cambios de esquema y / o volver a crear la réplica, según el tipo de cambio de esquema. Además, todas las clases de entidades de las que desee realizar una copia de seguridad deberán estar registradas como versionadas o tener habilitado el archivado, según el tipo de réplica que utilice.

Opción 2) Puede escribir una secuencia de comandos (o buscar en los foros y sitios de ayuda y armar el código existente para ella), para obtener una secuencia de comandos de Python que recorrerá cada clase de entidad, conjunto de datos de entidad, caja de herramientas, tabla, etc. en el SDE base de datos y copie el conjunto de datos en un FileGDB. Algunas cosas con las que debe tener cuidado si usa esta ruta: si tiene clases de relación, tenga cuidado porque las herramientas de copia en ArcGIS pueden hacer algunas cosas interesantes con datos relacionados, por lo que su secuencia de comandos tendrá que asegurarse de que todos los datos se copien correctamente (tengo algún código de muestra, puedo ayudarlo con esto si realmente desea seguir esta ruta). Las limitaciones de esto son, si bien teóricamente puede hacer esto para múltiples versiones de datos, tendrá que hacer una copia de seguridad FileGDB separada para cada versión de edición, lo que significa que sus requisitos de espacio en el disco duro de copia de seguridad y el tiempo requerido para ejecutar la copia de seguridad pueden aumentar / mucho tiempo rápidamente. Además, este método de copia de seguridad puede tardar mucho más de lo que es realmente necesario para una copia de seguridad. Esto también requiere volver a escribir toda la base de datos cada vez que desee ejecutar una copia de seguridad, por lo que puede suponer una gran cantidad de consumo de actividad del disco duro (debería programarse para ejecutarse en un tiempo de inactividad para el servidor / computadora) y necesitaría definitivamente no se debe realizar una copia de seguridad en una unidad de estado sólido FGDB o una unidad flash, ya que este proceso podría maximizar con relativa rapidez las limitaciones de escritura en el disco dependiendo de la frecuencia y el tamaño de la base de datos. Además, este método puede (dependiendo de las herramientas de copia que use) conservar los valores de campo de GlobalID, pero definitivamente NO se garantiza que los conservará, así que no lo use si los globalids preservados son un requisito para usted.

Nuevamente, sugiero encarecidamente usar una copia de seguridad basada en SQL para obtener una verdadera copia de seguridad de la base de datos utilizando el método de archivo por lotes programado que se describe en otra respuesta, pero, si es absolutamente necesario hacer algo a través de Python, es de esperar que lo anterior le brinde algunas ideas para trabajar con.