Estou tentando configurar e testar o protocolo MySQL X (palavras-chave relacionadas: MySQLX, X Plugin, XDevAPI, Connector/Node.js) e de alguma forma ele não funciona conforme o esperado.
Estou executando o Windows 7 de 64 bits com um serviço MySQL 5.7. Eu me certifiquei de que o Protocolo X está rodando e escutando executando os seguintes comandos (depois de instalarConcha 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 |
+----------------------------+----------+--------------------+---------+---------+
No entanto, o comando a seguir não produz nada (também verifiquei a saída manualmente sem grep
):
E:\>netstat -a -b | grep 33060
Qual é a principal razão pela qual posto isso no SuperUser e não no StackOverflow. Acho que não é um erro de programação. Para completar, incluirei o pequeno Javascript que usei para testar minha conexão do Node.js inspirado emo exemplo oficial de conexão com o banco de dados.
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); });
A saída é a seguinte:
$ 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 }
O servidor MySQL está sendo executado como um serviço no meu computador. O banco de dados está funcionando bem. Alguma idéia de por que o MySQL pensa que o plugin está escutando, mas na verdade não está? Ou o netstat
comando que executo não é o correto para este trabalho? Como posso resolver este problema?
Responder1
netstat
estava realmente funcionando bem.
Uma maneira de verificar se o plugin Mysqlx estava escutando na porta que deveria escutar é verificar as variáveis de status do MySQL.
SHOW GLOBAL STATUS
De acordo coma referência oficial do MySQL 5.7deve haver uma variável chamada Mysqlx_port
definida para a respectiva porta. Se estiver definido como UNDEFINED
a ligação falhou. Este foi o meu caso.
Resumindo, desinstalei tudo que tinha MySQL em nome depois de exportar meus dados e reinstalei.Depois disso, certifiquei-me de quebaunilhao servidor ouviria 33060 agora e foi o que aconteceu.
Porém, após copiar minha Data
pasta para o diretório de dados do novo servidor ( C:/ProgramData/MySQL Server 5.7/
), ela parou de funcionar novamente. Reinicializei o banco de dados novamente e importei os dados usando um dump SQL. O problema voltou novamente.
Eu precisava restaurar meu banco de dados antigo, exportar apenas meus bancos de dados (sem mysql
, sys
e ) e importá performance_schema
- information_schema
los no novo banco de dados para que funcionasse corretamente. Parece que há alguma configuração ou dados nos bancos de dados do servidor que impedem o Mysqlx de funcionar corretamente.
Dica profissional para exportar todos os dados: use
mysqldump -u root -p --routines --triggers --databases <database>... > dump.sql
Portanto, ele também exportará rotinas e gatilhos. Os usuários também serão perdidos, mas hátópicos na internet com explicações de como fazer. O comando solicitará uma senha.
Use isto para reimportar:
mysql -u root -p < dump.sql