Как избежать ошибки блокировки эксклюзивной схемы с помощью ArcPy?

11

У меня есть скрипт для обновления некоторых функций в моей базе данных каждую ночь (только для копирования и замены некоторых функций). Эти функции доступны только для чтения. Моя проблема в том, что я не могу избежать того, что эти функции открыты пользователями, и мой скрипт может показать следующую ошибку:

ExecuteError: ERROR 000464: Cannot get exclusive schema lock. 
              Either being edited or in use by another application.

Можно ли с помощью какой-либо команды принудительно заставить скрипт phyton копировать файлы, даже открытые каким-либо пользователем? Могу ли я отключить все соединения в моей базе данных перед запуском скрипта?

avrechi
источник
1
Это похоже на ошибку arcpy / arcgisscripting. Пожалуйста, подтвердите, что вы используете, а также какую базу данных вы используете.
blah238

Ответы:

5

Я полагаю, что вы работаете с SDE.

Вы должны уничтожить все соединения, используя sdemonинструмент командной строки.

  1. Если на компьютере, где вы запускаете скрипт, установлен ArcSDE, вы можете выполнить его sdemon -o killлокально, чтобы уничтожить все соединения. Взгляните на эту справочную тему . Я не уверен, что это убивает прямые соединения на 10.0. Я помню, что это было своего рода проблемой на 9.3 и что это определенно убивает прямые подключения на 10.1.
  2. Если у вас не установлен ArcSDE и он работает только на отдельном сервере, вы можете выполнить эту команду удаленно из Python. В этой теме есть обсуждение .
Алекс Марков
источник
Да, я использую SDE (установлен на сервере). Но команда "sdemon -o kill" вернула синтаксическую ошибку.
Авречи
Команда sdemon должна быть выполнена в ArcSDE. Могу ли я поставить его на мой скрипт Python?
Авречи
1
Посмотрите на модуль подпроцесса . Также здесь есть хорошие вопросы: как вызвать внешнюю команду в Python и запустить команду оболочки из python и записать вывод .
Алекс Марков
2
Команда sdemon -o killне достаточно. Вам необходимо передать дополнительные параметры, взгляните на предоставленную ссылку .
Алекс Марков
2

Еще одна возможность , так как вы сказали , что вы используете SDE, чтобы удалить общие замки из layer_locksи table_locksтаблиц с помощью SQL, PL / SQL, T-SQL, и т.д. , например:

DELETE FROM TABLE_LOCKS WHERE SDE_ID = :b1 AND REGISTRATION_ID = :b2

Я определенно не рекомендовал бы такой подход в версионной базе геоданных. См. Также: Как реализованы различные механизмы блокировки в ArcSDE и базе геоданных?

blah238
источник
2

Если предпочтение , чтобы удалить определенные блокировки пользователя SDE, есть способ сделать это с помощью arcpy . Я предпочитаю такой подход, потому что он не требует, чтобы вы перепрыгивали на сервер базы данных для выполнения команды sde. Я могу отключить любые нежелательные блокировки, а затем выполнить обновления данных в один сценарий / процесс.

Пример из приведенной выше ссылки очень полезен:

import arcpy

admin_workspace = "Database Connections/tenone@sde.sde"
arcpy.env.workspace = admin_workspace
user_name = "GDB"

# Look through the users in the connected user list and get the SDE ID.
# Use the SDE ID to disconnect the user that matches the username variable
users = arcpy.ListUsers() # The environment is set, no workspace is needed.
for item in users:
    if item.Name == user_name:
        arcpy.DisconnectUser(admin_workspace, item.ID)
Дж Грэм
источник
Я запустил это и, казалось, работал, пока он не достиг моего текущего sessionID и не выдал ошибку. Есть ли способ перебрать пользователей и пропустить текущего пользователя (если item.Name == 'DBO' и item.ID! = <Идентификатор сеанса текущего пользователя>)? Я не могу найти способ найти идентификатор сеанса текущего пользователя.
м.Уолкер
0

Я не очень знаком с postgresql, но я думаю, что этот пост может привести вас в правильном направлении:

/programming/5108876/kill-a-postgresql-session-connection

nickves
источник