Плагин протокола MySQL X не прослушивается (все маршрутизаторы вышли из строя)

Плагин протокола MySQL X не прослушивается (все маршрутизаторы вышли из строя)

Я пытаюсь настроить и протестировать протокол MySQL X (родственные ключевые слова: MySQLX, X Plugin, XDevAPI, Connector/Node.js), но он почему-то работает не так, как ожидалось.

Я использую Windows 7 64 Bit с MySQL 5.7 service. Я убедился, что X Protocol запущен и слушает, выполнив следующие команды (после установки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

Это главная причина, по которой я публикую это на SuperUser, а не на StackOverflow. Я думаю, что это не ошибка программирования. Для полноты картины я включу небольшой Javascript, который я использовал для проверки соединения с Node.js, вдохновленныйофициальный пример подключения к базе данных.

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_portset для соответствующего порта. Если она установлена, то UNDEFINEDпривязка не удалась. Так было у меня.

Короче говоря, после экспорта данных я удалил все, в названии чего было слово MySQL, и установил все заново.После этого я убедился, чтованильТеперь сервер будет слушать 33060, и он это сделал.

Однако после копирования моей Dataпапки в каталог данных нового сервера ( C:/ProgramData/MySQL Server 5.7/) она снова перестала работать. Я снова сбросил базу данных и импортировал данные с помощью SQL-дамп. Проблема вернулась снова.

Мне нужно было восстановить мою старую базу данных, затем экспортировать только мои базы данных (без mysql, sys, performance_schemaи information_schema) и импортировать их в новую базу данных, чтобы она работала правильно. Похоже, что в базах данных сервера есть какие-то настройки или данные, которые мешают Mysqlx работать правильно.

Совет профессионала по экспорту всех данных: используйте

mysqldump -u root -p --routines --triggers --databases <database>... > dump.sql

Так что он также экспортирует процедуры и триггеры. Пользователи также будут потеряны, но естьтемы в интернете с объяснениями как это сделать. Команда запросит пароль.

Используйте это для повторного импорта:

mysql -u root -p < dump.sql

Связанный контент