MySQL X プロトコル (関連キーワード: MySQLX、X プラグイン、XDevAPI、Connector/Node.js) をセットアップしてテストしようとしていますが、期待どおりに実行されません。
私はMySQL 5.7サービスでWindows 7 64ビットを実行しています。次のコマンドを実行して、Xプロトコルが実行され、リッスンしていることを確認しました(インストール後)。MySQL シェル)。
mysqlsh.exe -u root -h localhost --classic --dba enableXProtocol
Creating a Classic Session to 'root@localhost'
Enter password: ************************
Your MySQL connection id is 14
Server version: 5.7.19-log MySQL Community Server (GPL)
No default schema selected; type \use <schema> to set one.
enableXProtocol: X Protocol plugin is already enabled and listening for connections on port 33060
mysqlsh.exe -u root --sqlc -e "show plugins"
Enter password: ************************
+----------------------------+----------+--------------------+---------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+---------+---------+
| binlog | ACTIVE | STORAGE ENGINE | null | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | null | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | null | GPL |
| CSV | ACTIVE | STORAGE ENGINE | null | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | null | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | null | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | null | GPL |
| INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | null | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | null | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | null | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | null | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | null | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | null | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | null | GPL |
| partition | ACTIVE | STORAGE ENGINE | null | GPL |
| ngram | ACTIVE | FTPARSER | null | GPL |
| mysqlx | ACTIVE | DAEMON | mysqlx | GPL |
+----------------------------+----------+--------------------+---------+---------+
ただし、次のコマンドは何も出力しません ( なしで手動で出力を確認しましたgrep
)。
E:\>netstat -a -b | grep 33060
これが、私がこれをStackOverflowではなくSuperUserに投稿した主な理由です。これはプログラミングエラーではないと思います。完全性のために、Node.jsからの接続をテストするために使用した小さなJavascriptを記載します。公式データベース接続例。
const mysqlx = require('@mysql/xdevapi');
async function main()
{
const session = await mysqlx.getSession({
host: 'localhost',
port: 33060,
dbUser: 'test',
dbPassword: 'test',
});
console.log(session);
}
main().catch(function (error) { console.log("error caught in main routine\n", error); });
出力は次のようになります。
$ node db.js
error caught in main routine
{ Error: All routers failed.
at Session._failover (E:\temporary\xdevapi\node_modules\@mysql\xdevapi\lib\DevAPI\Session.js:231:23)
at _properties.socketFactory.createSocket.then.then.then.then.catch.err (E:\temporary\xdevapi\node_modules\@mysql\xdevapi\lib\DevAPI\Session.js:271:27)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:169:7) errno: 4001 }
MySQL サーバーは、私のコンピューター上でサービスとして実行されています。データベースは正常に動作しています。MySQL は、プラグインがリッスンしていると認識しているのに、実際にはリッスンしていないのはなぜでしょうか。または、netstat
実行したコマンドがこのジョブに適していないのでしょうか。どうすればこの問題を解決できますか。
答え1
netstat
実際には正常に動作していました。
Mysqlx プラグインがリッスンするはずのポートでリッスンしていたかどうかを確認する方法は、MySQL ステータス変数を確認することです。
SHOW GLOBAL STATUS
によると公式 MySQL 5.7 リファレンスMysqlx_port
それぞれのポートに設定されたという名前の変数があるはずです。 に設定されている場合UNDEFINED
、バインディングは失敗しています。私の場合はそうでした。
簡単に言うと、データをエクスポートした後、名前に MySQL が含まれるものをすべてアンインストールして再インストールしました。その後、私はバニラサーバーは今や 33060 をリッスンしており、実際にそうなりました。
しかし、Data
フォルダを新しいサーバーのデータ ディレクトリ ( C:/ProgramData/MySQL Server 5.7/
) にコピーした後、再び動作しなくなりました。データベースを再度リセットし、SQL ダンプを使用してデータをインポートしました。問題は再び発生しました。
正常に動作させるには、古いデータベースを復元し、データベースのみ ( mysql
、、および をsys
除く) をエクスポートして、新しいデータベースにインポートする必要がありました。サーバー データベースに、Mysqlx が正常に動作しない原因となる設定またはデータがあるようです。performance_schema
information_schema
すべてのデータをエクスポートするためのヒント:
mysqldump -u root -p --routines --triggers --databases <database>... > dump.sql
ルーチンやトリガーもエクスポートされます。ユーザーも失われますが、インターネット上のスレッドでその方法を説明しているこのコマンドはパスワードの入力を求めます。
再インポートするにはこれを使用します:
mysql -u root -p < dump.sql