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
해당 포트에 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