Skip to main content

インストール済み拡張機能の表示

INFORMATION_SCHEMA ビューを使用して、インストールされた拡張機能をクエリします:
出力:
使用方法:
  • インタラクティブセッションとスクリプトの両方で使用可能
  • MySQL ツールと互換性のある標準 SQL インターフェース

拡張機能関数の確認

インストール後に拡張機能関数が正常に動作することを確認します:

拡張機能ディレクトリ

VillageSQL が .veb ファイルを検索する場所を確認します:
利用可能な拡張機能の一覧表示:

veb_dir の設定

拡張機能ディレクトリの場所を変更するには、MySQL 設定ファイルに veb_dir を設定します: my.cnf / my.ini:
要件:
  • パスは絶対パスである必要があります(相対パス不可)
  • ディレクトリはサーバー起動前に存在している必要があります
  • MySQL ユーザーはディレクトリに対して読み取り権限を持っている必要があります
  • 設定できる veb_dir は 1 つのみです(複数のパスは設定不可)
  • 変更を有効にするにはサーバーの再起動が必要です
再起動後の確認:

トラブルシューティング

クイックリファレンス

拡張機能が見つからない

Error: Extension 'my_extension' not found デバッグ手順:

インストール後に関数が利用できない

Error: FUNCTION my_func does not exist デバッグ手順:

アップデート後に拡張機能が古い動作をする

症状: .veb ファイルを置き換えて再インストールした後、拡張機能がまだ 古いコードを実行しています。 原因: VillageSQL は初回読み込み時に .veb ファイルを {datadir}/.veb_expansion_cache/ に展開します。UNINSTALL EXTENSION を実行せずに新しい .veb をコピーした場合、サーバーはメモリに既に読み込まれている以前に展開された .so の使用を続けます。 解決策: 常に完全な UNINSTALL → 置き換え → INSTALL のサイクルに従ってください:
次に veb_dir 内の .veb ファイルを置き換えて再インストールします:
拡張機能がまだ古い動作をする場合は、再インストールする前に展開キャッシュをクリアします:

拡張機能をアンインストールできない

Error: Cannot uninstall extension: types in use 解決策:

ライブラリの読み込みエラー

Error: Cannot load library: undefined symbol 原因:
  • 必要なライブラリ依存関係の欠如
  • ABI 互換性の不一致
  • 間違った MySQL バージョン
デバッグ:

拡張機能名の検証エラー

Error: Failed to load VEF extension 'extension_name' with log message Extension name mismatch 原因: manifest.json 内の拡張機能名が VEB ファイル名と一致していません。 デバッグ手順:
  1. VEB ファイル名がマニフェストと一致するか確認:
  2. manifest.json の name フィールドを確認:
解決策: 両方の名前は一致している必要があり、アンダースコアを使用します(拡張機能の命名規則 を参照):
  • VEB ファイル名: my_extension.veb
  • manifest.json: "name": "my_extension"
一般的なミス:
  • マニフェストでハイフンを使用: "name": "my-extension"
  • VEB ファイル名が一致しない: my-extension.veb vs "name": "my_extension"
正しい例:

カスタム型の比較エラー

Error: Cannot compare types X and Y in = 原因: 比較の両側がカスタム型ですが、異なる型または拡張機能に属しています。
解決策: 比較の両側で同じカスタム型を使用していることを確認してください。型間で比較する必要がある場合は、適切な型変換関数を使用して明示的に変換してください。
Error: Unable to implicitly cast a non-custom type during compare with a custom type in = 原因: 比較の片側がカスタム型の列で、もう片側がその型に自動的に変換できない値(リテラルまたは列)です。
解決策: 文字列リテラルは、型の encode 関数を使用して自動的にカスタム型にキャストされます。他の型(整数、浮動小数点数)には、明示的な変換関数を使用してください:

拡張機能の使用状況の監視

クエリパフォーマンス

performance_schema を使用して VDF の実行時間を追跡します:

カスタム型の使用状況

カスタム型を使用しているテーブルを追跡します:

拡張機能の更新

インストール済みの拡張機能を別のバージョンに変更するには、ALTER EXTENSION を使用します。 これは既存のデータに対して新しいバージョンを検証し、次回サーバーが再起動したときに 変更を適用します。代替手段として、手動でのアンインストールと再インストールも 引き続き利用できます。

拡張機能のバージョン変更

ALTER EXTENSION はインストール済みの拡張機能を別のバージョンに変更し、 次回のサーバー再起動時に適用します:
VillageSQL は対象バージョンをディスク上で解決し、変更を受け入れる前に 互換性の事前チェックを実行します。対象の VEB は拡張機能ディレクトリに <name>-<version>.veb(ここでは update_test-1.2.0.veb)として存在している 必要があります。ファイルが存在しない場合は拒否されます:
事前チェックは、保存済みデータを破損させる既知の非互換性を探します。 たとえば、カスタム型の永続化長の変更などです:
受け入れられると、変更は次回の再起動時に適用されます。それまでの間、 INFORMATION_SCHEMA.EXTENSIONS は現在のバージョンと、変更予定の対象バージョンを 並べて報告します:
INFORMATION_SCHEMA.EXTENSIONS は予定された変更を 4 つの列で報告します: 予定された変更は一度に 1 つだけ追跡されます:
  • 予定された変更をキャンセルするには、現在のバージョンを再度要求します:
  • 何も予定されていないときに現在のバージョンを要求しても何も起こりません:
  • 変更が予定されている間は別の対象は拒否されます — まず既存のものを キャンセルしてください:
AT RESTART 句は、次回のサーバー起動時に変更を適用します。

再起動が成功した後

次回の再起動時に、保留中の変更が適用されます。EXTENSION_VERSION が対象バージョンになり、 PENDING_VERSION がクリアされます。上記で予定した変更 (update_test 1.0.0 → 保留中 1.2.0)の場合:
古いバージョンを参照する custom_columns およびストアドプロシージャのパラメータの 行は、同じ再起動中にすべて書き換えられるため、依存するテーブルとルーチンは 手動での移行なしに動作を継続します。
変更はライブ接続上ではなく再起動中に適用されます — 上記の値は 再起動後の状態です。

起動時の保留中バージョン変更からの回復

予定されたバージョン変更は、次回のサーバー起動時に適用されます。保留中の アクションを適用できない場合、サーバーは保留中の更新に関する判断内容をディスクに記録したまま、起動に失敗することがあります。キューに入れられた ALTER EXTENSION ... AT RESTART が起動をブロックしていて、それをクリアする前にサーバーを起動する必要がある場合は、 --villagesql-skip-extension-updates を使用してください。 --villagesql-skip-extension-updatesmysqld の起動フラグです。設定すると、 サーバーは保留中の ALTER EXTENSION ... AT RESTART アクションの処理を バイパスします。各拡張機能は現在インストールされているバージョンで読み込まれ、 その保留中のアクションはディスク上にそのまま残されます。このフラグ自体は何も 変更しません — その 1 回の起動に対して保留中のアクションの適用をスキップするだけです。 フラグが設定され、少なくとも 1 つの拡張機能に保留中のアクションがある場合、 サーバーは起動時に、バイパスされた数を示す単一の警告をログに記録します:
1

フラグ付きでサーバーを起動する

本番環境では、通常の mysqld コマンドラインオプションとして渡すか、 my.cnf[mysqld] の下に追加します:
開発ハーネスでは、-- を使って渡します:
成功のサイン: サーバーが起動し、エラーログに上記の bypassing N pending extension update(s) 警告が含まれます。
2

保留中のアクションを特定する

成功のサイン: 各行の PENDING_VERSION はクリアが必要な対象です。 PENDING_LAST_ERROR は適用に失敗した理由を示します。
3

各保留中アクションをクリアする

上記で返された各拡張機能について、現在のバージョンを要求してキューに 入れられた変更をキャンセルします(拡張機能のバージョン変更 で説明したキャンセルの仕組み):
成功のサイン: Cleared pending update for extension '<name>' (target matches current version '<current>') というノートが返され、 前のクエリを再実行すると PENDING_VERSIONNULL になっています。
4

フラグなしで再起動する

--villagesql-skip-extension-updates を省略して、サーバーを通常どおり再起動します。成功のサイン: サーバーが起動し、ログに bypassing N pending extension update(s) 警告が表示されなくなります。

手動更新プロセス

  1. 現在のバージョンをアンインストールします:
  2. .veb ファイルを置き換えます:
  3. 新しいバージョンをインストールします:
  4. 更新を確認します:
データの安全性: テーブルが拡張機能のカスタム型を使用している場合、アンインストールする前にそれらのテーブルをドロップまたは変更する必要があります。まずデータをバックアップしてください。
例:

クリーンアップ

孤立した展開ディレクトリの削除

VillageSQL は .veb ファイルを {datadir}/.veb_expansion_cache/{name}/{sha256}/ に展開します。古いバージョンは時間とともに蓄積されます。
サーバーの再起動により、孤立した展開ディレクトリは自動的にクリーンアップされます。

レプリケーション

カスタム型には ROW 形式のバイナリログが必要です。STATEMENT および MIXED モードは、 カスタム型のカラムを持つテーブルではサポートされていません。カスタム型カラムに対する INSERT、UPDATE、DELETE、および ALTER TABLE 操作は、すべて ROW 形式で正しく レプリケートされます。 INSTALL EXTENSION はレプリケートされません — 各サーバーは独自の拡張機能を管理します。 レプリケーションを開始する前に、ソースと同じバージョンを使用して、すべてのレプリカに 拡張機能をインストールしてください。サーバーは正確なバージョンの一致を強制します。 バージョンが不一致だとレプリケーションが停止します。 レプリカが認識しないカスタム型に遭遇した場合、レプリケーションは DDL ステートメントで 停止します — CREATE TABLE または ALTER TABLE の実行時、関連する DML が 適用される前に停止します。正しい拡張機能バージョンをインストールし、再開してください:
mysqldump は、出力に完全に修飾されたカスタム型名を保持します。論理リストアは、 ダンプをインポートする前にターゲットサーバーに拡張機能がインストールされていれば 機能します。
Clone プラグイン、XtraBackup、InnoDB Cluster / Group Replication での動作はまだテストされていません。本番環境で依存する前に、 リストアパスをテストしてください。

Docker での拡張機能の使用

Docker で VillageSQL を実行する際、veb_dir としてローカルディレクトリをマウントすると、コンテナを再構築せずにホストから .veb ファイルを追加できます。 Docker Compose の例:
ホストの ./extensions/.veb ファイルをコピーし、SQL からインストールします:
実行中のサーバーが使用しているディレクトリを確認するには:

サポート

ここでカバーされていない問題が発生した場合は:
  1. エラーログを確認: ほとんどの拡張機能エラーは詳細とともにログに記録されます
  2. 拡張機能ドキュメントを確認: 拡張機能固有のトラブルシューティングが存在する場合があります
  3. Discord で質問: VillageSQL Discord に参加してください
  4. 問題を報告: GitHub Issues でバグを報告してください

次のステップ

システムリファレンス

システムテーブルとビューへのクエリ

拡張機能のアンインストール

拡張機能を安全に削除

拡張機能のアーキテクチャ

内部構造の理解