OracleDB ストレージ
OracleDB ストレージ Provider は、Mastra アプリケーションの状態を Oracle Database に保存します。Mastra の複合ストレージインターフェースを実装しているため、1つの OracleStore インスタンスで、メモリ、Workflow スナップショット、Observability、スコア、Scorer 定義、MCP クライアントのメタデータ、Agent レジストリデータを管理できます。
インストールインストールへの直接リンク
- 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 で1つの Oracle プールを共有する場合に使用します。schemaName?:
poolMin?:
poolMax?:
poolIncrement?:
configDir?:
tnsnames.ora などの Oracle Network 設定ファイルを格納するディレクトリ。walletLocation?:
walletPassword?:
externalAuth?:
disableInit?:
messageBatchSize?:
executeMany 呼び出し1回あたりで送信するメッセージ数。処理のコミットは、引き続きトランザクション境界で1回だけ行われます。skipDefaultIndexes?:
indexes?:
migrationTableName?:
vectorRegistryTableName?:
OracleVector の registryTableName と同じ値を設定してください。接続例接続例への直接リンク
基本的なユーザー名とパスワードを使うコンストラクターは前述のとおりです。Autonomous Database の場合は、同じコンストラクターにウォレットオプションを追加します。
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 スナップショット、Observability、スコア、Scorer 定義、MCP クライアントのメタデータ、Agent レジストリデータを管理します。Mastra インスタンスの外部でストアを使用する場合は、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()
反復可能なマイグレーションは冪等です。起動時に各ストレージドメインが所有するテーブルとインデックスを調整するため、アプリケーションコードを変更せずに、新しいドメインインデックスや互換性のあるスキーマ追加を適用できます。
初期化では、一般的な Mastra のクエリ経路に対応する Provider のデフォルトインデックスも作成されます。インデックスを個別に管理する場合は skipDefaultIndexes を使用し、カスタム Oracle インデックスには indexes を渡します。カスタム定義は bitmap、online、invisible、parallel、compress、noLogging、reverse などの Oracle オプションに加え、JSON_VALUE(...) のような関数ベースの式にも対応しています。
カスタムインデックスは、アプリが JSON メタデータを繰り返しフィルタリングする場合や、データベース管理者(DBA)がオプティマイザーで使用する前にインデックスをテストする場合に便利です。
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 を使用し、クエリプランの検証後に削除します。skipDefaultIndexes: true は、DBA が管理するインデックス戦略でデフォルトを置き換える場合にのみ使用してください。
スキーマ変更を別のデプロイ手順またはデータベース管理者が適用する場合は、disableInit: true を使用します。
スキーマのエクスポートスキーマのエクスポートへの直接リンク
データベースに接続せずに Oracle DDL を生成するには、exportSchemas() を使用します。アプリケーション起動時以外にスキーマ変更をレビューまたは適用する場合に便利です。
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 で1つの 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 メタデータ、ペイロード、スナップショットは 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 }),
})