インストール済み拡張機能の表示
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 ファイル名と一致していません。
デバッグ手順:
-
VEB ファイル名がマニフェストと一致するか確認:
-
manifest.json の name フィールドを確認:
- VEB ファイル名:
my_extension.veb - manifest.json:
"name": "my_extension"
- マニフェストでハイフンを使用:
"name": "my-extension"❌ - VEB ファイル名が一致しない:
my-extension.vebvs"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 =
原因: 比較の片側がカスタム型の列で、もう片側がその型に自動的に変換できない値(リテラルまたは列)です。
拡張機能の使用状況の監視
クエリパフォーマンス
performance_schema を使用して VDF の実行時間を追跡します:カスタム型の使用状況
カスタム型を使用しているテーブルを追跡します:拡張機能の更新
インストール済みの拡張機能を別のバージョンに変更するには、ALTER EXTENSION を使用します。
これは既存のデータに対して新しいバージョンを検証し、次回サーバーが再起動したときに
変更を適用します。代替手段として、手動でのアンインストールと再インストールも
引き続き利用できます。
拡張機能のバージョン変更
ALTER EXTENSION はインストール済みの拡張機能を別のバージョンに変更し、
次回のサーバー再起動時に適用します:
<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-updates は mysqld の起動フラグです。設定すると、
サーバーは保留中の 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_VERSION が NULL になっています。4
フラグなしで再起動する
--villagesql-skip-extension-updates を省略して、サーバーを通常どおり再起動します。成功のサイン: サーバーが起動し、ログに
bypassing N pending extension update(s) 警告が表示されなくなります。手動更新プロセス
-
現在のバージョンをアンインストールします:
-
.veb ファイルを置き換えます:
-
新しいバージョンをインストールします:
-
更新を確認します:
クリーンアップ
孤立した展開ディレクトリの削除
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 は、出力に完全に修飾されたカスタム型名を保持します。論理リストアは、
ダンプをインポートする前にターゲットサーバーに拡張機能がインストールされていれば
機能します。
Docker での拡張機能の使用
Docker で VillageSQL を実行する際、veb_dir としてローカルディレクトリをマウントすると、コンテナを再構築せずにホストから .veb ファイルを追加できます。
Docker Compose の例:
./extensions/ に .veb ファイルをコピーし、SQL からインストールします:
サポート
ここでカバーされていない問題が発生した場合は:- エラーログを確認: ほとんどの拡張機能エラーは詳細とともにログに記録されます
- 拡張機能ドキュメントを確認: 拡張機能固有のトラブルシューティングが存在する場合があります
- Discord で質問: VillageSQL Discord に参加してください
- 問題を報告: GitHub Issues でバグを報告してください
次のステップ
システムリファレンス
システムテーブルとビューへのクエリ
拡張機能のアンインストール
拡張機能を安全に削除
拡張機能のアーキテクチャ
内部構造の理解

