跳至主要內容

OracleDB 儲存

OracleDB 儲存 Provider 會將 Mastra 應用程式狀態儲存在 Oracle Database。它實作了 Mastra 的複合儲存介面,因此一個 OracleStore 實例便可支援記憶體、Workflow 快照、可觀測性、分數、Scorer 定義、MCP Client 元資料及 Agent Registry 資料。

安裝
安裝 的直接連結

npm install @mastra/oracledb@latest

用法
用法 的直接連結

import { OracleStore } from '@mastra/oracledb'

const storage = new OracleStore({
id: 'oracle-storage',
user: process.env.ORACLE_DATABASE_USER,
password: process.env.ORACLE_DATABASE_PASSWORD,
connectString: process.env.ORACLE_DATABASE_CONNECT_STRING,
})

在 Mastra 中使用:

import { Mastra } from '@mastra/core/mastra'

export const mastra = new Mastra({
storage,
})

參數
參數 的直接連結

id:

string
此儲存實例的唯一識別碼。

user?:

string
Oracle Database 使用者。除非使用 poolexternalAuth,否則必須提供。

password?:

string
Oracle Database 使用者的密碼。除非使用 poolexternalAuth,否則必須提供。

connectString?:

string
Oracle 連線字串、服務名稱、TNS 別名或 Autonomous Database 連線描述元。除非使用 pool,否則必須提供。

pool?:

oracledb.Pool
現有的 Oracle 連線池。提供後,Mastra 會使用該連線池,但呼叫 store.close() 時不會將其關閉。

poolManager?:

OraclePoolManager
共用的 Oracle 連線池管理器。用它讓 OracleStoreOracleVector 共用同一個 Oracle 連線池。

schemaName?:

string
用於限定儲存資料表的 Oracle schema 名稱。

poolMin?:

number
= 0
Oracle 連線池的最少連線數目。

poolMax?:

number
= 4
Oracle 連線池的最多連線數目。

poolIncrement?:

number
= 1
連線池擴充時新增的連線數目。

configDir?:

string
包含 Oracle Network 設定檔(例如 tnsnames.ora)的目錄。

walletLocation?:

string
用於 mTLS 連線(例如 Autonomous Database)的 Oracle wallet 目錄。

walletPassword?:

string
Oracle wallet 的密碼(如 wallet 設定需要)。

externalAuth?:

boolean
使用 Oracle 外部驗證,而非使用者名稱/密碼驗證。

disableInit?:

boolean
= false
設為 true 時會停用自動 schema 初始化。若 schema 變更會在應用程式啟動前另行套用,請使用此選項。

messageBatchSize?:

number
= 200
儲存訊息時,每次 Oracle executeMany 呼叫傳送的訊息數目。操作仍只會在交易邊界提交一次。

skipDefaultIndexes?:

boolean
設為 true 時,初始化期間不會建立預設儲存索引。

indexes?:

OracleCreateIndexOptions[]
初始化期間要建立的自訂 Oracle 索引定義。索引會路由至擁有目標資料表的儲存網域。

migrationTableName?:

string
= 'MASTRA_ORACLE_MIGRATIONS'
用於追蹤儲存 schema 遷移的 Oracle 資料表。

vectorRegistryTableName?:

string
刪除 Thread 或訊息時,用於找出語義回憶向量資料表的 OracleVector Registry 資料表。若自訂了 OracleVectorregistryTableName 選項,請將此值設為與其相同。

連線範例
連線範例 的直接連結

上方展示了基本的使用者名稱/密碼 constructor。使用 Autonomous Database 時,請在同一個 constructor 加入 wallet 選項:

const storage = new OracleStore({
id: 'oracle-storage',
user: process.env.ORACLE_DATABASE_USER,
password: process.env.ORACLE_DATABASE_PASSWORD,
connectString: process.env.ORACLE_DATABASE_CONNECT_STRING,
walletLocation: process.env.ORACLE_DATABASE_WALLET_DIR,
walletPassword: process.env.ORACLE_DATABASE_WALLET_PASSWORD,
configDir: process.env.ORACLE_DATABASE_CONFIG_DIR,
})

如要使用外部驗證,請設定 externalAuth: true 並省略 password。如要重用現有的 oracledb.Pool,請透過 pool 傳入。Mastra 會使用它,但不會將其關閉。

OracleStore 支援記憶體、Workflow 快照、可觀測性、分數、Scorer 定義、MCP Client 元資料及 Agent Registry 資料。在 Mastra 實例以外使用 Store 時,請呼叫 await storage.init(),並透過 await storage.getStore('memory') 存取網域。

初始化
初始化 的直接連結

OracleStore 傳給 Mastra 後,系統會在執行儲存操作前自動呼叫 init()。如果直接使用 OracleStore,請在讀取或寫入前呼叫 init()

await storage.init()
注意

如果停用或略過初始化,儲存操作會要求 Oracle 資料表及索引已經存在。

OracleStore.init() 會執行可重複的遷移,並在遷移記錄資料表中記錄結果。預設記錄資料表為 MASTRA_ORACLE_MIGRATIONS

await storage.migrate()
const history = await storage.listMigrations()

可重複的遷移具備冪等性。它們會在啟動時協調各儲存網域擁有的資料表與索引,讓新增的網域索引或相容的 schema 增補項目毋須變更應用程式碼即可套用。

初始化亦會為常見的 Mastra 查詢路徑建立 Provider 的預設索引。若索引由其他方式管理,請使用 skipDefaultIndexes;如要使用自訂 Oracle 索引,請傳入 indexes。自訂定義支援 bitmaponlineinvisibleparallelcompressnoLoggingreverse 等 Oracle 選項,以及 JSON_VALUE(...) 之類的函數式運算式。

如果應用程式經常按 JSON 元資料篩選,或資料庫管理員(DBA)希望在 optimizer 使用索引前先測試索引,自訂索引便十分有用:

const storage = new OracleStore({
id: 'oracle-storage',
user,
password,
connectString,
indexes: [
{
name: 'idx_messages_status',
table: 'mastra_messages',
columns: [
"JSON_VALUE(metadata, '$.status' RETURNING VARCHAR2(32) NULL ON ERROR)",
'thread_id',
],
online: true,
invisible: true,
},
],
})

請使用 invisible 作分階段推出,並在驗證查詢計劃後將其移除。只有在由 DBA 管理的索引策略取代預設索引時,才應使用 skipDefaultIndexes: true

如果 schema 變更由獨立的部署步驟或資料庫管理員套用,請使用 disableInit: true

匯出 schema
匯出 schema 的直接連結

使用 exportSchemas(),毋須連線至資料庫即可產生 Oracle DDL。當 schema 變更會在應用程式啟動流程以外審核或套用時,這項功能十分有用。

import { exportSchemas } from '@mastra/oracledb'

const ddl = exportSchemas({
schemaName: 'MASTRA_APP',
domains: [
'memory',
'workflows',
'observability',
'scores',
'scorerDefinitions',
'mcpClients',
'agents',
],
})

console.log(ddl)

省略 domains 時,預設會包括所有支援的網域,當中亦包括 vector

操作注意事項
操作注意事項 的直接連結

如果 OracleStoreOracleVector 應共用同一個 Oracle 連線生命週期,請使用相同的 OraclePoolManager

import { OracleStore, OracleVector } from '@mastra/oracledb'

const storage = new OracleStore({ id: 'oracle-storage', user, password, connectString })
const vector = new OracleVector({
id: 'oracle-vector',
poolManager: storage.getPoolManager(),
})

OracleStore 提供 storage.dbawait storage.getPool() 以支援進階使用情境。直接使用這些 API 時,您須自行負責交易邊界及連線生命週期。

JSON 元資料、payload 及快照會儲存在原生 Oracle JSON 欄位中,並在伺服器端編碼,因此可直接使用 DBeaver 及 SQL Developer 等標準 Oracle JDBC 工具讀取資料列。

使用範例
使用範例 的直接連結

為 Agent 加入 OracleDB 記憶體
為 Agent 加入 OracleDB 記憶體 的直接連結

src/mastra/agents/oracle-agent.ts
import { Agent } from '@mastra/core/agent'
import { Memory } from '@mastra/memory'
import { OracleStore } from '@mastra/oracledb'

const storage = new OracleStore({
id: 'oracle-storage',
user: process.env.ORACLE_DATABASE_USER,
password: process.env.ORACLE_DATABASE_PASSWORD,
connectString: process.env.ORACLE_DATABASE_CONNECT_STRING,
})

export const oracleAgent = new Agent({
id: 'oracle-agent',
name: 'Oracle Agent',
instructions: 'You are an assistant with persistent OracleDB-backed memory.',
model: 'openai/gpt-5.6-sol',
memory: new Memory({ storage }),
})