OracleDB 儲存
OracleDB 儲存 Provider 會將 Mastra 應用程式狀態儲存在 Oracle Database。它實作了 Mastra 的複合儲存介面,因此一個 OracleStore 實例便可支援記憶體、Workflow 快照、可觀測性、分數、Scorer 定義、MCP Client 元資料及 Agent Registry 資料。
安裝安裝 的直接連結
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/oracledb@latest
pnpm add @mastra/oracledb@latest
yarn add @mastra/oracledb@latest
bun add @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:
user?:
pool 或 externalAuth,否則必須提供。password?:
pool 或 externalAuth,否則必須提供。connectString?:
pool,否則必須提供。pool?:
store.close() 時不會將其關閉。poolManager?:
OracleStore 與 OracleVector 共用同一個 Oracle 連線池。schemaName?:
poolMin?:
poolMax?:
poolIncrement?:
configDir?:
tnsnames.ora)的目錄。walletLocation?:
walletPassword?:
externalAuth?:
disableInit?:
messageBatchSize?:
executeMany 呼叫傳送的訊息數目。操作仍只會在交易邊界提交一次。skipDefaultIndexes?:
indexes?:
migrationTableName?:
vectorRegistryTableName?:
OracleVector 的 registryTableName 選項,請將此值設為與其相同。連線範例連線範例 的直接連結
上方展示了基本的使用者名稱/密碼 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。自訂定義支援 bitmap、online、invisible、parallel、compress、noLogging 及 reverse 等 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。
操作注意事項操作注意事項 的直接連結
如果 OracleStore 與 OracleVector 應共用同一個 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.db 及 await storage.getPool() 以支援進階使用情境。直接使用這些 API 時,您須自行負責交易邊界及連線生命週期。
JSON 元資料、payload 及快照會儲存在原生 Oracle JSON 欄位中,並在伺服器端編碼,因此可直接使用 DBeaver 及 SQL Developer 等標準 Oracle JDBC 工具讀取資料列。
使用範例使用範例 的直接連結
為 Agent 加入 OracleDB 記憶體為 Agent 加入 OracleDB 記憶體 的直接連結
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 }),
})