共用方式為


適用於 PostgreSQL 的 Azure 資料庫 中的 Azure 儲存體 擴充功能 - 彈性伺服器

適用範圍:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器

Microsoft客戶的常見使用案例是能夠在 Azure Blob 儲存體 與 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例之間匯入和導出數據。 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中的 Azure 儲存體 擴充功能azure_storage可簡化此使用案例。

Azure Blob 儲存體

Azure Blob 儲存體是適用於雲端的物件儲存體解決方案。 Blob 儲存體經過最佳化,已能妥善儲存大量的非結構化資料。 「非結構化資料」是指不符合特定資料模型或定義的資料,例如文字或二進位資料。

Blob 記憶體提供三種資源類型的階層:

  • 記憶體帳戶是一個系統管理實體,可保存 Blob、檔案、佇列、數據表或磁碟等項目的服務。

    當您在 Azure 中建立記憶體帳戶時,您會取得記憶體資源的唯一命名空間。 唯一的命名空間會形成URL的一部分。 記憶體帳戶名稱在 Azure 中的所有現有記憶體帳戶名稱中應該是唯一的。

  • 容器位於記憶體帳戶內。 容器就像儲存 Blob 的資料夾一樣。

    您可以定義安全策略,並將原則指派給容器。 這些原則會串聯至容器中的所有 Blob。

    記憶體帳戶可以包含無限數量的容器。 每個容器可以包含不限數量的 Blob,最多可達 500 TB 的記憶體帳戶大小上限。

    將 Blob 放入記憶體帳戶內的容器之後,您可以使用下列格式的 URL 來參考 Blob: protocol://<storage_account_name>/blob.core.windows.net/<container_name>/<blob_name>

  • Blob 是位於容器中的數據片段。

下圖顯示資源之間的關係。

顯示記憶體資源範例的圖表。

將數據儲存為 blob Azure Blob 儲存體 的主要優點

Azure Blob 儲存體 可以提供下列優點:

  • 這是可調整且符合成本效益的雲端記憶體解決方案。 您可以使用它來儲存任何大小的數據,並根據需求相應增加或減少。
  • 它提供一層安全性,以協助保護您的數據,例如待用加密和傳輸中。
  • 它會與其他 Azure 服務和合作夥伴應用程式通訊。 它是各種使用案例的多功能解決方案,例如備份和災害復原、封存和數據分析。
  • 這是一個符合成本效益的解決方案,無論組織是小型企業還是大型企業,都是在雲端中管理和儲存大量數據。 您只需支付所需的記憶體費用。

將數據從 Azure Blob 儲存體 匯入至 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器

若要從 Azure Blob 儲存體 載入數據,您必須允許列出azure_storage PostgreSQL 擴充功能。 接著,您可以使用 命令在資料庫中 CREATE EXTENSION 安裝擴充功能:

 CREATE EXTENSION azure_storage;

當您建立記憶體帳戶時,Azure 會為該帳戶產生兩個 512 位記憶體 帳戶存取密鑰 。 您可以使用這些金鑰,透過共用金鑰授權來授權存取記憶體帳戶中的數據。

您必須先使用 account_add 方法來對應記憶體帳戶,才能匯入數據。 提供您在建立帳戶時所定義的帳戶存取金鑰。 下列程式代碼範例會對應記憶體帳戶 mystorageaccount ,並使用字串 SECRET_ACCESS_KEY 作為存取金鑰參數:

SELECT azure_storage.account_add('mystorageaccount', 'SECRET_ACCESS_KEY');

對應記憶體之後,您可以列出記憶體帳戶內容,然後選擇要匯入的數據。 下列範例假設您已建立名為 的 mystorageaccount 記憶體帳戶,以及名為的 mytestblobBlob 容器:

SELECT path, bytes, pg_size_pretty(bytes), content_type
FROM azure_storage.blob_list('mystorageaccount','mytestblob'); 

您可以使用 方法的正 SQL WHERE 則子句或 prefix 參數來篩選這個語句的 blob_list 輸出。 列出容器內容需要帳戶和存取金鑰,或是已啟用匿名存取的容器。

最後,您可以使用 COPY 語句或 blob_get 函式,將數據從 Azure Blob 儲存體 匯入現有的 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器數據表。

使用 COPY 語句匯入數據

下列範例示範透過 COPY 命令,從位於相同 mystorageaccount Azure 記憶體帳戶中 Blob 容器mytestblob的 employee.csv 檔案匯入數據:

  1. 建立符合來源檔案架構的目標資料表:

    CREATE TABLE employees (
      EmployeeId int PRIMARY KEY,
      LastName VARCHAR ( 50 ) UNIQUE NOT NULL,
      FirstName VARCHAR ( 50 ) NOT NULL
    );
    
  2. COPY使用語句將數據複製到目標數據表。 指定第一個數據列是標頭。

    COPY employees
    FROM 'https://mystorageaccount.blob.core.windows.net/mytestblob/employee.csv'
    WITH (FORMAT 'csv', header);
    

使用 blob_get 函式匯入數據

blob_get 式會從 Blob 記憶體擷取檔案。 若要確定 blob_get 可以剖析數據,您可以傳遞具有對應至檔案中數據行之類型的值,或明確定義 子句中的數據 FROM 行。

您可以使用下列格式的 blob_get 函式:

azure_storage.blob_get(account_name, container_name, path)

下一個範例會使用 blob_get 函式,顯示相同來源與相同目標相同的動作:

INSERT INTO employees 
SELECT * FROM azure_storage.blob_get('mystorageaccount','mytestblob','employee.csv',options:= azure_storage.options_csv_get(header=>true)) AS res (
  CustomerId int,
  LastName varchar(50),
  FirstName varchar(50))

COPY命令與blob_get函式支援下列延伸名進行匯入:

檔案格式 描述
.csv PostgreSQL 所使用的逗號分隔值格式 COPY
.tsv Tab 分隔值,預設 PostgreSQL COPY 格式
binary 二進位 PostgreSQL COPY 格式
text 包含單一文字值的檔案(例如大型 JSON 或 XML)

將數據從 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器匯出至 Azure Blob 儲存體

若要將數據從 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器匯出至 Azure Blob 儲存體,您需要允許列出azure_storage延伸模組。 接著,您可以使用 命令在資料庫中CREATE EXTENSION安裝 azure_storage PostgreSQL 擴充功能:

CREATE EXTENSION azure_storage;

您建立儲存體帳戶時,Azure 會為該帳戶產生兩個 512 位元儲存體帳戶存取金鑰。 您可以使用這些金鑰,透過共用金鑰授權,或透過使用共用密鑰簽署的共用存取簽章 (SAS) 令牌,授權存取記憶體帳戶中的數據。

您必須先使用 account_add 方法來對應記憶體帳戶,才能匯入數據。 提供您在建立帳戶時所定義的帳戶存取金鑰。 下列程式代碼範例會對應記憶體帳戶 mystorageaccount ,並使用字串 SECRET_ACCESS_KEY 作為存取金鑰參數:

SELECT azure_storage.account_add('mystorageaccount', 'SECRET_ACCESS_KEY');

您可以使用 COPY 語句或 blob_put 函式,將數據從 適用於 PostgreSQL 的 Azure 資料庫 數據表匯出至 Azure Blob 儲存體。 下列範例示範透過 命令將數據從員工數據表導出至名為 employee2.csvCOPY 的新檔案。 檔案位於相同 mystorageaccount Azure 記憶體帳戶的 Blob 容器mytestblob中。

COPY employees 
TO 'https://mystorageaccount.blob.core.windows.net/mytestblob/employee2.csv'
WITH (FORMAT 'csv');

同樣地,您可以透過函 blob_put 式從員工數據表導出數據,這可讓您更有限地控制導出的數據。 下列範例只會匯出數據表和的兩個數據 EmployeeIdLastName行。 它會略過數據 FirstName 行。

SELECT azure_storage.blob_put('mystorageaccount', 'mytestblob', 'employee2.csv', res) FROM (SELECT EmployeeId,LastName FROM employees) res;

命令與函COPYblob_put式支援下列延伸名進行匯出:

檔案格式 描述
.csv PostgreSQL 所使用的逗號分隔值格式 COPY
.tsv Tab 分隔值,預設 PostgreSQL COPY 格式
binary 二進位 PostgreSQL COPY 格式
text 包含單一文字值的檔案(例如大型 JSON 或 XML)

列出 Azure 儲存體 中的物件

若要列出 Azure Blob 儲存體 中的物件,您必須允許列出azure_storage延伸模組。 接著,您可以使用 命令在資料庫中CREATE EXTENSION安裝 azure_storage PostgreSQL 擴充功能:

CREATE EXTENSION azure_storage;

您建立儲存體帳戶時,Azure 會為該帳戶產生兩個 512 位元儲存體帳戶存取金鑰。 您可以使用這些金鑰,透過共用金鑰授權,或透過使用共用密鑰簽署的 SAS 令牌,來授權存取記憶體帳戶中的數據。

您必須先使用 account_add 方法來對應記憶體帳戶,才能匯入數據。 提供您在建立帳戶時所定義的帳戶存取金鑰。 下列程式代碼範例會對應記憶體帳戶 mystorageaccount ,並使用字串 SECRET_ACCESS_KEY 作為存取金鑰參數:

SELECT azure_storage.account_add('mystorageaccount', 'SECRET_ACCESS_KEY');

Azure 儲存體 延伸模組會提供 blob_list 方法。 您可以使用此方法,以下欄格式列出 Blob 記憶體中的物件:

azure_storage.blob_list(account_name, container_name, prefix)

下列範例示範使用名為 mystorageaccount 的記憶體帳戶和名為 mytestbob的 Blob 容器中的 方法,在 Azure 儲存體 blob_list 中列出物件。 容器中的檔案具有字串 employee

SELECT path, size, last_modified, etag FROM azure_storage.blob_list('mystorageaccount','mytestblob','employee');

將許可權指派給非管理帳戶,以從 Azure 儲存體 存取數據

根據預設,只有azure_pg_admin系統管理角色可以新增帳戶密鑰,並在 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中存取記憶體帳戶。

您可以根據權限粒度,以兩種方式,將存取 Azure 儲存體 中資料的權限授與非管理 適用於 PostgreSQL 的 Azure 資料庫彈性伺服器使用者:

  • 指派 azure_storage_admin 給非系統管理使用者。 此角色會隨著安裝 Azure 儲存體 擴充功能而新增。 下列範例會將此角色授與名為 support的非管理使用者:

    -- Allow adding/list/removing storage accounts
    GRANT azure_storage_admin TO support;
    
  • 呼叫 account_user_add 函式。 下列範例會將許可權新增至 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中的角色support。 這是更有限的許可權,因為它只會讓使用者存取名為的 mystorageaccountAzure 記憶體帳戶。

    SELECT * FROM azure_storage.account_user_add('mystorageaccount', 'support');
    

適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的系統管理使用者可以取得函式輸出account_list中的記憶體帳戶和許可權清單。 此函式會顯示已定義存取金鑰的所有帳戶。

SELECT * FROM azure_storage.account_list();

當 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器管理員決定使用者不應該再有存取權時,系統管理員可以使用 account_user_remove 方法或功能來移除此存取權。 下列範例會從記憶體帳戶mystorageaccount的存取中移除角色support

SELECT * FROM azure_storage.account_user_remove('mystorageaccount', 'support');

下一步

  • 如果您沒有看到您想要使用的延伸模組,請告訴我們。 請在我們的意見反應論壇中投票表決現有的要求,或建立新的意見反應要求。