Использование скриптов Python для пакетного согласования и закрепления версий

Администраторы баз геоданных ArcGIS могут использовать скрипты Python для автоматизации многих задач, которые обычно выполняются с использованием нескольких инструментов геообработки. В данном разделе описывается процесс, при помощи которого администраторы смогут запускать запланированное согласование версий в ночное время.

Многие администраторы хотят быть уверены в том, что во время согласования версий другие пользователи не подключены к базе данных. Функции ArcPy ListUsers и DisconnectUser могут обеспечить подключение к базе данных только администратора.

Поиск подключенных пользователей

Прежде чем отключать пользователей, необходимо выяснить, кто из них подключен к базе данных. Для этого используется функция ListUsers, пропускающая подключение администратора.

# get a list of connected users.
userList = arcpy.ListUsers("Database Connections/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, однако имеются и другие опции для отправки электронных писем с использованием нестандартных модулей.

ПримечаниеПримечание:

Более подробно о модуле smtplib см. в документации к Python по адресу

http://docs.python.org/.

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 AcceptingConnections. Доступ к этой функции возможен только с использованием скрипта Python.

После того как все пользователи получили уведомления, и выполнение скрипта было приостановлено на 15 минут, производится отключение пользователей.

#block new connections to the database.
arcpy.AcceptConnections('Database Connections/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('Database Connections/admin.sde', "ALL")
ПримечаниеПримечание:

В качестве альтернативы, если необходимо отключить только определенных пользователей, идентификатор, полученный при использовании функции ListUsers или диалогового окна с указанием всех подключенных пользователей, может быть представлен как строка или список строк Python для отключения соответствующих пользователей.

Пакетное согласование

Чтобы согласовать и закрепить все версии в многопользовательской базе геоданных, можно использовать инструмент Согласовать версии (Reconcile Versions). Этот инструмент предоставляет возможности для согласования всех версий в базе геоданных с целевой версией или просто версиями, которые закреплены по умолчанию. Этот инструмент является средством для выполнения эффективного сжатия, так как он обеспечивает одновременное согласование и закрепление нескольких версий в надлежащем порядке. В этом примере, инструмент запускается администратором базы геоданных. Подключение в качестве администратора дает возможность согласовать и закрепить все версии в базе геоданных, включая частные или защищенные версии других пользователей.

Более подробно об инструменте геообработки Согласовать версии (Reconcile Versions)

# 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')

Перестроение индексов и обновление статистики

По завершении сжатия рекомендуется перестроить индексы и обновить статистику. Эти шаги можно выполнить с использованием инструментов Перестроить индексы (Rebuild Indexes) и Анализ наборов данных (Analyze Datasets). Эти инструменты позволяют ввести список входных наборов данных и выполнить их функции для всех наборов данных одновременно. Кроме того, при помощи этих инструментов обновляется статистика, и перестраиваются индексы для соответствующих системных таблиц. Первый этап этого процесса — получение списка данных, которыми владеет пользователь. Обновление индексов и статистики может быть выполнено только владельцем данных или пользователями, которым были предоставлены определенные права для администрирования.

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

После того как определен список данных, которыми владеет пользователь, их можно обработать с использованием инструментов Перестроить индексы (Rebuild Indexes) и Анализ наборов данных (Analyze Datasets).

ПримечаниеПримечание:

Для упрощения, предполагается, что администратор (admin) также является владельцем данных. Если у вас имеется несколько владельцев данных, необходимо построить список данных для каждого владельца и передать в инструменты RebuildIndexes и AnalyzeDatasets.

ПримечаниеПримечание:

Токены подстановочных знаков используются для выбора наборов данных, принадлежащих пользователям, и являются ОС-специфичными. В примере, приведенном выше, ('*.' + userName + '.*') будет работать с SQL Server, PostgreSQL или DB2. Для Oracle можно использовать следующие знаки: (userName + '.*'). Для Informix можно использовать следующие знаки: ('*:' + userName + '.*')

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

workspace = "Database Connections/admin.sde"

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

arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")

Пример полного кода

В примере кода, приведенном ниже, объединены все описанные выше действия для выполнения следующих операций:

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 usernames 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

# 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.
dataList = arcpy.ListTables('*.' + userName + '.*') + arcpy.ListFeatureClasses('*.' + userName + '.*') + arcpy.ListRasters('*.' + userName + '.*')

# Next, for feature datasets get all of the featureclasses
# from the list 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 admin to the rebuild indexes and analyze datasets tools
# Note: to use the "SYSTEM" option the user must be an administrator.
arcpy.RebuildIndexes_management(workspace, "SYSTEM", dataList, "ALL")

arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")

Автоматическое планирование выполнения скрипта

После завершения составления скрипта можно запланировать его запуск с установленными интервалами в определенное время с использованием системного средства планирования задач.

Для получения информации о настройке запуска запланированных задач в Windows см. раздел Составление скрипта Python для запуска в определенное время.

12/10/2012