在 Oracle 上執行同盟查詢

此頁面說明如何設定 Lakehouse 同盟,對 Azure Databricks 未管理的 Oracle 數據執行同盟查詢。 欲了解更多湖屋聯盟資訊,請參閱 「連結外部資料庫與目錄」

若要使用 Lakehouse Federation 連接 Oracle 資料庫,您必須在 Azure Databricks Unity 目錄中建立以下中繼商店(2023 年 11 月 9 日之後建立的工作區已自動配置 Unity 目錄中繼倉庫):

  • 連線 至 Oracle 資料庫。
  • 外部目錄,鏡像 Unity 目錄中的 Oracle 資料庫,讓您可以使用 Unity 目錄查詢語法和數據控管工具來管理 Azure Databricks 使用者對資料庫的存取權。

開始之前

開始之前,請先確認您符合本節中的需求。

Databricks 需求

工作區需求:

  • 已為 Unity Catalog 啟用工作區。 2023 年 11 月 9 日之後建立的工作區將自動啟用 Unity Catalog,包括自動進行 metastore 配置。 除非你的工作區早於自動啟用且還沒啟用 Unity Catalog,否則你不需要手動建立元商店。 請參閱 開始使用 Unity 目錄。

計算需求:

  • 計算資源與目標資料庫系統之間的網路連線。 請參閱 Lakehouse Federation 的網路建議。
  • Azure Databricks 計算需要使用 Databricks Runtime 16.1 或更新版本,以及 Standard 或 Dedicated 訪問模式。
  • SQL 倉儲必須是專業或無伺服器,且必須使用 2024.50 或更新版本。

需要的權限:

  • 若要建立連線,您必須是中繼存放區系統管理員,或是具有附加至工作區之 Unity 目錄中繼存放區 CREATE CONNECTION 許可權的使用者。 在自動啟用 Unity 目錄的工作區中,工作區管理員預設擁有此 CREATE CONNECTION 權限。
  • 若要建立外來目錄,您必須具有中繼存放區的 CREATE CATALOG 許可權,並且必須是連線的擁有者或具有該連線的 CREATE FOREIGN CATALOG 特權。 在自動啟用 Unity 目錄的工作區中,工作區管理員預設擁有此 CREATE CATALOG 權限。

接下來每個任務為基礎的區段中會詳細說明額外的權限需求。

Oracle 需求

對於使用原生網路加密的連線,您必須啟用伺服器端 NNE (ACCEPTED 層級至少)。 請參閱 Oracle 檔中 設定網路數據加密。 這不適用於使用 TLS 的連線。

建立 Azure Databricks 連線

連接會指定用來存取外部資料庫系統的路徑和認證。 若要建立連線,您可以在 Azure Databricks 筆記本或 Databricks SQL 查詢編輯器中使用目錄總管或 CREATE CONNECTION SQL 命令。

Note

您也可以使用 Databricks REST API 或 Databricks CLI 來建立連線。 請參閱 POST /api/2.1/unity-catalog/connections 和 Unity Catalog 命令。

需要的許可權:中繼存放區系統管理員或擁有CREATE CONNECTION許可權的使用者。

目錄檢視器

  1. 在 Azure Databricks 工作區中,按兩下 [資料] 圖示。目錄。
  2. 點擊 插頭圖示。連接,然後點擊 連接。
  3. 點擊 「建立連線 」按鈕。
  4. 在 [連線基本概念 頁面] 上,於 [設定連線 精靈] 中輸入使用者易記的 [連線名稱]。
  5. 選取 連線類型 的 Oracle。
  6. (選擇性)新增批注。
  7. 按 [下一步]。
  8. 在 [驗證] 頁面上,針對 Oracle 實例輸入下列資訊:
    • 主機:例如,oracle-demo.123456.rds.amazonaws.com
    • 埠:例如,1521
    • 使用者:例如,oracle_user
    • 密碼:例如,password123
    • 加密通訊協定: Native Network Encryption (預設) 或 Transport Layer Security
    • 使用者提供伺服器憑證:選用。 你的 Oracle 實例的 PEM 編碼公開憑證,用於在 TLS 握手時驗證伺服器身份。 當你的伺服器提供來自私有或內部憑證授權中心且不在預設信任儲存庫的憑證時,提供它。 使用者提供的伺服器憑證需要 Transport Layer Security 的加密協定。 主機名稱驗證是作為 TLS 握手程序的一部分進行的。 若憑證上的主機名稱與請求的主機名稱不符,連線即告失敗。
    • 將時區視為區域:可選。 默認為啟用。 控制連線是否將其會話時區回報給 Oracle 為命名區域(啟用)或固定的 UTC 偏移量(停用)。 停用它只是為了繞過 timezone region not found 錯誤。 請參見 ORA-01882:找不到時區區域。
  9. 點選 「建立連線」。
  10. 在 目錄基礎 頁面上,輸入外文目錄的名稱。 外部目錄會鏡像外部數據系統中的資料庫,讓您可以使用 Azure Databricks 和 Unity 目錄來查詢和管理該資料庫中數據的存取權。
  11. (選擇性)按一下 [測試連線] 確認是否正常運作。
  12. 點選 「建立目錄」。
  13. 在 [Access] 頁面上,選取使用者可以存取您所建立目錄的工作區。 您可以選取 [所有工作區都有存取權],或點擊 [指派給工作區],選取工作區,然後點擊 [指派]。
  14. 更改 擁有者,使其能夠管理目錄中所有物件的存取權。 在文字框中開始輸入對象,然後在搜尋結果中點擊該對象。
  15. 對目錄授予許可權。 點擊 授權;
    1. 指定 主體 誰可以存取目錄中的物件。 在文字框中開始輸入對象,然後在搜尋結果中點擊該對象。
    2. 選取 權限預設,以授與每個主體。 根據預設,所有帳戶用戶都會被授與 BROWSE。
      • 從下拉功能表中選取 [數據讀取器],以授與目錄中物件 read 許可權。
      • 從下拉功能表中選取 [數據編輯器],以授與目錄中物件的 read 和 modify 許可權。
      • 手動選取要授與的許可權。
    3. 請按一下 授權。
  16. 按 [下一步]。
  17. 在 [元數據] 頁面上,指定標籤的鍵-值配對。 如需詳細資訊,請參閱在 Unity Catalog 中將標籤套用到可保護的物件。
  18. (選擇性)新增批注。
  19. 點選 [儲存]。

SQL

在筆記本或 Databricks SQL 查詢編輯器中執行下列命令:

CREATE CONNECTION <connection-name> TYPE oracle
OPTIONS (
  host '<hostname>',
  port '<port>',
  user '<user>',
  password '<password>',
  encryption_protocol '<protocol>', -- optional
  timezone_as_region '<true-or-false>' -- optional
);

timezone_as_region 控制連線是否將其工作階段時區以命名區域(例如 America/Los_Angeles(true,預設))或固定 UTC 偏移量(例如 -08:00(false))的形式報告給 Oracle。 僅為了繞過 timezone region not found 錯誤,請將其設為 false。 請參見 ORA-01882:時區區域未找到。

Databricks 建議您使用 Azure Databricks 秘密,而不是使用純文本字串來取得敏感性值,例如認證。 例如:

CREATE CONNECTION <connection-name> TYPE oracle
OPTIONS (
  host '<hostname>',
  port '<port>',
  user secret ('<secret-scope>','<secret-key-user>'),
  password secret ('<secret-scope>','<secret-key-password>'),
  encryption_protocol '<protocol>' -- optional
)

在 TLS 握手期間驗證伺服器身份(例如,當你的 Oracle 伺服器呈現來自私有或內部憑證授權中心的憑證,但該憑證不在預設信任儲存庫中時),請在選項 userProvidedServerCertificate 中傳遞伺服器的 PEM 編碼憑證。 使用者提供的伺服器憑證需要 encryption_protocol 設定為 TLS。

CREATE CONNECTION <connection-name> TYPE oracle
OPTIONS (
  host '<hostname>',
  port '<port>',
  user secret ('<secret-scope>','<secret-key-user>'),
  password secret ('<secret-scope>','<secret-key-password>'),
  encryption_protocol 'TLS',
  userProvidedServerCertificate '<pem-encoded-certificate>'
)

如果您必須在 Notebook SQL 命令中使用純文字字串,請透過逸出特殊字元以避免截斷字串,例如使用 $ 和 \。 例如:\$。

如需設定秘密的相關信息,請參閱 秘密管理。

建立外國目錄

Note

如果您使用 UI 來建立資料來源的連線,則會建立外部目錄,而且您可以跳過此步驟。

外部目錄會鏡像外部數據系統中的資料庫,讓您可以使用 Azure Databricks 和 Unity 目錄來查詢和管理該資料庫中數據的存取權。 若要建立外部目錄,您可以使用已定義的數據源連線。

若要建立外部目錄,您可以在 Azure Databricks 筆記本或 SQL 查詢編輯器中使用目錄總管或 CREATE FOREIGN CATALOG SQL 命令。 您也可以使用 Databricks REST API 或 Databricks CLI 來建立目錄。 請參閱 POST /api/2.1/unity-catalog/catalogs 和 Unity Catalog 命令。

必要權限:對中繼存放區的 CREATE CATALOG 權限,以及連線的所有權或對連線的 CREATE FOREIGN CATALOG 特權。

目錄檢視器

  1. 在 Azure Databricks 工作區中,點擊 [資料] 圖示 以開啟 目錄總管。

  2. 在 目錄 窗格頂端,點擊 新增或加號圖示新增 圖示,然後從功能表選擇 新增目錄。

    或者,從 [快速存取] 頁面,按一下 [目錄] 按鈕,然後按一下 [建立目錄] 按鈕。

  3. 請按照建立目錄中的指示來建立外部目錄。

SQL

在筆記本或 SQL 查詢編輯器中執行下列 SQL 命令。 方括號內的項目為可選。 替換占位符值:

  • <catalog-name>:Azure Databricks 中目錄的名稱。
  • <connection-name>:指定數據源、路徑和存取認證的 連接物件。
  • <service-name>:您想要在 Azure Databricks 中作為目錄鏡像的服務名稱。
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>
OPTIONS (service_name '<service-name>');

支援的下推策略

下表列出 Oracle 支援的推送操作,以及每個操作所需的運算量。

下壓 支持的計算
Aggregates 支援 所有運算
算術運算子
(例如 +、-、*、%、/)— 若停用 ANSI 則不支援
支援 所有運算
布林運算子
(例如 =、<=>、<、<=、>、>=)
支援 所有運算
包含、以...為起始、以...為結尾 支援 所有運算
Filters 支援 所有運算
Limit 支援 所有運算
數學函式
(ABS、FLOOR — 部分支援,僅限篩選運算式)
支援 所有運算
雜項功能
(例如 Alias、Cast、SortOrder — 部分支援,僅有過濾表達式)
支援 所有運算
Offset 支援 所有運算
Projections 支援 所有運算
排序,當與限制數量搭配使用時 支援 所有運算
字串函數
(UPPER、LOWER、CHAR_LENGTH、TRIM、RTRIM、LTRIM、CONCAT、RPAD、LPAD — 部分支援,僅限篩選運算式)
支援 所有運算
Joins 支援 Databricks 執行環境 17.2 及以上版本,以及 SQL 倉庫運算。 此下推功能目前為 公開預覽;請在 預覽 頁面上啟用 聯合式查詢的聯結下推 切換。
視窗函數 不支援 不支援

數據類型對應

當您從 Oracle 讀取至 Spark 時,資料類型會映射如下:

Oracle 類型 Spark 類型
TIMESTAMP WITH TIMEZONE、TIMESTAMP WITH LOCAL TIMEZONE TimestampType
DATE、TIMESTAMP TimestampType/TimestampNTZType*
NUMBER、FLOAT DecimalType**
BINARY FLOAT FloatType
BINARY DOUBLE DoubleType
CHAR、NCHAR、VARCHAR2、NVARCHAR2 StringType

* DATE 和 TIMESTAMP 若為 TimestampType(預設),則會映射到 Spark spark.sql.timestampType = TIMESTAMP_LTZ。 若 TimestampNTZType,則映射為 spark.sql.timestampType = TIMESTAMP_NTZ 。

** NUMBER 若未指定精度,則會映射為 DecimalType(38, 10) ,因為 Spark 不支援純浮點十進位。

Troubleshooting

ORA-01882:未找到時區區域

當你連接到 Oracle 11.2.0.3.0 及以後版本的執行個體且時區值不為 Etc/UTC時,連線可能會因錯誤 ORA-01882: timezone region not found而失敗。 當 Oracle 伺服器無法辨識連線在登入時所報告的指定時區區域時,就會發生這種情況。

為了解決此錯誤,Databricks 建議依序採取以下方法:

  1. 更新 Oracle 伺服器上的時區檔案,使其能辨識區域名稱。 這是首選且永久的解決方案。 請參閱 Oracle 支援 - ORA-01882。
  2. 如果你無法更新 Oracle 伺服器,請將 timezone_as_region 連線選項設為 false。 連線會回報固定的UTC偏移量,而非區域名稱,避免錯誤。 固定偏移不隨季節時間變化,因此 TIMESTAMP WITH LOCAL TIME ZONE 數值不會因夏令時間而調整。

License

Oracle 驅動程式和其他必要的 Oracle jar 是由無點擊連結 FDHUT 授權所控管。

其他資源