编译mysql

博客讲述了在RedHat9.0系统下重新编译mysql 4.1.11以解决性能问题,并给出了编译时的配置命令,如指定安装路径、socket路径等。

今天上午在RedHat9.0下重新编译mysql 4.1.11,主要是为了解决一些性能的问题。

./configure /
 --prefix=/usr/local/mysql /
 --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock /
 --with-client-ldflags=-all-static /
 --with-mysqld-ldflags=-all-static

<think> 我们参考用户提供的引用资料以及之前的问题,针对交叉编译MySQL 8的方法和解决编译测试失败问题,整理以下系统性解决方案: ### 交叉编译MySQL 8的核心步骤 #### 1. **环境准备** - **主机系统**:Ubuntu 18.04/20.04 (64位) - **交叉编译器**:aarch64-linux-gnu-gcc/g++(ARM64平台) - **依赖库**:交叉编译Boost、OpenSSL、ncurses等(版本需匹配MySQL要求) #### 2. **依赖库交叉编译** **Boost库(以1.77.0为例)**: ```bash wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz tar -zxvf boost_1_77_0.tar.gz cd boost_1_77_0 ./bootstrap.sh # 修改project-config.jam,添加交叉编译配置 echo "using gcc : arm : aarch64-linux-gnu-g++ ;" > project-config.jam ./b2 toolset=gcc-arm --prefix=/opt/boost-arm install ``` **OpenSSL(以1.1.1为例)**: ```bash wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar -zxvf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./Configure linux-aarch64 --cross-compile-prefix=aarch64-linux-gnu- --prefix=/opt/openssl-arm make && make install ``` #### 3. **MySQL源码配置与编译** ```bash wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.16.tar.gz tar -zxvf mysql-8.0.16.tar.gz cd mysql-8.0.16 mkdir build && cd build ``` **关键CMake配置**(解决向量化编译错误): ```bash cmake .. \ -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \ -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \ -DCMAKE_INSTALL_PREFIX=/opt/mysql-arm \ -DWITH_BOOST=/opt/boost-arm \ -DOPENSSL_ROOT_DIR=/opt/openssl-arm \ # 禁用问题优化选项 -DCMAKE_C_FLAGS="-O2 -fno-tree-loop-vectorize" \ -DCMAKE_CXX_FLAGS="-O2 -fno-tree-loop-vectorize" \ # 其他必要参数 -DCURSES_LIBRARY=/opt/ncurses-arm/lib/libncurses.so \ -DCURSES_INCLUDE_PATH=/opt/ncurses-arm/include ``` > **注意**: > - 若编译仍失败,尝试升级MySQL版本至8.0.17+(修复了GCC 8的向量化问题) > - 通过`-DCMAKE_PREFIX_PATH`指定所有依赖库的安装路径(如:`-DCMAKE_PREFIX_PATH="/opt/boost-arm;/opt/openssl-arm"`) #### 4. **编译与安装** ```bash make -j$(nproc) make install DESTDIR=/path/to/target ``` ### 解决编译测试失败问题 若出现`HAVE_NOT_C_BUG_LOOP_VECTORIZE`测试失败,需强制禁用循环向量化: ```bash # 在CMake配置中显式添加以下标志 -DCMAKE_C_FLAGS="-fno-tree-loop-vectorize -fno-tree-loop-distribute-patterns" \ -DCMAKE_CXX_FLAGS="-fno-tree-loop-vectorize -fno-tree-loop-distribute-patterns" ``` ### 验证交叉编译结果 检查生成的二进制文件架构: ```bash file /opt/mysql-arm/bin/mysqld # 期望输出:ELF 64-bit LSB shared object, ARM aarch64 ``` ### 常见错误处理 - **错误**:`[ERROR] [MY-013236] The designated data directory ... is unusable` **解决**:确保目标设备的`/etc/passwd`中存在`mysql`用户,或启动时指定`--user=root`[^5]。 - **错误**:依赖库版本不匹配 **解决**:严格使用MySQL官方要求的依赖版本(如OpenSSL 1.1.1+、Boost 1.77.0+)。 > **技术原理**:交叉编译MySQL时,主机编译的工具链(如`comp_err`)需在本地运行,而目标库需用交叉编译器构建[^2][^3]。向量化优化错误源于ARM平台对齐问题,禁用后牺牲部分性能换取兼容性。 §§相关问题§§ 1. 如何为ARM32平台交叉编译MySQL 8? 2. 交叉编译后的MySQL如何部署到嵌入式设备? 3. 如何验证交叉编译MySQL功能完整性? 4. 交叉编译时如何处理动态链接库(.so)的路径问题? 5. MySQL 8对Boost库的最低版本要求是什么? </think> ### 交叉编译 MySQL 8 的详细步骤与问题解决方案 #### 一、交叉编译完整流程 1. **环境准备** ```bash # 安装交叉编译工具链 (ARM64示例) sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu # 创建工作目录 mkdir mysql-cross && cd mysql-cross ``` 2. **依赖库交叉编译** **Boost 库(MySQL 8 需要 1.77.0+)**: ```bash wget https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/boost_1_81_0.tar.gz tar -zxvf boost_1_81_0.tar.gz cd boost_1_81_0 ./bootstrap.sh echo "using gcc : arm : aarch64-linux-gnu-g++ ;" > project-config.jam ./b2 toolset=gcc-arm --prefix=/opt/boost-arm install ``` 3. **MySQL 源码配置** ```bash wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.16.tar.gz tar -zxvf mysql-8.0.16.tar.gz cd mysql-8.0.16 mkdir build && cd build # 关键配置(解决向量化错误) cmake .. \ -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \ -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \ -DCMAKE_INSTALL_PREFIX=/opt/mysql-arm \ -DWITH_BOOST=/opt/boost-arm \ -DCURSES_LIBRARY=$(aarch64-linux-gnu-gcc -print-file-name=libncurses.so) \ -DCURSES_INCLUDE_PATH=$(aarch64-linux-gnu-gcc -print-file-name=include) \ -DCMAKE_C_FLAGS="-O2 -fno-tree-loop-vectorize" \ # 禁用问题优化 -DCMAKE_CXX_FLAGS="-O2 -fno-tree-loop-vectorize" # 禁用问题优化 ``` 4. **编译与安装** ```bash make -j$(nproc) make install DESTDIR=/path/to/target ``` #### 二、编译测试失败解决方案 1. **问题根源** GCC 8.x 对循环向量化的实现在 ARM 平台存在缺陷[^1],导致 `HAVE_NOT_C_BUG_LOOP_VECTORIZE` 测试失败。 2. **强制禁用优化(首选方案)** 在 CMake 配置中添加: ```cmake -DCMAKE_C_FLAGS="-fno-tree-loop-vectorize -fno-tree-loop-distribute-patterns" -DCMAKE_CXX_FLAGS="-fno-tree-loop-vectorize -fno-tree-loop-distribute-patterns" ``` 3. **升级 MySQL 版本** MySQL 8.0.17+ 已修复该问题: ```bash wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.32.tar.gz ``` 4. **补丁修改(源码级修复)** 编辑 `cmake/configure.cmake`: ```cmake # 注释问题测试 #CHECK_C_SOURCE_RUNS(... HAVE_NOT_C_BUG_LOOP_VECTORIZE) set(HAVE_NOT_C_BUG_LOOP_VECTORIZE 1) # 强制通过 ``` #### 三、部署注意事项 1. **目标系统库依赖** 使用 `ldd` 检查依赖: ```bash aarch64-linux-gnu-ldd /opt/mysql-arm/bin/mysqld ``` 2. **数据目录初始化** 解决 `[ERROR] [MY-013236]` 错误: ```bash ./mysqld --initialize --user=mysql \ --basedir=/opt/mysql-arm \ --datadir=/var/lib/mysql ``` #### 四、验证交叉编译结果 ```bash # 检查二进制架构 file /opt/mysql-arm/bin/mysqld # 期望输出:ELF 64-bit LSB shared object, ARM aarch64 # 简单功能测试 ./mysql -V ``` > **技术原理**:该错误源于 GCC 8.3 对循环向量化的对齐处理缺陷。当结构体中包含非对齐数组时(如示例中的 `unsigned x[6]`),向量化优化会生成错误指令[^1]。MySQL 8.0.17 通过重构循环代码解决此问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值