Utilizar una secuencia de comandos de Python para conciliar y publicar versiones por lotes
Los administradores de la geodatabase de ArcGIS pueden utilizar una secuencia de comandos de Python para automatizar muchas tareas que se realizan normalmente utilizando varias herramientas de geoprocesamiento. En este tema se explica el proceso que un administrador puede usar para ejecutar una conciliación programada de versiones todas las noches.
Muchos administradores querrán garantizar que, cuando se ejecute la conciliación, no haya otros usuarios conectados a la base de datos. Las funciones ListUsers y DisconnectUser de ArcPy se pueden utilizar para garantizar que sólo el administrador esté conectado a la base de datos.
Encontrar usuarios conectados
El primer paso para desconectar usuarios es determinar quién está conectado a la base de datos. Se utiliza la función ListUsers, a través de una conexión de administrador.
# get a list of connected users. userList = arcpy.ListUsers("Database Connections/admin.sde")
Analizar la lista de usuarios conectados
Una vez que la lista de los usuarios conectados se ha creado, se puede utilizar para informar a los usuarios que deben desconectarse. Esto se puede hacer obteniendo una lista de los usuarios y sus direcciones de correo electrónico asociadas.
Para hacerlo más sencillo, en este ejemplo se supone que cada usuario conectado a la base de datos tiene como nombre base su dirección de correo electrónico. Este ejemplo se puede alterar fácilmente a fin de tener otros métodos para determinar las direcciones de correo electrónico.
# get a list of usernames from the list of named tuples returned from ListUsers userNames = [u.Name for u in userList] # take the userNames list and make email addresses by appending the appropriate suffix. emailList = [name + '@company.com' for name in userNames]
Generar y enviar un mensaje de correo electrónico
Una vez que la lista de correo electrónico se haya generado, puede enviarse un mensaje de correo electrónico desde Python. En este ejemplo se utiliza el módulo smtplib de Python, pero hay otras opciones para el envío de correos electrónicos a través de módulos no estándar.
Para obtener más información sobre el módulo smtplib, consulte la documentación de Python en
import smtplib SERVER = "mailserver.yourcompany.com" FROM = "SDE Admin <python@yourcompany.com>" TO = emailList SUBJECT = "Maintenance is about to be performed" MSG = "Auto generated Message.\n\rServer maintenance will be performed in 15 minutes. Please log off." # Prepare actual message MESSAGE = """\ From: %s To: %s Subject: %s %s """ % (FROM, ", ".join(TO), SUBJECT, MSG) # Send the mail server = smtplib.SMTP(SERVER) server.sendmail(FROM, TO, MESSAGE) server.quit()
Bloquear conexiones a la base de datos
El flujo de trabajo para bloquear conexiones a la base de datos a través de una secuencia de comandos es utilizar la función AcceptingConnections de ArcPy. Esta función está disponible sólo mediante una secuencia de comandos Python.
Después de que los usuarios han sido notificados y la secuencia de comandos se ha mantenido detenida durante 15 minutos, los usuarios son conectados.
#block new connections to the database. arcpy.AcceptConnections('Database Connections/admin.sde', False)
No es necesario bloquear conexiones a la base de datos o desconectar todos los usuarios para realizar estas tareas de mantenimiento. Si su organización puede permitirse que todas las conexiones sean desconectadas, el proceso de compresión puede ser más eficiente.
Detener la secuencia de comandos
Para proporcionar a los usuarios un tiempo que les permita concluir su trabajo antes de desconectarlos, la secuencia de comandos debe detenerse durante 15 minutos. El módulo de tiempo en Python se puede utilizar para dar un tiempo de espera de 15 minutos antes de que los usuarios conectados sean desconectados.
import time time.sleep(900)#time is specified in seconds
Desconectar usuarios
El flujo de trabajo para desconectar usuarios a través de una secuencia de comandos es utilizar la función DisconnectUser de ArcPy. Esta función está disponible sólo mediante una secuencia de comandos Python.
Después de que los usuarios han sido notificados y la secuencia de comandos se ha mantenido detenida durante 15 minutos, los usuarios son conectados.
#disconnect all users from the database. arcpy.DisconnectUser('Database Connections/admin.sde', "ALL")
Alternativamente, si desea desconectar sólo algunos usuarios específicos, el Id. obtenido con la función ListUsers o el cuadro de diálogo de usuarios conectados puede proporcionarse como una cadena de caracteres o una lista de cadenas de caracteres de Python para desconectar los usuarios correspondientes.
Conciliación por lotes
La herramienta Conciliar versiones se pueden utilizar para conciliar y publicar todas las versiones en una geodatabase corporativa. Esta herramienta ofrece opciones para conciliar todas las versiones en la geodatabase a una versión de destino o sólo las versiones que están ancladas a un valor predeterminado. Esta herramienta es un medio para obtener una compresión eficaz, ya que permite conciliar y publicar varias versiones al mismo tiempo en una secuencia adecuada. En este ejemplo, la herramienta se está ejecutando como el administrador de la geodatabase. Conectarse como administrador de la geodatabase proporciona capacidad para conciliar y publicar todas las versiones en la geodatabase, incluidas las versiones privadas o protegidas que sean de propiedad de otros usuarios.
Más información sobre la herramienta de geoprocesamiento Conciliar versiones
# Get a list of versions to pass into the ReconcileVersions tool. versionList = arcpy.ListVersions('Database Connections/admin.sde') # Execute the ReconcileVersions tool. arcpy.ReconcileVersions_management('Database Connections/admin.sde', "ALL_VERSIONS", "sde.DEFAULT", versionList, "LOCK_ACQUIRED", "NO_ABORT", "BY_OBJECT", "FAVOR_TARGET_VERSION", "POST", "DELETE_VERSION", "c:/temp/reconcilelog.txt")
Comprimir la geodatabase
Después de la conciliación y la publicación, es importante comprimir la base de datos para eliminar cualquier información redundante y mover las modificaciones a las tablas de negocio.
# Run the compress tool. arcpy.Compress_management('Database Connections/admin.sde')
Reconstruir los índices y actualizar las estadísticas
Después de realizar una operación de compresión, se recomienda reconstruir los índices y actualizar las estadísticas. Estos pasos se pueden realizar utilizando las herramientas Reconstruir índices y Analizar datasets. Estas herramientas permiten ingresar una lista de datasets de entrada y realizar sus funciones en todos los datasets a la vez. Estas herramientas también actualizan las estadísticas y reconstruyen los índices de las tablas de sistema correspondientes. La primera parte de este proceso es obtener una lista de los datos que el usuario posee. Los índices y las estadísticas sólo pueden ser actualizados por el propietario de los datos o por los usuarios que tengan algunos privilegios de administración.
# set the workspace arcpy.env.workspace = 'Database Connections/admin.sde' # Get the user name for the workspace # this assumes you are using database authentication. # OS authentication connection files do not have a 'user' property. userName = arcpy.Describe(arcpy.env.workspace).connectionProperties.user # Get a list of all the datasets the user has access to. # First, get all the stand alone tables, feature classes and rasters owned by the current user. dataList = arcpy.ListTables('*.' + userName + '.*') + arcpy.ListFeatureClasses('*.' + userName + '.*') + arcpy.ListRasters('*.' + userName + '.*') # Next, for feature datasets owned by the current user # get all of the featureclasses and add them to the master list. for dataset in arcpy.ListDatasets('*.' + userName + '.*'): dataList += arcpy.ListFeatureClasses(feature_dataset=dataset)
Una vez que se identifica la lista de los datos que son propiedad del usuario, puede procesarse con las herramientas Reconstruir índices y Analizar datasets.
Para hacerlo más sencillo, esta secuencia de comandos supone que el usuario administrativo (admin) también es el propietario de los datos. Si tiene varios propietarios de datos, debe generarse una lista de datos por cada propietario de datos y procesarla con las herramientas Reconstruir índices y Analizar datasets.
El comodín tokens utilizado para limitar los datasets que pertenecen al usuario será específico del sistema operativo. El ejemplo anterior ('*.' + userName + '.*') funcionará para SQL Server, PostgreSQL o DB2. En Oracle, el siguiente comodín se puede utilizar: (userName + '.*'). En Informix, el siguiente comodín se puede utilizar: ('*: " + userName + '.*')
# Execute rebuild indexes and analyze datasets # Note: to use the "SYSTEM" option the user must be an administrator. workspace = "Database Connections/admin.sde" arcpy.RebuildIndexes_management(workspace, "SYSTEM", dataList, "ALL") arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
Ejemplo de código completo
El siguiente ejemplo de código pone todas las piezas anterior juntas para realizar las siguientes operaciones:
- Identifica los usuarios conectados
- Envía una notificación por correo electrónico
- Impide que la base de datos acepte nuevas conexiones
- Desconecta usuarios
- Concilia versiones
- Comprime la base de datos
- Reconstruye los índices y recopila estadísticas
- Permite que la base de datos empiece a aceptar nuevas conexiones
import arcpy, time, smtplib # set the workspace arcpy.env.workspace = 'Database Connections/admin.sde' # set a variable for the workspace workspace = arcpy.env.workspace # get a list of connected users. userList = arcpy.ListUsers("Database Connections/admin.sde") # get a list of usernames of users currently connected and make email addresses emailList = [u.Name + "@yourcompany.com" for user in arcpy.ListUsers("Database Connections/admin.sde")] # take the email list and use it to send an email to connected users. SERVER = "mailserver.yourcompany.com" FROM = "SDE Admin <python@yourcompany.com>" TO = emailList SUBJECT = "Maintenance is about to be performed" MSG = "Auto generated Message.\n\rServer maintenance will be performed in 15 minutes. Please log off." # Prepare actual message MESSAGE = """\ From: %s To: %s Subject: %s %s """ % (FROM, ", ".join(TO), SUBJECT, MSG) # Send the mail server = smtplib.SMTP(SERVER) server.sendmail(FROM, TO, MESSAGE) server.quit() #block new connections to the database. arcpy.AcceptConnections('Database Connections/admin.sde', False) # wait 15 minutes time.sleep(900) #disconnect all users from the database. arcpy.DisconnectUser('Database Connections/admin.sde', "ALL") # Get a list of versions to pass into the ReconcileVersions tool. versionList = arcpy.ListVersions('Database Connections/admin.sde') # Execute the ReconcileVersions tool. arcpy.ReconcileVersions_management('Database Connections/admin.sde', "ALL_VERSIONS", "sde.DEFAULT", versionList, "LOCK_ACQUIRED", "NO_ABORT", "BY_OBJECT", "FAVOR_TARGET_VERSION", "POST", "DELETE_VERSION", "c:/temp/reconcilelog.txt") # Run the compress tool. arcpy.Compress_management('Database Connections/admin.sde') #Allow the database to begin accepting connections again arcpy.AcceptConnections('Database Connections/admin.sde', True) #Get a list of datasets owned by the admin user # Get the user name for the workspace # this assumes you are using database authentication. # OS authentication connection files do not have a 'user' property. userName = arcpy.Describe(arcpy.env.workspace).connectionProperties.user # Get a list of all the datasets the user has access to. # First, get all the stand alone tables, feature classes and rasters. dataList = arcpy.ListTables('*.' + userName + '.*') + arcpy.ListFeatureClasses('*.' + userName + '.*') + arcpy.ListRasters('*.' + userName + '.*') # Next, for feature datasets get all of the featureclasses # from the list and add them to the master list. for dataset in arcpy.ListDatasets('*.' + userName + '.*'): dataList += arcpy.ListFeatureClasses(feature_dataset=dataset) # pass in the list of datasets owned by the admin to the rebuild indexes and analyze datasets tools # Note: to use the "SYSTEM" option the user must be an administrator. arcpy.RebuildIndexes_management(workspace, "SYSTEM", dataList, "ALL") arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
Programación automatizada de la secuencia de comandos
Una vez que se haya completado la secuencia de comandos, se puede programar para que se ejecute a intervalos establecidos en un momento específico, utilizando el programador de tareas del sistema operativo.
Para obtener instrucciones sobre la creación de una tarea programada para ejecutarse en Windows, consulte Programación de una secuencia de comandos de Python para que se ejecute en periodos establecidos.