Я пытаюсь настроить и протестировать протокол 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_port
set для соответствующего порта. Если она установлена, то 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