有很多方法可以检索 mysql 发行版的版本,例如:
- 通过以下方式在服务器中运行 SQL 语句:
select version();
或者
show global variables like 'version';
mysqld --version
我的情况是预编译的二进制 MySQL 发行版/从源 MySQL 安装编译,因此从系统的包管理器获取版本是不可能的,此外出于稳定性和安全性的考虑,我没有使用上述方法的特权。
这可能看起来有点奇怪,但我想知道这些版本信息存储在哪里,我可以通过读取文件来提取它们吗?或者我需要以某种方式剖析二进制文件来获取信息?
进步:
我注意到%VERSION%
根据这个变量是一个系统变量关联,并存储在information_schema / performance_schema中,然后我查看了/ var / lib / mysql / performance_schema,但只有一个global_variable.frm
文件不包含任何数据,而我可以通过以下方式完美地获取版本信息
use performance_schema;
select * from global_variables where variable_name = 'version';
[1] performance_schema,根据这个关联还存储系统变量。
答案1
如果您有权访问日志文件,则可以读取 .err 文件。它包含如下一行:14:07:26 [Note] /usr/sbin/mysqld (mysqld 10.0.31-MariaDB) starting as process
。
此外,如果允许 telnet,您可以执行此操作telnet database_server 3306
,它也会显示版本。如果不允许 telnet,则 nmap 可以提供类似信息,但这同样取决于您的防火墙和网络设置。
# nmap -sV -p 3306 my-data-base-server
Starting Nmap 4.75 ( http://nmap.org ) at 2018-01-22 09:51 CET
Interesting ports on my-data-base-server (192.168.xxx.xxx):
PORT STATE SERVICE VERSION
3306/tcp open mysql MySQL 5.5.5-10.0.33-MariaDB
MAC Address: 5x:5x:00:Fx:8C:03 (QEMU Virtual NIC)
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.33 seconds
答案2
在 Linux 上,很多情况下安装的 mysql 版本是实际 Linux 发行版附带的版本。
然后您可以使用包查询工具来确定主要版本。
在基于 Debian 的系统上:
dpkg-query - l "mysql*"
在 Red Hat 和其他基于 rpm 的版本上:
rpm -qa | grep mysql
根据您是否需要自动化某些操作,可以通过进一步过滤和/或规范来增强功能。
答案3
这是一个相当复杂的问题。顺便说一句,这就是为什么作为系统管理员,我非常反对运行非发行版的服务器。至少在安装 mysql 服务器后,应该通过通常的系统机制启动和停止它:sysv init 脚本或类似脚本。
1) 服务器是否正在运行,使用什么(文件)名称?如果您没有处理故意模糊的问题,您可以尝试类似的东西, ps auxww | grep mysqld
它应该显示服务器二进制路径。不过,在某些二进制版本或源代码编译下,它可能包含“mysql-server”或其他不同的二进制名称!
获得服务器二进制文件后,您可以尝试确定它是哪个版本,方法是:
1)分析其路径:服务器通常位于目录内,该目录在路径的某处反映其版本号;
2)尝试在其路径中的某处找到其配置或其他可能包含版本信息的文件。
3)尝试使用或类似命令分析二进制文件readelf
并从其中的一些数据推断其版本。
但请注意没有任何上述所有方法都一定能成功。
如果应用范围太广(不同的发行版,不同的 mysql 版本等),可能会失败。
PS. 我可能记错了,但我原本以为mysql --version
会返回 mysql CLI 客户端的版本,不是服务器。