29
0这段时间为了办理mysql的2038年题目可真是操碎了心,原来利用的mysql属于低版本,只要体系时间调解凌驾2038年1月19日就会主动制止mysql服务,为了办理题目,只能利用不低于v8.0.28的高版本mysql(详见之前的文章《My ...
|
这段时间为了办理mysql的2038年题目可真是操碎了心,原来利用的mysql属于低版本,只要体系时间调解凌驾2038年1月19日就会主动制止mysql服务,为了办理题目,只能利用不低于v8.0.28的高版本mysql(详见之前的文章《MySQL彻底办理2038年题目》)。 一、 利用高版本mysql的逆境 要利用高版本mysql,参考官方源码包中的cmake/os/Linux.cmake阐明文件,只能利用高版本gcc举行编译,颠末下载多个差别高版本的mysql源码包,检察编译mysql所需的gcc版天职别如下: (1)v8.0.40版本mysql,必要gcc 7.1大概更高版本 # We require at least GCC 7.1 Clang 5 IF(NOT FORCE_UNSUPPORTED_COMPILER) IF(MY_COMPILER_IS_GNU) IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.1) MESSAGE(FATAL_ERROR "GCC 7.1 or newer is required") ENDIF() (2)v8.4.2版本mysql,必要gcc 10大概更高版本 # We require at least GCC 10 Clang 12 IF(NOT FORCE_UNSUPPORTED_COMPILER) IF(MY_COMPILER_IS_GNU) # gcc9 is known to fail IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10) MESSAGE(FATAL_ERROR "GCC 10 or newer is required") ENDIF() (3)v9.0.1版本mysql,必要gcc 10大概更高版本 # We require at least GCC 10 Clang 12 IF(NOT FORCE_UNSUPPORTED_COMPILER) IF(MY_COMPILER_IS_GNU) # gcc9 is known to fail IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10) MESSAGE(FATAL_ERROR "GCC 10 or newer is required") ENDIF() (4)v9.4.0版本mysql,必要gcc 11大概更高版本(不知道你留意到没有,阐明文件中的解释阐明和cmake代码对gcc的版本要求阐明还不同等,算是一个小BUG吧^_^) # We require at least GCC 10 Clang 14 IF(NOT FORCE_UNSUPPORTED_COMPILER) IF(MY_COMPILER_IS_GNU) # gcc10 is known to fail IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11) MESSAGE(FATAL_ERROR "GCC 11 or newer is required") ENDIF() 抛开通用情况,对于一些已经利用多年的自界说情况,由于一些缘故原由,升级高版本gcc意味着文件体系也要顺势升级,对应的libc库会举行更改,一定会带来整个体系从底层到上层的巨大变革,代价不可谓不高。 背面思量利用独立高版本gcc情况编译步伐,然后把编译好的步伐放到低版本gcc情况运行,但是由于两边libc库版本的不同等,高版本gcc对应体系的libc库版本也同样高于低版本gcc对应体系的libc库,以是又是此路不通。 二、低版本gcc编译高版本mysql 抛开自界说情况,固然mysql源码包中的说明显确了源码编译所需的gcc版本,但是抱着实践测试验证的想法,在通用情况利用v7.3版本的gcc举行了v8.0.40版本mysql的编译操纵,按照v8.0.40版本mysql源码包中的阐明,应该是可以或许编译通过。但是很惋惜,效果是相反的。编译失败了, 缘故原由是v8.0.40版本mysql自带了高版本的protobuf代码,代码中的部门语法在v7.3版本的gcc中编译失败。但是换成10版本的gcc后编译正常,mysql可以或许正常运行。将体系时间调解到大于2038年的时间,mysql服务依然正常运行。 基于前述过程利用v7.3和v10版本的gcc再次编译v8.4.2版本mysql,效果与v8.0.40版本mysql的编译效果同等,v7.3版本gcc编译失败的位置与之前千篇一律。按照这个效果来看,v8.4.2版本mysql源码包中的gcc编译版本阐明又是对的。 对于逼迫症的我来说,反正也到这个点了,趁便就利用v9.3.1版本gcc对v9.0.1和v9.4.0版本mysql举行了源码编译,效果又是大出料想,两个版本的mysql版本都编译乐成。而按照对应版本mysql源码包中的编译阐明文件,v9.0.1版本mysql编译必要v10大概更高版本gcc,v9.4.0版本mysql编译必要v11大概更高版本gcc,而当前gcc是v9.3.1版本,分别垮了1个大版本号和2个大版本号,真是奇了怪哉! 至此,总结前述4个版本mysql源码编译所需的现实gcc版本与阐明要求是否正确效果如下: (1)v8.0.40版本mysql,必要gcc 7.1大概更高版本(禁绝确,gcc 7.3编译失败,gcc 10编译乐成) (2)v8.4.2版本mysql,必要gcc 10大概更高版本(正确,gcc 7.编译失败,gcc 10编译乐成) (3)v9.0.1版本mysql,必要gcc 10大概更高版本(禁绝确,gcc 9.3.1编译乐成) (4)v9.4.0版本mysql,必要gcc 11大概更高版本(禁绝确,gcc 9.3.1编译乐成) 三、结语 mysql的源码编译存在现实环境与官方阐明不同等的地方,肯定就有在别的昨们不知道的地方,也存在雷同环境。闻一知十,昨们到场大概打仗的别的事项,是不是也存在雷同环境?以是说,学习学习,真的不能书籍上说什么就完全信赖,照旧必要联合实践。尽信书不如无书,大概也是想表达这个意思吧。儒家说学习就是博学、过堂、慎思、明辨、笃行,终极照旧要落到实践(即笃行)上,古人诚不欺我啊! 四、接洽 假如有任何疑问接待随时交换。学无止境,实事求是,天天进步一点点! |