常见 MySQL 服务部署方式:源码编译安装
、yum 方式
、二进制解压部署
,而本文采用 yum 安装方式。源码编译
相较其它两种,其最大的优势是可以按照自己使用 MySQL 的实际场景需求,去除一些不必要的 MySQL 特性,做定制化编译,有一定的性能优势 !! 并且得到的 MySQL 程序也更加轻量
MySQL 5.7.39
安装
# 将 MySQL Yum 存储库添加到系统的存储库列表中
yum install -y http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
# 查看 mysql-community 相关软件包
yum makecache
yum search mysql-community
# 安装指定软件包的指定版本
yum install mysql-community-server\*5.7.39 mysql-community-client\*5.7.39 \
mysql-community-libs\*5.7.39 mysql-community-libs-compat\*5.7.39 \
mysql-community-common\*5.7.39
# 设置开机自启,并启动 MySQL 实例
systemctl enable mysqld.service && systemctl start mysqld.service
# 可选,其它安装选项
yum install mysql-community\*5.7.30-1.el7.x86_64 # 安装前缀为 mysql-community 开头的相关软件包,且指定 mysql 相关软件包的版本
初始设置
1、使用初始密码登录 MySQL
# 查看初始化随机密码
grep "temporary password" /var/log/mysqld.log
> 2023-03-12T13:02:46.003118Z 1 [Note] A temporary password is generated for root@localhost: Nira)uenk0g,
使用密码 `Nira)uenk0g,` 执行登录
mysql -uroot -p -hlocalhost
mysql>
2、设置 MySQL 5.7.x 的 root 账号为简单密码,且允许从任意主机访问数据库。(仅本地开发环境设置,线上环境切勿如此设置,否则极度危险)
-- 设置密码级别 0 密码字符长度最小 4,允许数据库 root 用户从任意主机使用密码 root 登录本数据库
set global validate_password_policy=0; set global validate_password_length=4;
alter user user() identified by 'root';
update mysql.user set host='%' where user='root';
flush privileges;
exit;
最小配置
cat > /etc/my.cnf << EOF
[mysqld]
server_id = 10
explicit-defaults-for-timestamp = 1
symbolic-links = 0 # Disabling symbolic-links is recommended to prevent assorted security risks
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
innodb_buffer_pool_size = 128M # 配置 InnoDB 缓冲池大小
log_bin = mysql-bin # 启用 mysql bin 日志,并设置日志前缀名称为 mysql-bin;启用 bin log 的前提是通过配置项 server_id 配置 mysql server ID
binlog_cache_size = 32768 # 缓存大小 32K,用于在事务期间保存对 bin 日志的更改
join_buffer_size = 128M # 用于普通索引扫描、范围索引扫描和不使用索引并因此执行全表扫描的 连接缓冲区大小
sort_buffer_size = 2M # 每个必须执行排序的会话都会分配一个此大小的缓冲区
read_rnd_buffer_size = 2M # 用于多范围读取优化
tls_version = TLSv1.2 # 配置 mysql server 仅支持 tls 1.2
require-secure-transport = 1 # 启用任意用户与 mysql server 的连接必须为 tls 连接
EOF
默认日志 Warning 分析
初始化设置时,mysql 日志中的 Warning
提醒
cat /var/log/mysqld.log |grep Warning
# 修改配置文件 echo "explicit-defaults-for-timestamp = 1" >> /etc/my.cnf ,重启生效
2023-03-13T13:13:19.657308Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
# 提示 tls1 及 tls1.1 已启用,但过时!请使用 tls 1.2 及更高版本,解决方法见下方
2023-03-13T13:13:19.893171Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2023-03-13T13:13:19.893174Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
# 提示 mysql 使用的 ca 证书 /var/lib/mysql/ca.pem 为自签名证书
2023-03-13T13:13:19.894158Z 0 [Warning] CA certificate ca.pem is self signed.
1、启用 tls 1.2 版本
使用 TLS 1.2 加密客户端与 MySQL 数据库实例的连接,从 MySQL 5.7.35 开始,TLSv1 和 TLSv1.1 连接协议已弃用,并且在未来的 MySQL 版本中将删除对它们的支持
# 查看当前 mysql 服务器允许使用的 tls 版本
show global variables like "tls_version";
#> | tls_version | TLSv1,TLSv1.1,TLSv1.2 |
echo "tls_version = TLSv1.2" >> /etc/my.cnf # 设置仅允许 tls 1.2 , 可通过逗号设置多个 tls 版本
2、配置用户到数据库的连接为 tls 加密传输
# 配置指定用户 user01 到数据库需建立 SSL/TLS 连接
ALTER USER 'user01'@'%' REQUIRE SSL;
# 配置任意用户与数据库的连接都为 SSL/TLS 连接
show global variables like "require_secure%"; # 查看系统变量 require_secure_transport ,其默认值为 OFF,动态、全局
echo "require-secure-transport = 1" >> /etc/my.cnf
有关使用 MySQL 进行 SSL/TLS 连接的更多信息,请参阅 MySQL 文档中的使用加密连接
假设 MySQL 配置允许 TLSv1、TLSv1.1 和 TLSv1.2,但您的主机系统配置只允许使用 TLSv1.2 或更高版本的连接。在这种情况下,您无法建立使用 TLSv1 或 TLSv1.1 的 MySQL 连接,即使 MySQL 配置为允许它们,因为主机系统不允许它们
MySQL 8.0.30
安装
# 安装 MySQL 仓库,更新缓存
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum makecache
# 导入 MySQL RPM-GPG-KEY
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
# 安装指定版本 8.0.30
yum install mysql-community-server\*8.0.30 mysql-community-client\*8.0.30 \
mysql-community-libs\*8.0.30 mysql-community-libs-compat\*8.0.30 \
mysql-community-common\*8.0.30 mysql-community-client-plugins\*8.0.30 \
mysql-community-icu-data-files\*8.0.30
# 可选,安装最新版本
yum install mysql-community-server mysql-community-client
# 设置开机自启
systemctl enable mysqld.service
# 启动 MySQL 实例
systemctl start mysqld.service
初始设置
1、利用初始化随机密码登录 MySQL
grep "temporary password" /var/log/mysqld.log
#> 2023-03-13T14:28:21.052285Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: aw-hFm%.h4f_
mysql -uroot -p -hlocalhost
2、设置 MySQL 8.0.x 的 root 账号为简单密码,且允许从任意主机访问数据库
-- 做任何操作前,需安默认安全策略配置一个密码,才允许后续操作
alter user user() identified by 'Admin@123';
-- 设置密码策略,否则报错提示不满足现有密码策略,如 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
show global variables like "validate_password%";
set global validate_password.policy=0; -- validate_password_policy 设置 0 低级 1 中级 2 高级
set global validate_password.length=4;
set global validate_password.check_user_name = 0;
set global validate_password.mixed_case_count = 0;
set global validate_password.number_count=0;
set global validate_password.special_char_count=0;
-- 修改 root 账号为简单密码 root
alter user user() identified by 'root';
update mysql.user set host='%' where user='root';
flush privileges;
exit;
最小配置
cat > /etc/my.cnf << EOF
[mysqld]
server_id = 3
# 启用 mysql bin 日志,并设置日志前缀名称为 mysql-bin
log_bin = mysql-bin
# 在 MySQL 8.0 中,默认身份验证插件 caching_sha2_password,而不是 mysql_native_password
default-authentication-plugin = caching_sha2_password
# 设置各类缓冲区大小
innodb_buffer_pool_size = 128M
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF
管理命令
-- 查看当前数据库连接情况
mysql> show processlist;
-- 查看系统变量,按其作用域分为 global 和 session(默认) 变量
mysql> show variables;
mysql> show global variables;
mysql> show variables like "%innodb%";
-- 查看状态变量,了解 MySQL 服务器的运行状况,按其作用域分为 global 和 session(默认) 变量
mysql> show status;
mysql> show global status;
mysql> show status like "%innodb%";
-- 查看数据库 user 表状态,及存储引擎 innodb 状态
mysql> use mysql;
mysql> show table status like "user"\G;
mysql> show engine innodb status\G;
-- List of all MySQL commands
mysql> ?
-- 查看 SQL 语句帮助文档
mysql> help show
mysql> help show variables
mysql> help create table
-- 免登入执行 sql 命令
mysql -uroot -proot -h127.0.0.1 -e "show databases"
Q&A
1、提示当前系统提供的 GPG key 不适用于当前安装的 mysql 版本 5.7.39 或 8.0.30
The GPG keys listed for the "MySQL 5.7 Community Server" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.
# 5.7.39
Failing package is: mysql-community-client-5.7.39-1.el7.x86_64
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
# 8.0.30
Public key for mysql-community-common-8.0.30-1.el7.x86_64.rpm is not installed
Failing package is: mysql-community-common-8.0.30-1.el7.x86_64
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
# 解决方案是重新导入 mysql 官方 GPG key
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
2、mysql 启动报错,错误信息查看命令journalctl -xe
,报错信息提示需配置 mysql server ID
[ERROR] You have enabled the binary log, but you haven’t provided the mandatory server-id
[mysqld]
server_id = 10