mysql-boost-8.0.31.tar.gz 源码下载
源码安装要求
cmake、Boost C++库、ncurses库、OpenSSL库 //需要cmake3,gcc-5.3以上
源码搭建 mysql 环境
编辑scl.repo文件
cpp
cd /etc/yum.repos.d
vi scl.repo
//scl.repo文件内容如下:
[scl]
name=CentOS-7 - SCLo sclo
baseurl=http://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
gpgcheck=0
enabled=1
使用 scl 软件集安装 gcc
cpp
yum install devtoolset-11-gcc devtoolset-11-gcc-c++
source /opt/rh/devtoolset-11/enable
gcc -v //查看gcc版本
yum install epel*
yum clean all
yum makecache
yum install cmake3 ncurses ncurses-devel bison openssl*
创建用户和组
1)在 /home 目录下创建一个新的普通用户
javascript
// 若待创建的用户名和组已存在,则删除,重新创建
sudo userdel mysql56
sudo groupdel mysql56
// 新的用户名为 mysql56
sudo adduser mysql56
// 输入上述命令后会提示为该用户设置密码
// 接下来会提示出入下列等,直接回车使用默认即可,然后输入 Y
Full Name []:
...
// 用户创建完成
2)进入 mysql56 用户并创建如下文件及文件夹
javascript
mkdir node3307
3)进入 node3307 创建如下文件夹
javascript
mkdir mysql data logs tmp
说明:clean.sh initial.sh start.sh stop.sh 为 mysql 初始化、启动、停止、清理缓存等脚本文件,可根据需要考虑是否创建,脚本文件内容如下:
- clean.sh 脚本内容如下:
javascript
#!/bin/bash
rm -rf ./data/*
rm -rf ./logs/*
rm -rf ./tmp/*
- initial.sh 脚本内容如下:
javascript
#!/bin/bash
./clean.sh
/home/mysql56/node6308/mysql/scripts/mysql_install_db --basedir=/home/mysql56/node6308/mysql --datadir=/home/mysql56/node6308/data
- stop.sh 脚本内容如下:
javascript
#!/bin/bash
ps -ef | grep mysqld | grep -v grep | awk '{print $2;}' | xargs -I {} kill -9 {}
- start.sh 脚本内容如下:
javascript
#!/bin/bash
/home/mysql56/node6307/mysql/bin/mysqld_safe --defaults-file=/home/mysql56/node6307/my6307.cnf &
注意:.sh 脚本文件在执行前需要赋予权限。
javascript
chmod +x start.sh
4)执行如下命令修改 data、logs、tmp 文件的用户名和组名
javascript
sudo chown -R mysql56:mysql56 -R /home/mysql56
说明:该命令会把 mysql80 下的所有文件及文件夹的用户名和组名修改为 mysql80。
5)修改 my80.cnf 文件权限
javascript
cd /home/mysql56/node3307
chmod 0644 my3307.cnf
重要的事情说三遍:
上述创建用户和组的流程非常重要!
上述创建用户和组的流程非常重要!
上述创建用户和组的流程非常重要!
解压 MySQL 源码
javascript
tar zxvf mysql-5.6.22.tar.gz
cd mysql-5.6.22
mkdir build3307
cd build3307
编译和安装
javascript
// MySQL 5.6、5.7 编译参数
cmake3 -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DCMAKE_INSTALL_PREFIX=/home/mysql56/node6309/mysql -DEXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 -DDOWNLOAD_BOOST=1 -DWITH_DEBUG=1 -DWITH_BOOST=/usr/local/all_boost -DWITH_INNOBASE_STORAGE_ENGINE=1 -DCMAKE_C_FLAGS="-Wno-unused-variable -Wno-unused-parameter -Wno-implicit-fallthrough -Wno-nonnull-compare -Wno-int-in-bool-context -Wno-bool-compare -Wno-aligned-new -Wno-logical-not-parentheses -Wno-parentheses -Wno-pointer-compare" -DCMAKE_CXX_FLAGS="-Wno-unused-variable -Wno-unused-parameter -Wno-implicit-fallthrough -Wno-nonnull-compare -Wno-int-in-bool-context -Wno-c++11-compat -Wno-bool-compare -Wno-aligned-new -Wno-logical-not-parentheses -Wno-parentheses -Wno-pointer-compare" -DWITH_EMBEDDED_SERVER:BOOL=OFF -DBUILD_TESTING:BOOL=OFF -DWITH_UNIT_TESTS:BOOL=OFF -DHYPERSCAN_ROOT=/data/hyperscan ..
// 编译和安装
make -j`nproc` // -j`nproc`自动获取当前可用的核数
make install
注1:5.6 不支持C++ 11及更高版本,所以在编译 MySQL 5.6 时,需将编译器配置改为: C++98 或 C++03 标准。即在CMakeLists.txt文件中增加一行:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98")。如果不添加,则会报如下错误:
注2:MySQL 5.6不支持C++ 11及更高版本原因分析:
- 宏定义与 C++ 关键字冲突:在 MySQL 5.6.22 的源代码中,univ.i 文件定义了一个宏 byte 为 unsigned char。然而,在 C++11 及其后续版本中,std::byte 是一个内置类型,用于表示原始字节。因此,当您的编译环境设置为 C++11 或更高版本时,这会导致冲突。
- 枚举类(enum class)与宏定义冲突:在 C++11 中引入了 enum class,它是一个强类型枚举。然而,由于您之前定义的 byte 宏,编译器在尝试解析 std::byte 类型的枚举时可能会遇到麻烦,因为它实际上试图将 byte 解释为宏展开,而不是 std::byte 类型。
扩展:
- MySQL 数据库中字符集与排序规则的默认配置:
1) MySQL8.0(utf8mb4, utf8mb4_0900_ai_ci)
2)MySQL5.6,MySQL5.7(latin1, latin1_swedish_ci)
- 在 MySQL5.6,MySQL5.7 中选择字符集为 utf8mb4 时,默认的排序规则是 utf8mb4_general_ci,而且可选择的排序规则中没有 utf8mb4_0900_ai_ci
配置 init-file 文件
javascript
# 下面所有的操作都不写入binlog
set session sql_log_bin = 0;
# 删除"s01"用户
delete from mysql.user where user="s01";
# 设置root用户密码
alter user 'root'@'%' identified by 'kingsoft.';
# 创建一个新的用户并设置密码
create user 's01'@'%' identified by 'kingsoft.';
# 把用户host权限改为'%',即允许'root'、's01'用户从任何主机连接
update mysql.user set host='%' where user='root';
update mysql.user set host='%' where user='s01';
# 上述对mysql.user表的更改操作记录在该表中,不会立即生效
# FLUSH PRIVILEGES命令的作用是告诉MySQL服务器重新加载mysql.user,从而使这些更改立即生效(即加载到缓存中)
# 如果不执行该操作,后面对'root'、's01'用户授权时,会出现找不到该用户问题
FLUSH PRIVILEGES;
# 对上述用户进行授权,允许'root'、's01'用户从任何主机连接
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
GRANT ALL PRIVILEGES ON *.* TO 's01'@'%';
# 允许root用户管理分布式事务的恢复。
GRANT XA_RECOVER_ADMIN ON *.* TO root@'%';
FLUSH PRIVILEGES;
注:该配置文件放在 mysql80 用户下面就可以!
配置 my3307.cnf 文件
javascript
[client]
user=mysql56
socket=/home/mysql56/node6307/tmp/mysql.sock
[mysqld]
user=mysql56
# init-file=/home/mysql56/init.file
core-file
skip-name-resolve = 1
default-storage-engine = InnoDB
basedir = /home/mysql56/node6307/mysql
datadir = /home/mysql56/node6307/data
tmpdir = /home/mysql56/node6307/tmp
plugin-dir = /home/mysql56/node6307/mysql/lib/plugin
pid-file = /home/mysql56/node6307/tmp/mysql.pid
port = 6307
socket = /home/mysql56/node6307/tmp/mysql.sock
log-error=/home/mysql56/node6307/logs/mysqld.log
# mysql服务ID,保证整个集群环境中唯一,默认为1
server-id=666
# 是否只读,1代表只读,0代表读写
read-only=0
# 开启gtid
log-bin = /home/mysql56/node6307/logs/mysql-bin # MySQL 5.6弃用Gtid时需添加(8.0无需添加)
log-slave-updates = 1 # MySQL 5.6弃用Gtid时需添加(8.0无需添加)
gtid-mode = ON
enforce-gtid-consistency = ON
# log-slave-updates=1
init-file=/home/mysql56/init.file
# 修改认证方式以适配proxysql
default_authentication_plugin=mysql_native_password
explicit_defaults_for_timestamp=1
注1:my3307.cnf文件中的/home/mysql80/node3307/mysql为mysql安装路径,根据自己情况进行更改;
注2:mysql3307.cnf放在对应实例下面,如:/home/mysql80/node3307;
初始化
javascript
// 文件赋权限
sudo chown -R mysql56:mysql56 /home/mysql56/node6309/data
sudo chmod -R 755 /home/mysql56/node6309/data
cd /home/mysql56/node6307
./initial.sh
连接 MySQL
javascript
# 执行下述命令并使用初始密码进入 mysql
/home/mysql80/node3307/mysql/bin/mysql -h127.0.0.1 -uroot -P3307
# 修改密码
SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('kingsoft.');
注:上述安装过程为无密码安装,因此连接时,无需输入密码。
至此,CentOS 7 系统下,源码搭建 MySQL 8.0.31 完成!
附录
- GCC 6.1及之前版本:从GCC 6.1开始,默认使用的C++标准是C++14。这意味着在GCC 6.1及之前的版本中,如果不特别指定,GCC会默认使用C++14的规范进行编译。
- GCC 9及以后版本:从GCC 9开始,GCC已经支持C++17,但此时默认标准仍然是C++14。不过,GCC 9及之后的版本已经对C++17提供了完整的支持。
- GCC 11:GCC 11将默认前端语言更改为C++17,意味着从GCC 11开始,如果不特别指定,GCC会默认使用C++17的规范进行编译。这一变化反映了GCC对C++17的成熟支持和广泛采用。
- 其他版本:
- 对于GCC 7和GCC 8,默认标准仍然是C++14,但它们同样支持C++17的编译(虽然不是默认)。
- 对于GCC 4.x系列,默认标准通常是C++11或更早。