Mysql/Mariadb 如何伪装版本?
版本号伪装
在mariadb官方文档中,是可以给出了伪装的方法的:
从MariaDB 10.2.1版本开始,可以在配置文件中增加version配置去伪装版本:
[mysqld]
version=unkonwn
重启后,使用telnet就看不出相关版本号了。
而在MYSQL8中,是不能这样操作的,因为这个是个常量:
但是,民间给出了解决方案,就是直接修改mysqld文件(假设版本号为8.0.27):
cp /usr/bin/mysqld /usr/bin/mysqld.bak
sed -i 's/8.0.27/fakevs/' /usr/bin/mysqld
上面的命令会将版本号8.0.27
修改为fakevs
经过测试,如果8.0.27
的长度不等于fakevs
的长度,那服务器就无法启动,所以修改二进制文件是很危险的。
其次,如果使用上述方式去修改版本号,MYSQL的主从同步很可能无法继续:
设定: A 为主, B为从
A修改了版本号为’fakevs’, 在从机中使用show slave status\G;
命令,会发现从机无法识别主机的版本信息:
... ...
Slave_IO_Running: No
Slave_SQL_Running: Yes
... ...
Last_IO_Error: Fatal error: Master reported unrecognized MySQL version
... ...
这就意味着,版本号不能随意修改,否则很可能会在你意想不到的地方报错,因为这个版本信息是MYSQL通信协议的一部分。(Mariadb相关的测试在下面)
最后一种就是自己修改源码了,这个就不讲了
Mariadb伪装测试
mariadb 版本号修改后主从测试,使用docker可以轻松进行测试。
- 以下为测试的docker-compose.yaml文件
version: '3.1'
services:
main:
image: mariadb:10.10.2
#restart: always
environment:
MARIADB_ROOT_PASSWORD: 123456
MARIADB_DATABASE: customs
MARIADB_USER: backup
MARIADB_PASSWORD: backup
volumes:
- ./init1:/docker-entrypoint-initdb.d
- ./my1.cnf:/etc/my.cnf
ports:
- 4306:3306
slave:
image: mariadb:10.10.2
environment:
MARIADB_ROOT_PASSWORD: 123456
MARIADB_DATABASE: customs
MARIADB_USER: backup
MARIADB_PASSWORD: backup
volumes:
- ./init2:/docker-entrypoint-initdb.d
- ./my2.cnf:/etc/my.cnf
ports:
- 4307:3306
- my.cnf文件(my1.cnf和my2.cnf)
[mysqld]
version=<修改的版本号>
log-bin=mysql-bin
binlog_format=mixed
server-id=1 # 主机写1,从机写2
#需要备份的数据库名
binlog-do-db=customs
auto-increment-increment=2
auto-increment-offset=1 # 主机写1,从机写2
slave-skip-errors=all
sync_binlog=1
可以通过这个配置文件的version
配置进行伪装版本号
- 版本号修改为
unkonwn
修改后并启用主从备份之后,数据库无法启动,报错信息为:
hotbackup-main-1 | 2022-12-15 3:42:54 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
hotbackup-main-1 | 2022-12-15 3:42:54 0 [Note] InnoDB: log sequence number 46590; transaction id 14
hotbackup-main-1 | 2022-12-15 3:42:54 0 [Note] Plugin 'FEEDBACK' is disabled.
hotbackup-main-1 | 2022-12-15 3:42:54 0 [ERROR] Could not use mysql-bin for logging (error 2). Turning logging off for the whole duration of the MariaDB server process. To turn it on again: fix the cause, shutdown the MariaDB server and restart it.
hotbackup-main-1 | 2022-12-15 3:42:54 0 [ERROR] Aborting
- 版本号修改为
20.10.2
(不存在的版本号)
主从配置步骤就略过了,结果为主从复制成功(Slave_IO_Running和Slave_SQL_Running都为yes):
MySQL []> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.20.1.53
Master_User: backup
Master_Port: 4307
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 517
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 730
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
... ...
#mysql(2)参考:
mariadb文档:https://mariadb.com/kb/en/server-system-variables/#version
mysql文档:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_version、https://dev.mysql.com/doc/refman/8.0/en/server-option-variable-reference.html
民间方案:MySQL修改版本号教程
评论