Использование скриптов Python для пакетного согласования и закрепления традиционных версий
Доступно с лицензией Standard или Advanced.
Администраторы баз геоданных 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 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]
Создание и отправка электронных писем
Используйте список адресов электронной почты для отправки из 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.da.ListVersions('C:\\Projects\\MyProject\\admin.sde')
# Run the ReconcileVersions tool.
arcpy.management.ReconcileVersions('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.management.Compress('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 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.management.RebuildIndexes(workspace, "NO_SYSTEM", dataList, "ALL")
arcpy.management.AnalyzeDatasets(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 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.management.ReconcileVersions(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.management.Compress(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.management.RebuildIndexes(adminConn, "SYSTEM")
Update statistics on the system tables.
print("Updating statistics on the system tables") arcpy.management.AnalyzeDatasets(adminConn, "SYSTEM") print("Finished.")
## Автоматическое планирование выполнения скрипта {#D21}
После написания скрипта можно запланировать его запуск с установленными интервалами в определенное время с использованием системного средства планирования задач.
## Связанные разделы {#related-topics}
- [Управление традиционными версиями](create-modify-and-delete-versions.md)
- [Процесс редактирования традиционной версии](the-version-editing-process.md)
- [Просмотр изменений традиционной версии](using-the-version-changes-command.md)
- [Согласование и закрепление изменений в традиционной версии](reconcile-and-post-edits-to-a-version.md)
- [Управление конфликтами традиционных версий](manage-traditional-version-conflicts.md)
- [Администрирование традиционной версии](recommended-version-administration-workflow.md)