- Buscar usuarios conectados
- Analizar la lista de usuarios conectados
- Generar y enviar un mensaje de correo electrónico
- Bloquear conexiones a la geodatabase
- Pausar la secuencia de comandos
- Desconectar usuarios
- Conciliar versiones y publicar cambios por lotes
- Comprimir la geodatabase
- Permitir conexiones a la geodatabase
- Reconstruir índices y actualizar estadísticas
- Ejemplo de código completo
- Programación automatizada de la secuencia de comandos
Los administradores de geodatabases de ArcGIS pueden utilizar secuencias de comandos de Python para automatizar muchas tareas de administración de versiones 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. Use 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. Proporcione 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)
Pausar la secuencia de comandos
Para dar a los usuarios tiempo para concluir su trabajo antes de desconectarlos, la secuencia de comandos debe detenerse durante el tiempo especificado. En este ejemplo, el módulo de tiempo en Python se puede utilizar para dar un tiempo de espera de 15 minutos antes de desconectar a los usuarios.
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 hayan recibido la notificación y de que la secuencia de comandos se haya detenido durante 15 minutos, todos los usuarios restantes se desconectarán.
#disconnect all users from the database.
arcpy.DisconnectUser('Database Connections/admin.sde', "ALL")
Conciliar versiones y publicar cambios por lotes
Use la herramienta Conciliar las versiones 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 de destino (ALL_VERSIONS) o solo las versiones que impiden que la versión de destino se comprima (BLOCKING_VERSIONS). Esta herramienta genera una compresión eficaz, ya que permite conciliar y publicar varias versiones al mismo tiempo en un orden adecuado. 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 (básicas).
# 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 llevar a cabo con 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. Tenga en cuenta que en algunos sistemas de administración de bases de datos, la reconstrucción de los índices también actualiza las estadísticas. Si el sistema de administración de bases de datos que está usando tiene este comportamiento, solo tendrá que reconstruir los índices.
La primera parte del proceso consiste en obtener una lista de datos y de los usuarios que son propietarios de ellos. Es necesario porque solo el propietario de los datos puede actualizar los índices y las estadísticas.
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.
# set the workspace
arcpy.env.workspace = "C:\\Projects\\MyProject\\user1.sde"
# Set a variable for the workspace
workspace = arcpy.env.workspace
# 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(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)
# 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"
Ejemplo de código completo
El siguiente ejemplo de código combina todas las piezas anteriores para realizar las siguientes operaciones como 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.
- Comprima 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 user names 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 mail
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.ListVersions(adminConn)
versionList = [ver.name for ver in verList if ver.parentVersionName == 'sde.DEFAULT']
# Execute 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 de la secuencia de comandos
Puede programar el sistema de modo que la secuencia de comandos completa se ejecute a intervalos definidos a una hora concreta 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.