Utilizar scripts de Python para conciliar y publicar versiones tradicionales por lotes

Disponible con una licencia Standard o Advanced.

Los administradores de geodatabases de ArcGIS pueden utilizar scripts 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 podría usar para ejecutar una conciliación programada de versiones tradicionales todas las noches.

Nota:

Este flujo de trabajo es específico para el versionado tradicional. El versionado en rama no presenta tablas de adiciones y borrados como el versionado tradicional y, por tanto, no requiere muchas de las tareas de administración descritas en este tema.

Muchos administradores querrán garantizar que, cuando se ejecute la conciliación, no haya otros usuarios conectados a la base de datos. Puede usar las funciones ListUsers y DisconnectUser de ArcPy para garantizar que solo 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("C:\\Projects\\MyProject\\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. Puede modificar este ejemplo para 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

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 scripts. Esta función está disponible solo mediante un script de Python.

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

#block new connections to the database.
arcpy.AcceptConnections('C:\\Projects\\MyProject\\admin.sde', False)
Nota:

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 el script

Para proporcionar a los usuarios un tiempo que les permita concluir su trabajo antes de desconectarlos, el script debe detenerse durante 15 minutos. Puede usar el módulo de tiempo en Python 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 scripts. Esta función está disponible solo mediante un script de Python.

Después de que los usuarios han sido notificados y el script se ha pausado durante 15 minutos, los usuarios se desconectan.

#disconnect all users from the database.
arcpy.DisconnectUser('C:\\Projects\\MyProject\\admin.sde', "ALL")
Nota:

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.

Conciliar versiones y publicar cambios por lotes

Puede utilizar la herramienta Conciliar versiones para conciliar y publicar todas las versiones de una geodatabase corporativa. Esta herramienta proporciona opciones para conciliar todas las versiones de la geodatabase en una versión de destino (ALL_VERSIONS) o solo unas versiones que impiden que la versión de destino 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.da.ListVersions('C:\\Projects\\MyProject\\admin.sde')

# Run the ReconcileVersions tool.
arcpy.ReconcileVersions_management('C:\\Projects\\MyProject\\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('C:\\Projects\\MyProject\\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('C:\\Projects\\MyProject\\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. Utilice las herramientas Reconstruir índices y Analizar datasets para realizar estos pasos. Estas herramientas permiten introducir una lista de datasets y utilizar 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 de este proceso consiste en obtener una lista de los datos y de los usuarios a los que estos pertenecen para a continuación actualizar los índices y las estadísticas como propietario de los datos.

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, se debe generar una lista de datos para cada uno de ellos y se deben ejecutar las herramientas Reconstruir índices y Analizar datasets mientras se está conectado como cada uno de los usuarios.

# set the workspace 
arcpy.env.workspace = "C:\\Projects\\MyProject\\user1.sde"

# Set a variable for the workspace
workspace = arcpy.env.workspace

# Get the username for the workspace
# this assumes you are using database authentication.
# OS authentication connection files do not have a 'user' property.
userName = arcpy.Describe(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 feature classes and add them to the primary list.
for dataset in arcpy.ListDatasets('*.' + userName + '.*'):
    dataList += arcpy.ListFeatureClasses(feature_dataset=dataset)

# Pass in the list of datasets owned by the connected user to the rebuild indexes 
# and update statistics on the data tables
arcpy.RebuildIndexes_management(workspace, "NO_SYSTEM", dataList, "ALL")
arcpy.AnalyzeDatasets_management(workspace, "NO_SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE"
Nota:

Los tokens con comodines que se utilizan para limitar los datasets que pertenecen al usuario son específicos de la base de datos. En el ejemplo anterior, ('*.' + userName + '.*') funciona para SQL Server, PostgreSQL o DB2. Para Oracle, puede utilizar el siguiente comodín: (userName + '.*').

Ejemplo de código completo

La siguiente muestra de código combina todas las piezas anteriores para realizar las siguientes operaciones como usuario administrador de la geodatabase:

  • Identificar los usuarios conectados.
  • Enviar una notificación por correo electrónico.
  • Impedir que la geodatabase acepte nuevas conexiones.
  • Desconectar usuarios.
  • Conciliar versiones y publicar cambios.
  • Comprimir la geodatabase.
  • Permitir que la geodatabase empiece a aceptar nuevas conexiones.
  • Reconstruir los índices y actualizar las estadísticas en las tablas del sistema.
import arcpy, time, smtplib

# Set the workspace. 
arcpy.env.workspace = 'C:\\Projects\\MyProject\\admin.sde'

# Set a variable for the workspace.
adminConn = arcpy.env.workspace

# Get a list of connected users.
userList = arcpy.ListUsers(adminConn)

# Get a list of usernames of users currently connected and make email addresses.
emailList = [user.Name + "@yourcompany.com" for user in arcpy.ListUsers(adminConn)]

# 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 email.
print("Sending email to connected users")
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, MESSAGE)
server.quit()

# Block new connections to the database.
print("The database is no longer accepting connections")
arcpy.AcceptConnections(adminConn, False)

# Wait 15 minutes.
time.sleep(900)

# Disconnect all users from the database.
print("Disconnecting all users")
arcpy.DisconnectUser(adminConn, "ALL")

# Get a list of versions to pass into the ReconcileVersions tool.
# Only reconcile versions that are children of Default.
print("Compiling a list of versions to reconcile")
verList = arcpy.da.ListVersions(adminConn)
versionList = [ver.name for ver in verList if ver.parentVersionName == 'sde.DEFAULT']

# Run the ReconcileVersions tool.
print("Reconciling all versions")
arcpy.ReconcileVersions_management(adminConn, "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. 
print("Running compress")
arcpy.Compress_management(adminConn)

# Allow the database to begin accepting connections again.
print("Allow users to connect to the database again")
arcpy.AcceptConnections(adminConn, True)

# Update statistics and indexes for the system tables.
# Note: To use the "SYSTEM" option, the user must be an geodatabase or database administrator.
# Rebuild indexes on the system tables.
print("Rebuilding indexes on the system tables")
arcpy.RebuildIndexes_management(adminConn, "SYSTEM")

# Update statistics on the system tables.
print("Updating statistics on the system tables")
arcpy.AnalyzeDatasets_management(adminConn, "SYSTEM")

print("Finished.")

Programación automatizada del script

Una vez que completado el script, puede programarlo para que se ejecute a intervalos establecidos en un momento específico, utilizando el programador de tareas del sistema operativo.