Поделиться через


Удаление и восстановление большого двоичного объекта с помощью Python

В этой статье показано, как удалить большие двоичные объекты с помощью клиентской библиотеки служба хранилища Azure для Python и как восстановить обратимо удаленные большие двоичные объекты в течение периода хранения.

Сведения об удалении большого двоичного объекта с помощью асинхронных API см. в статье "Удаление большого двоичного объекта" асинхронно.

Необходимые компоненты

Настройка среды

Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для Python. Дополнительные сведения см. в статье "Начало работы с Хранилище BLOB-объектов Azure и Python".

Чтобы работать с примерами кода в этой статье, выполните следующие действия, чтобы настроить проект.

Установка пакетов

Установите следующие пакеты с помощью pip install:

pip install azure-storage-blob azure-identity

Добавление инструкций импорта

Добавьте следующие операторы import :

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

Авторизация

Механизм авторизации должен иметь необходимые разрешения для удаления большого двоичного объекта или восстановления обратимого удаленного большого двоичного объекта. Для авторизации с помощью идентификатора Microsoft Entra (рекомендуется), требуется встроенный участник данных хранилища BLOB-объектов хранилища ролей или более поздней версии. Дополнительные сведения см. в руководстве по авторизации для удаления BLOB-объектов (REST API) и отмены удаления BLOB-объектов (REST API).

Создание клиентского объекта

Чтобы подключить приложение к хранилищу BLOB-объектов, создайте экземпляр BLOBServiceClient. В следующем примере показано, как создать клиентский объект с помощью DefaultAzureCredential авторизации:

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()

# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=credential)

Можно также создавать клиентские объекты для определенных контейнеров или больших двоичных объектов напрямую или из BlobServiceClient объекта. Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.

Удаление большого двоичного объекта

Примечание.

Если обратимое удаление BLOB-объектов включено для учетной записи хранения, невозможно выполнить постоянное удаление с помощью методов клиентской библиотеки. Используя методы, приведенные в этой статье, обратимо удаленный большой двоичный объект, версия большого двоичного объекта или моментальный снимок остается доступным до истечения срока хранения, в то время как оно будет окончательно удалено. Дополнительные сведения о базовой операции REST API см. в статье "Удаление BLOB-объектов (REST API)".

Чтобы удалить большой двоичный объект, вызовите следующий метод:

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

def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob()

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

def delete_blob_snapshots(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.delete_blob(delete_snapshots="include")

Чтобы удалить только моментальные снимки, а не сам большой двоичный объект, можно передать параметр delete_snapshots="only".

Восстановление удаленного BLOB-объекта

Обратимое удаление защищает BLOB-объект и его версии, а также моментальные снимки и метаданные от случайного удаления или перезаписи, сохраняя удаленные данные в системе в течение заданного периода времени. В течение срока хранения BLOB-объект можно восстановить до его состояния на момент удаления. По истечении срока хранения BLOB-объект удаляется окончательно. Дополнительные сведения об обратимом удалении BLOB-объектов см. в статье Обратимое удаление BLOB-объектов.

Клиентские библиотеки службы хранилища Azure позволяют восстановить обратимо удаленный BLOB-объект или моментальный снимок.

Восстановление обратимого удаленного большого двоичного объекта зависит от того, включена ли у вашей учетной записи хранения управление версиями БОЛЬШИХ двоичных объектов. Дополнительные сведения об управлении версиями BLOB-объектов см. в статье Управление версиями BLOB-объектов. См. один из следующих разделов в зависимости от вашего сценария:

Восстановление обратимо удаленных объектов, если управление версиями отключено

Чтобы восстановить удаленные большие двоичные объекты при отключении управления версиями, вызовите следующий метод:

Этот метод восстанавливает содержимое и метаданные обратимого удаленного большого двоичного объекта и всех связанных обратимо удаленных моментальных снимков. Вызов этого метода для большого двоичного объекта, который не был удален, не имеет никакого эффекта.

def restore_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
    blob_client.undelete_blob()

Восстановление обратимо удаленных объектов при включении управления версиями

Если учетная запись хранения настроена для включения управления версиями BLOB-объектов, удаление большого двоичного объекта приводит к тому, что текущая версия большого двоичного объекта станет предыдущей. Чтобы восстановить обратимо удаленный BLOB-объект при включении управления версиями, скопируйте предыдущую версию в основной BLOB-объект. Можно использовать следующий метод:

Следующий пример кода получает последнюю версию удаленного большого двоичного объекта и восстанавливает последнюю версию, скопировав его в базовый большой двоичный объект:

def restore_blob_version(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
    container_client = blob_service_client.get_container_client(container=container_name)

    # Get a reference to the soft-deleted base blob and list all the blob versions
    blob_client = container_client.get_blob_client(blob=blob_name)
    blob_list = container_client.list_blobs(name_starts_with=blob_name, include=['deleted','versions'])
    blob_versions = []
    for blob in blob_list:
        blob_versions.append(blob.version_id)
    
    # Get the latest version of the soft-deleted blob
    blob_versions.sort(reverse=True)
    latest_version = blob_versions[0]

    # Build the blob URI and add the version ID as a query string
    versioned_blob_url = f"{blob_client.url}?versionId={latest_version}"

    # Restore the latest version by copying it to the base blob
    blob_client.start_copy_from_url(versioned_blob_url)

Удаление большого двоичного объекта асинхронно

Клиентская библиотека Хранилище BLOB-объектов Azure для Python поддерживает асинхронное удаление большого двоичного объекта. Дополнительные сведения о требованиях к настройке проекта см. в статье асинхронное программирование.

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

  1. Добавьте в файл следующие операторы импорта:

    import asyncio
    
    from azure.identity.aio import DefaultAzureCredential
    from azure.storage.blob.aio import BlobServiceClient
    
  2. Добавьте код для запуска программы с помощью asyncio.run. Эта функция запускает переданную корутину в main() нашем примере и управляет циклом asyncio событий. Корутины объявляются с синтаксисом async/await. В этом примере main() корутин сначала создает верхний уровень BlobServiceClient с помощью async with, а затем вызывает метод, который удаляет большой двоичный объект. Обратите внимание, что использовать только клиент верхнего уровня, так как другие клиенты, созданные из него, используют async withтот же пул подключений.

    async def main():
        sample = BlobSamples()
    
        # TODO: Replace <storage-account-name> with your actual storage account name
        account_url = "https://<storage-account-name>.blob.core.windows.net"
        credential = DefaultAzureCredential()
    
        async with BlobServiceClient(account_url, credential=credential) as blob_service_client:
            await sample.delete_blob(blob_service_client, "sample-container", "sample-blob.txt")
    
    if __name__ == '__main__':
        asyncio.run(main())
    
  3. Добавьте код для удаления большого двоичного объекта. Код совпадает с синхронным примером, за исключением того, что метод объявляется с async ключевым словом, а await ключевое слово используется при вызове delete_blob метода.

    async def delete_blob(self, blob_service_client: BlobServiceClient, container_name: str, blob_name: str):
        blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
        await blob_client.delete_blob()
    

С помощью этой базовой настройки вы можете реализовать другие примеры в этой статье в качестве корутин с помощью синтаксиса async/await.

Ресурсы

Дополнительные сведения о том, как удалить большие двоичные объекты и восстановить обратимо удаленные большие двоичные объекты с помощью клиентской библиотеки Хранилище BLOB-объектов Azure для Python, см. в следующих ресурсах.

Примеры кода

Операции REST API

Пакет SDK Azure для Python содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API с помощью знакомых парадигм Python. Методы клиентской библиотеки для удаления больших двоичных объектов и восстановления удаленных BLOB-объектов используют следующие операции REST API:

Ресурсы клиентской библиотеки

См. также

  • Эта статья является частью руководства разработчика хранилища BLOB-объектов для Python. Дополнительные сведения см. в полном списке статей руководства разработчика по созданию приложения Python.