Администраторы баз геоданных ArcGIS могут использовать скрипты Python для автоматизации многих задач, которые обычно выполняются с использованием нескольких инструментов геообработки. В данном разделе описывается процесс, при помощи которого администраторы смогут запускать запланированное согласование традиционных версий в ночное время.
Примечание:
Этот рабочий процесс относится именно к традиционным версиям. Поскольку версии ветви не имеют таблиц добавления и удаления, как традиционные версии, то они не требуют выполнения большинства администраторских задач, описанных в данном разделе.
Многие администраторы хотят быть уверены в том, что во время согласования версий другие пользователи не подключены к базе данных. Функции ArcPy ListUsers и DisconnectUser могут обеспечить подключение к базе геоданных только администратора.
Поиск подключенных пользователей
Сначала используйте функцию ListUsers для определения пользователей, подключенных к базе геоданных. Для запуска функции ListUsers необходимо указать административное подключение к базе геоданных.
# Get a list of connected users.
userList = arcpy.ListUsers("C:\\Projects\\MyProject\\admin.sde")
Анализ списка подключенных пользователей
После получения списка подключенных пользователей вы можете уведомить их о необходимости отключения от базы геоданных. Это можно сделать, получив список пользователей и их адресов электронной почты.
Для упрощения задачи в приведенном примере предполагается, что каждый пользователь, подключенный к базе геоданных, использует то же основное имя, которое указано в адресе электронной почты. Этот пример можно изменить для использования других способов определения адресов электронной почты.
# 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]
Создание и отправка электронных писем
Используйте список адресов электронной почты для отправки из Python сообщений о необходимости отключения от базы геоданных. В данном примере используется модуль smtplib, входящий в Python, однако имеются и другие опции для отправки электронных писем с использованием нестандартных модулей.
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()
Блокировка подключений к базе геоданных
Используйте функцию ArcPy AcceptConnections для блокировки подключений к базе геоданных через скрипт. Доступ к этой функции возможен только с использованием скрипта Python.
Это не позволит новым пользователям подключиться к базе геоданных. Существующие подключения по-прежнему действуют.
#Block new connections to the database.
arcpy.AcceptConnections('C:\\Projects\\MyProject\\admin.sde', False)
Примечание:
Нет необходимости блокировать подключения к базе данных или отключать всех пользователей для проведения данного обслуживания. Если в вашей организации можно отключить всех пользователей, процесс сжатия будет более эффективным.
Приостановка скрипта
Чтобы предоставить пользователям время закончить свою работу перед их отключением, выполнение скрипта необходимо приостановить на 15 минут. В Python имеется модуль времени, при помощи которого можно предоставить пользователям 15-минутный период отсрочки перед их отключением.
import time
time.sleep(900)#time is specified in seconds
Отключение пользователей
Для отключения пользователей с помощью скрипта используйте функцию ArcPy DisconnectUser. Доступ к этой функции возможен только с использованием скрипта Python.
После того как все пользователи получили уведомления и выполнение скрипта было приостановлено на 15 минут, производится отключение пользователей.
#Disconnect all users from the database.
arcpy.DisconnectUser('C:\\Projects\\MyProject\\admin.sde', "ALL")
Примечание:
Если необходимо отключить только определенных пользователей, укажите строку или список строк Python с ID подключений данных пользователей. Эти ID возвращаются функцией ListUsers.
Пакетное согласование версий и фиксация изменений
Чтобы согласовать и закрепить все версии в многопользовательской базе геоданных, можно использовать инструмент Согласовать версии. Этот инструмент предоставляет возможности для согласования всех версий в базе геоданных с целевой версией (ALL_VERSIONS) или только тех версий, которые блокируют сжатие целевой версии (BLOCKING_VERSIONS). Этот инструмент является средством для выполнения эффективного сжатия, так как он обеспечивает одновременное согласование и закрепление нескольких версий в надлежащем порядке. В этом примере инструмент запускается администратором базы геоданных. Подключение в качестве администратора дает возможность согласовать и закрепить все версии в базе геоданных, включая частные или защищенные версии других пользователей.
# Get a list of versions to pass into the ReconcileVersions tool. versionList = arcpy.ListVersions('C:\\Projects\\MyProject\\admin.sde')
# Execute 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")
Сжатие базы геоданных
После согласования и закрепления изменений важно выполнить сжатие базы геоданных, чтобы удалить всю лишнюю информацию и переместить изменения в бизнес-таблицы.
# Run the compress tool.
arcpy.Compress_management('C:\\Projects\\MyProject\\admin.sde')
Разрешение подключений к базе геоданных
Теперь, после завершения согласования и закрепления версий и сжатия базы геоданных, вы можете разрешить пользователям подключение к ней.
# Allow new connections to the database.
arcpy.AcceptConnections('C:\\Projects\\MyProject\\admin.sde', True)
Перестроение индексов и обновление статистики
По завершении сжатия рекомендуется перестроить индексы и обновить статистику. Эти шаги можно выполнить с использованием инструментов Перестроить индексы и Анализировать наборы данных. Эти инструменты позволяют ввести список наборов данных и выполнить их функции для всех наборов данных одновременно. Эти инструменты, при запуске от имени администратора базы геоданных, также обновляют статистику и перестраивают индексы соответствующих системных таблиц. Первый этап этого процесса – получение списка данных и пользователей, которые ими владеют, а затем обновление индексов и статистики в качестве владельца данных.
После того как определен список данных, которыми владеет пользователь, их можно обработать с использованием инструментов Перестроить индексы и Анализировать наборы данных.
Если у вас имеется несколько владельцев данных, необходимо построить список данных для каждого владельца и запустить инструменты Перестроить индексы и Анализировать наборы данных при подключении от имени каждого пользователя.
# 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 feature classes 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"
Примечание:
Токены подстановочных знаков используются для выбора наборов данных, принадлежащих пользователям, и являются специфичными для базы данных. В приведенном выше примере ('*.' + userName + '.*') будет работать в SQL Server, PostgreSQL или DB2. В Oracle можно использовать следующие подстановочные знаки: (userName + '.*').
Пример полного кода
В примере кода, приведенном ниже, объединены все описанные выше действия для выполнения следующих операций в качестве администратора базы геоданных:
- Определение подключенных пользователей.
- Отправка уведомлений по электронной почте.
- Предотвращение принятия новых подключений к базе геоданных.
- Отключение пользователей.
- Согласование и фиксация изменений.
- Сжатие базы геоданных.
- Разрешение начать прием новых подключений к базе геоданных.
- Перестроение индексов и обновление статистики системных таблиц.
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 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.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.")
Автоматическое планирование выполнения скрипта
После завершения составления скрипта можно запланировать его запуск с установленными интервалами в определенное время с использованием системного средства планирования задач.