Utilizar una secuencia de comandos de Python para conciliar y publicar versiones por lotes

Los administradores de geodatabases de ArcGIS pueden utilizar secuencias de comandos de Python para automatizar muchas tareas que normalmente se realizan 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 geodatabase.

Buscar usuarios conectados

En primer lugar, utilice la función ListUsers para determinar quién está conectado a la geodatabase. Es necesario proporcionar una conexión de administrador a la geodatabase para ejecutar la función ListUsers.

# get a list of connected users.
userList = arcpy.ListUsers("Database Connections/admin.sde")

Analizar la lista de usuarios conectados

Una vez que se dispone de la lista de usuarios conectados, puede notificar a esos usuarios que se deben desconectar de la geodatabase. 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 geodatabase tiene como nombre base su dirección de correo electrónico. Este ejemplo se puede alterar a fin de tener otros métodos para determinar las direcciones de correo electrónico.

# get a list of user names 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

Utilice la lista de correos electrónicos para enviar mensajes de correo electrónico a los usuarios de Phyton para informarles de que deben desconectarse de la geodatabase. 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.

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 geodatabase

Utilice la función AcceptConnections de ArcPy para bloquear las conexiones a la geodatabase mediante secuencias de comandos. Esta función está disponible sólo mediante una secuencia de comandos Python.

Esto evitará que nuevos usuarios se conecten a la geodatabase Las conexiones existentes seguirán existiendo.

#block new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', False)
NotaNota:

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 desconectar todas las conexiones, el proceso de compresión puede ser más eficiente.

Pausar 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

Utilice la función DisconnectUser de ArcPy para desconectar a los usuarios mediante secuencias de comandos. 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")
NotaNota:

Si desea desconectar solo usuarios específicos, proporcione una cadena de caracteres o una lista de Python de cadenas de caracteres correspondientes a los Id. de conexión de esas conexiones de usuario. La función ListUserts devuelve estos Id.

Reconciliar versiones y publicar cambios por lotes

La herramienta Conciliar versiones se puede utilizar para conciliar y publicar todas las versiones en una geodatabase corporativa. Esta herramienta proporciona opciones para conciliar todas las versiones de la geodatabase en una versión objetivo (ALL_VERSIONS) o solo unas versiones que impiden que la versión objetivo se comprima (BLOCKING_VERSIONS). 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 ejecuta como 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.

# 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 de los cambios, es importante comprimir la geodatabase 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')

Permitir conexiones a la geodatabase

Después de finalizar la conciliación y publicación de versiones y comprimir la geodatabase, se puede permitir la conexión a los usuarios.

# Allow new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', True)

Reconstruir índices y actualizar 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 introducir una lista de datasets y realizar sus funciones en todos los datasets a la vez. Estas herramientas también actualizan las estadísticas y regeneran los índices de las tablas de sistema pertinentes cuando se ejecutan como administrador de la geodatabase. La primera parte del proceso consiste en obtener una lista de datos y de los usuarios que son propietarios de ellos. Solo el propietario de los datos puede actualizar los índices y las estadísticas.

# 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)
NotaNota:

Los tokens con comodines que se utilizan para limitar los datasets que pertenecen al usuario dependen del sistema operativo. El ejemplo anterior ('*.' + userName + '.*') funcionará para SQL Server, PostgreSQL o DB2. En Oracle se puede usar el comodín siguiente: (userName + '.*'). En Informix se puede usar el comodín siguiente: ('*:' + userName + '.*').

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.

Si hay más de un propietario de datos, es necesario generar una lista de datos para cada uno de ellos y es necesario ejecutar las herramientas Reconstruir índices y Analizar datasets mientras se está conectado como cada uno de los usuarios.

# Execute rebuild indexes and analyze datasets
# Note: to use the "SYSTEM" option, the user must be an administrator.

workspace = "Database Connections/user1.sde"

arcpy.RebuildIndexes_management(workspace, "NO_SYSTEM", dataList, "ALL")

arcpy.AnalyzeDatasets_management(workspace, "NO_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:

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 user names 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

# Rebuild indexes and analyze the states and states_lineages system tables
arcpy.RebuildIndexes_management(workspace, "SYSTEM", "ALL")

arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", "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.

4/23/2015