MySQL wire protocol
MySQL/MariaDB — бинарный TCP-протокол (порт 3306). Отличается от PostgreSQL: sequence-numbered пакеты, capability flags, поддержка COM_QUERY (текст) и COM_STMT_* (prepared).
Формат пакета
| 3 byte payload length (LE) | 1 byte sequence id | payload |
# пакеты > 16 МБ разбиваются, sequence++
# max_allowed_packet limit
Handshake
S → C: HandshakeV10 { version:"8.0.35", auth_plugin:"caching_sha2_password",
server_capabilities:..., salt:... }
C → S: HandshakeResponse41 { user, auth_response, database, client_capabilities }
S → C: OK / ERR / AuthSwitchRequest
Команды (COM_*)
| Code | Команда | Что |
|---|---|---|
| 0x03 | COM_QUERY | простой SQL |
| 0x16 | COM_STMT_PREPARE | подготовить |
| 0x17 | COM_STMT_EXECUTE | выполнить |
| 0x19 | COM_STMT_CLOSE | закрыть |
| 0x0e | COM_PING | ping |
| 0x01 | COM_QUIT | отсоединиться |
Response types
- OK_Packet — начинается с 0x00, для INSERT/UPDATE/DELETE
- ERR_Packet — 0xFF + error_code + message
- EOF_Packet — 0xFE (deprecated, теперь OK с флагом EOF)
- ResultSet — SELECT: column_count, columns[], rows[], EOF
Text vs Binary protocol
- Text (COM_QUERY) — все значения как строки: "42", "2025-01-15"
- Binary (COM_STMT_EXECUTE) — типизированные, дешевле парсить
Аутентификация plugins
- mysql_native_password — legacy SHA1
- caching_sha2_password (default MySQL 8+) — SHA-256 + cache
- sha256_password
- auth_socket — Unix socket peer
caching_sha2_password nuance
Первый логин требует TLS или RSA public key exchange. Кеш на сервере — последующие быстрее. Часто причина "не могу подключиться" из старых клиентов.
Compression
MySQL protocol может использовать zlib. Флаг CLIENT_COMPRESS. Каждый пакет заворачивается в compressed-frame.
Replication protocol
Slave шлёт COM_BINLOG_DUMP или COM_BINLOG_DUMP_GTID → мастер стримит binlog events. Основа репликации.
MySQL X Protocol
Отдельный порт 33060, protobuf-based. Для MySQL Document Store / X DevAPI. Практически не используется.