该文档主要介绍了在CentOS7.9的环境下安装MySQL5.7,并对my.cnf进行简单的配置,同时配置启动脚本和设置开机自启动。 

MySQL介绍:

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。


一、环境检查

1.1 默认系统可能会预装mariadb-libs的包,需要先检查该包是否已经安装

        如下命令的返回,是已经安装了,然后需要卸载掉这个包。

# 检查软件包是否存在
[root@rdb-01 ~]# rpm -q mariadb-libs
mariadb-libs-5.5.68-1.el7.x86_64
# 卸载软件包
[root@rdb-01 ~]# rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

1.2 关闭selinux

[root@rdb-01 ~]# vi  /etc/sysconfig/selinux
SELINUX=disabled  # 修改为 disabled ,默认是重启系统生效
立即生效命令:setenforce 0 # 不需要重启系统,但是不进行上述修改,该更改重启后失效

1.3 安装 Epel 包管理

     yum -y install epel-release


二、开始安装MySQL5.7

2.1 下载MySQL5.7安装包,RPM

我们这里选择MySQL 5.7.36版本
Tip:

      在生产环境中,如果对版本无特殊要求时,建议本地安装版本参考一下公有云的版本,例如目前公有云大部分都是MySQL 5.6  5.7以及8.0,咱们就不要使用MySQL 5.5了。这样当遇到迁云的需求时,大版本可以匹配上。

地址:https://downloads.mysql.com/archives/community/

CentOS7.9 安装MySQL5.7_MySQL安装

CentOS7.9 安装MySQL5.7_MySQL安装_02

CentOS7.9 安装MySQL5.7_MySQL5.7_03

需要下载如下所示的包
mysql-community-client-5.7.36-1.el7.x86_64.rpm
mysql-community-common-5.7.36-1.el7.x86_64.rpm
mysql-community-devel-5.7.36-1.el7.x86_64.rpm
mysql-community-libs-5.7.36-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.36-1.el7.x86_64.rpm
mysql-community-server-5.7.36-1.el7.x86_64.rpm


# 安装
[root@rdb-01 mysql5.7]# yum -y localinstall mysql-community-*


# 检查安装
[root@rdb-01 mysql5.7]# rpm -qa |grep mysql
mysql-community-server-5.7.36-1.el7.x86_64
mysql-community-common-5.7.36-1.el7.x86_64
mysql-community-client-5.7.36-1.el7.x86_64
mysql-community-devel-5.7.36-1.el7.x86_64
mysql-community-libs-5.7.36-1.el7.x86_64
mysql-community-libs-compat-5.7.36-1.el7.x86_64

2.2 修改配置文件

# /etc/my.cnf
[mysqld]
user=mysql
port=3306
datadir=/data/dbdata/mysql_3306/mydata
tmpdir=/data/dbdata/mysql_3306/tmpdir
socket=/data/dbdata/mysql_3306/sock/mysql.sock
pid-file=/data/dbdata/mysql_3306/mysqld.pid
log-error=/data/dbdata/mysql_3306/log/mysql-error.log
max_connections=1500
wait_timeout=3600
interactive_timeout=3600
explicit_defaults_for_timestamp=OFF
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
transaction_isolation=READ-COMMITTED
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
tmp_table_size=209715200
max_heap_table_size=67108864
max_allowed_packet=1073741824
open_files_limit=102400
expire_logs_days=15
#slow-log
slow_query_log=on
long_query_time=1
slow_query_log_file=/data/dbdata/mysql_3306/log/slow.log
#binlog
binlog_format=ROW
log-bin=/data/dbdata/mysql_3306/binlog/mysql-bin
log-bin-index=/data/dbdata/mysql_3306/binlog/mysql-bin.index
#relay-log
relay_log=/data/dbdata/mysql_3306/relaylog/relay-bin
relay_log_index=/data/dbdata/mysql_3306/relaylog/relay-bin.index
relay_log_info_repository=TABLE
#innodb配置
innodb_buffer_pool_size=3221225472
innodb_log_buffer_size=67108864
innodb_flush_log_at_trx_commit=1
innodb_file_per_table=ON
innodb_flush_method=O_DIRECT
innodb_data_file_path=ibdata1:12M:autoextend
innodb_log_files_in_group=4
innodb_log_file_size=256M
innodb_log_group_home_dir=/data/dbdata/mysql_3306/innodb_log
innodb_data_home_dir=/data/dbdata/mysql_3306/innodb_ts
server-id=1


2.3 创建数据目录以及权限配置

# 创建目录
mkdir -p /data/dbdata/mysql_3306/{log,binlog,relaylog,mydata,innodb_log,innodb_ts,sock,tmpdir}
cd /data/dbdata
chown  -R mysql.mysql  mysql_3306


# 初始化系统表
mysqld --defaults-file=/etc/my.cnf --initialize-insecure
cd /data/dbdata
chown  -R mysql.mysql  mysql_3306


2.4 配置启动脚本

# /usr/lib/systemd/system/mysqld.service
[Unit]
Descriptinotallow=MySQL Server
Documentatinotallow=man:mysqld(8)
Documentatinotallow=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
#PIDFile=/var/run/mysqld/mysqld.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
Permissinotallow=true
# Needed to create system tables
ExecStartPre=/usr/bin/mysqld_pre_systemd
#Start main service
#ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS # 默认配置
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/my.cnf --daemonize --pid-file=/data/dbdata/mysql_3306/mysqld.pid
# Use this to switch malloc implementation
Envirnotallow=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

执行:systemctl daemon-reload,重新加载,否则启动脚本不生效

2.5 权限分配

# 登录MySQL
mysql -S /data/dbdata/mysql_3306/sock/mysql.sock


mysql> grant all on *.* to root@127.0.0.1 identified by '123456' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)


mysql> grant all on *.* to root@localhost identified by '123456' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)


mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec
mysql> quit
Bye


# 命令行,测试权限是否正确
mysql -u root -h 127.0.0.1 -p123456 # 生产环境切记不要明文密码登

至此,MySQL单实例环境部署成功。


MySQL max_cnotallow=1500 配置不符合预期的问题

# 测试流程
# /usr/lib/systemd/system/mysqld.service 
LimitNOFILE = 5000 # systemd 控制进程的open-file数量


例如,我们在my.cnf 中已经配置了 max_cnotallow=1500,此时按照正常理解
MySQL的最大连接数已经配置为1500了。
但是当 mysqld.service 中删除 LimitNOFILE = 5000,该选项之后。并重启MySQL进程后


登录MySQL查看,那么max_connections是不符合预期的,而且此时系统的ulimit -n 是 65535
而MySQL中是1024
mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 214   |
+-----------------+-------+


mysql> SHOW VARIABLES LIKE 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1024  |
+------------------+-------+
1 row in set (0.00 sec)


此时通过命令查看MySQL的进程,这个进程的文件打开数是被限制到1024的
此时虽然配置了最大连接数是1500,但是文件打开数并不够,所以配置不符合预期
[root@rdb-01 ~]# cat /proc/4671/limits 
Max open files            1024                 4096                 files     




所以如果在部署时发现MySQL最大连接数配置不符合预期时,可以检查一下 LimitNOFILE = 5000
参数是否正常。


官方解释:
open_files_limit 是不能大于系统 ulimit -n 配置的参数
计算公式:
open_files_limit  = 10 + max_connections + (table_open_cache * 2)
table_open_cache = open_files_limit - 10 -max_connections / 2


示例:
1024 = 10 + 214 + (400 * 2)


如果你想配置更大的 max_connections 和 table_open_cache,就需要为
MySQL进程分配更大的 open_file_limit