源码编译安装 Mysql 5.7

1,059 阅读5分钟

源码编译安装 Mysql 5.7

1. 概要

本文基于 centos7 操作系统,进行mysql 5.7.38版本的编译安装说明。

下载页面:

downloads.mysql.com/archives/co…

下载地址:

downloads.mysql.com/archives/ge…

编译安装需要依赖以下软件包,需要在编译前安装好:

ncurses-devel m4 bison cmake openssl-devel libtirpc-devel gcc-c++ cyrus-sasl-devel libevent-devel libbsd-devel glibc-devel

相关依赖包的作用

  • cmake: 由于从 MySQL5.5 版本开始弃用了常规的 configure 编译方法,所以需要 CMake 编译器,用于设置 mysql 的编译参数。如:安装目录、数据存放目录、字符编码、排序规则等。
  • Boost: 从 MySQL 5.7.5 开始 Boost 库是必需的,mysql 源码中用到了 C++的 Boost 库,要求必须安装 boost1.59.0 或以上版本
  • GCC: 是 Linux 下的 C 语言编译工具,mysql 源码编译完全由 C 和 C++编写,要求必须安装GCC
  • bison: 是一个自由的、可移植的、GNU 项目的语法分析器生成器,它可以将输入文本转换成一个程序,用于识别语法中的结构。它可以处理大多数编程语言,包括 C、C++、Java 和 Pascal。
  • ncurses-devel: 是一个开发库,用于在Linux系统上创建和管理图形用户界面(GUI)。它提供了一系列的函数和库,可以让开发者创建出具有文本框、按钮、菜单栏、对话框等功能的GUI应用程序。
  • OpenSSL: 是一个开源的安全套接字层密码库,它实现了SSL和TLS协议,并提供了一组用于数据加密、身份验证和数字签名的加密工具。OpenSSL也可以用来创建证书、证书签名请求(CSR)、自签名证书以及其他相关文件。
  • libtirpc-devel: 是一个开源的RPC库,它是一个实现了Sun RPC协议的C语言库,用于在Linux和其他Unix系统之间进行远程过程调用。它可以用来创建客户端/服务器应用程序,允许不同的机器之间通过RPC协议进行通信。libtirpc-devel包含头文件、静态库和动态库,可以帮助开发者快速构建RPC应用程序。

以上软件包可以直接使用yum install命令安装

2. 确认系统环境

确认操作系统版本

[root@localhost mysql-5.7.38]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@localhost mysql-5.7.38]# uname -a
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

3. 创建用户、组与目录

创建用于运行mysql的系统用户、组、与程序目录、数据目录。

[root@localhost ~]# groupadd -r mysql && useradd -r -g mysql -s /bin/false -M mysql   
[root@localhost ~]# mkdir -p /usr/local/mysql /var/lib/docker/mysql

4. 预编译

将下载好的mysql源码包解压缩,并进入其中

tar zxf mysql-boost-5.7.38.tar.gz
cd mysql-5.7.38

运行cmake命令预编译

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/var/lib/docker/mysql  \
-DWITH_BOOST=./boost/boost_1_59_0 \
-DSYSCONFDIR=/etc  \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DWITH_SYSTEMD=1 \
-DDEFAULT_COLLATION=utf8mb4_general_ci

参数说明

  • CMAKE_INSTALL_PREFIX: 设置程序的主目录
  • MYSQL_DATADIR: 设置默认mysql数据目录
  • WITH_BOOST: 指定boost库的位置
  • SYSCONFDIR: 设置配置文件的位置
  • WITH_INNOBASE_STORAGE_ENGINE: 如果使用这个选项并将其设置为 ON,则在编译 MySQL 时将包含 InnoDB 存储引擎。
  • WITH_PARTITION_STORAGE_ENGINE: 如果使用这个选项并将其设置为 ON,则在编译 MySQL 时将包含分区存储引擎。
  • WITH_FEDERATED_STORAGE_ENGINE: 如果使用这个选项并将其设置为 ON,则在编译 MySQL 时将包含联合存储引擎。
  • WITH_BLACKHOLE_STORAGE_ENGINE: 如果使用这个选项并将其设置为 ON,则在编译 MySQL 时将包含黑洞存储引擎。
  • WITH_MYISAM_STORAGE_ENGINE: 如果使用这个选项并将其设置为 ON,则在编译 MySQL 时将包含MyISAM存储引擎。
  • MYSQL_TCP_PORT: 设置mysqld默认监听端口。
  • EXTRA_CHARSETS: 用于编译 MySQL 时指定要包含的额外字符集。
  • DEFAULT_CHARSET: 用于指定默认字符集,也就是用于存储和处理文本数据的编码方式。如果没有为表或列指定字符集,则默认使用数据库的字符集。
  • DEFAULT_COLLATION: 用于指定默认排序规则,也就是用于比较和排序文本数据的方式。排序规则通常是基于字符集定义的,因为不同字符集的排序规则是不同的。如果没有为表或列指定排序规则,则默认使用数据库的排序规则。
  • WITH_SYSTEMD: 使用systemd管理进程启停。

运行cmake命令后需要注意是否出现报错,或出现包找不到的信息。如果出现报错则需要解决报错后才能继续操作。

5. 编译安装

编译安装

# make命令后可根据实际环境开启多线程,使用 -j 参数,能减少编译消耗的时间。
make
make install

确认返回结果没有报错后继续操作。

6. 设置权限并初始化 MySQL 系统授权表

给mysql的目录赋予mysql用户权限

[root@ks-worker03 mysql]#  chown -R mysql:mysql /var/lib/docker/mysql /usr/local/mysql

MySQL 5.7.6之前的版本执行这个脚本初始化系统数据库

./bin/mysql_install_db --user=mysql --basedir= /usr/local/mysql --datadir=/var/lib/docker/mysql

MySQL 5.7.6之后版本初始系统数据库脚本

[root@ks-worker03 mysql]# cd /usr/local/mysql 
[root@ks-worker03 mysql]# ./bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/docker/mysql
​
#参数 --initialize 生成一个随机密码(~/.mysql_secret)
#参数 --initialize-insecure 不会生成密码,创建空密码账户

7. 创建配置文件

cat > /etc/my.cnf << EOF
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#************** connection ***************
max_connections                 =2000
max_connect_errors              =100
max_user_connections            =0
#************** sql timeout & limits ***************
# 服务器在关闭交互式连接之前等待活动的秒数。
interactive_timeout             =28800
# 服务器关闭连接之前等待非交互式连接活动的秒数。
wait_timeout                    =28800
max_execution_time              =0
# 函数GROUP_CONCAT()结果的最大长度。
group_concat_max_len            =1024
# 试图获得元数据锁的超时时间(秒)。
lock_wait_timeout               =31536000
# 0: 表名大小写敏感,1: 表名大小写不敏感
lower_case_table_names          =1
# 要缓存的线程数,修改该参数值不会优化线程实施性能。
thread_cache_size               =100
disabled_storage_engines        ="myisam,memory,archive"
# 服务器字符集。
character_set_server            =utf8mb4
skip_name_resolve               =ON
explicit_defaults_for_timestamp =OFF
log_timestamps                  =SYSTEM
local_infile                    =ON
event_scheduler                 =ON
query_cache_type                =OFF
query_cache_size                =0
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#******************* err & slow & general ***************
slow_query_log = ON
slow_query_log_file = /var/lib/docker/mysql/mysql_slow_query.log
long_query_time                 =3
log_queries_not_using_indexes   =OFF
log_throttle_queries_not_using_indexes = 0
#************** innodb ***************
server_id = 104
# 默认存储引擎
default_storage_engine = InnoDB
# 设置为 RAM 大小的 50%-70%,不需要大于数据库的大小
innodb_buffer_pool_size = 8G
# 一般是CPU的个数,总的缓存也除以这个值就是每个缓存池的大小。(默认是1)
innodb_buffer_pool_instances= 8
# 128M ? 2G (不需要大于 buffer pool)
innodb_log_file_size = 256M
# 1(默认值),0/2 (性能更好,但稳定性更差)
innodb_flush_log_at_trx_commit = 1
# O_DIRECT (避免双缓冲技术)
innodb_flush_method = O_DIRECT
#************** binlog & relaylog ***************
log_bin = mysql-bin
binlog_format = ROW
# 默认是关闭,开启GTID事物全局id。一般用于主从复制
gtid_mode = on
enforce_gtid_consistency = on# 记录IO线程读取已经读取到的master binlog位置,用于slave宕机后IO线程根据文件中的POS点重新拉取binlog日志
master_info_repository = TABLE
relay_log_info_repository = TABLE
​
# 事物提交立即刷新到binlog文件
sync_binlog = 1relay_log = relay-bin
relay_log_index = relay-bin
# 默认值是OFF,IO线程高可用,建议值是ON。(用于从库)
relay_log_recovery = ON
# 默认值是FILE,sql线程高可用,建议值是TABLE。(用于从库)
relay_log_info_repository = TABLE
# 默认是基于数据库并行复制,建议值是logical_clock基于事物组并行复制。
slave_parallel_type = LOGICAL_CLOCK
# 设定从服务器的复制线程数;0表示关闭多线程复制功能
slave_parallel_workers = 8# 半同步复制,需要在安装半同步插件后取消注释,否则会启动失败
#rpl_semi_sync_master_enabled = 1
#rpl_semi_sync_slave_enabled = 1
#rpl_semi_sync_master_timeout = 3000expire_logs_days = 7# 关闭弱密码校验,需要安装密码验证插件后再取消注释,否则会启动失败
#validate_password = offdatadir=/var/lib/docker/mysql
socket=/var/lib/mysql/mysql.sock
​
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0log_error=/var/log/mysqld.log
pid_file=/var/run/mysqld/mysqld.pid
​
# 缓存的打开表的个数。
table_open_cache = 2000
# 打开的表缓存实例数。
table_definition_cache = 1400
# 主要用来收集MySQL性能参数,默认开启。启用后,server会持续不间断地监测。消耗大量内存
performance_schema = off
# 包或任何生成的中间字符串的最大值。包缓冲区初始化为net_buffer_length字节,但需要时可以增长到max_allowed_packet字节。该值默认很小,以捕获大的(可能是错误的)数据包。该值必须设置为1024的倍数
max_allowed_packet=1024M
# 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。只对MyISAM表起作用。但即使你不使用MyISAM表,内部的临时磁盘表是MyISAM表,也要使用该值。
key_buffer_size=16M
# 对每个进行顺序扫描的线程将分配一个缓冲区。如果要进行大量顺序扫描,可增大参数值以提升性能。
read_buffer_size=262144
# 在key-sort操作后按排序读取行时,避免读取磁盘。增大该参数值可提升ORDER BY操作的性能。
read_rnd_buffer_size=524288

8. 配置MySQL启动脚本

创建启动脚本,默认情况下源码包中已经带有启动脚本了,拷贝到对应位置即可

cp scripts/mysqld.service /usr/lib/systemd/system/mysqld.service
​
# 创建pid文件目录并赋予权限
mkdir -p /var/run/mysqld
chown -R mysql:mysql /var/run/mysqld

另外还需要提供/usr/lib/tmpfiles.d中的mysql.conf的配置文件

echo "d /var/run/mysqld 0755 mysql mysql -" > /usr/lib/tmpfiles.d/mysql.conf

配置完成后启动服务

systemctl start mysqld

9. 安装插件

安装半同步插件后才能开启相关的配置

使用mysql命令登录进入实例后运行

# 安装密码检查插件
mysql> install plugin validate_password soname 'validate_password.so';
# 安装半同步插件
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

安装好之后,将配置文件my.conf中原本注释掉的以下内容取消注释:

#rpl_semi_sync_master_enabled = 1
#rpl_semi_sync_slave_enabled = 1
#rpl_semi_sync_master_timeout = 3000#validate_password = off

改完之后重启服务

[root@ks-worker03 ~]# service mysqld restart
Shutting down MySQL..... SUCCESS! 
Starting MySQL........... SUCCESS!