系统环境
我的服务器系统信息如图:
下载
下载地址:https://dev.mysql.com/downloads/mysql/
操作系统选择 Linux - Generic,系统架构根据自己的需求选择。
解压,重命名,移动,新建目录
1 2 3 4 5 6 7 8 tar -xvf mysql-8.4.3-linux-glibc2.28-x86_64.tar.xz mv mysql-8.4.3-linux-glibc2.28-x86_64 mysql-8.4.3 sudo mv mysql-8.4.3 /usr/local sudo mkdir -pv /usr/local/mysql-8.4.3/{data,log} sudo touch /usr/local/mysql-8.4.3/log/error.log sudo touch /usr/local/mysql-8.4.3/log/slow.log sudo touch /usr/local/mysql-8.4.3/log/general.log mkdir /tmp/mysql
配置文件
新建了一个配置文件 /etc/mysql.cnf
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [mysqld] #=====================基本路径配置===================== basedir=/usr/local/mysql-8.4.3 datadir=/usr/local/mysql-8.4.3/data port=3306 socket=/tmp/mysql/mysql.sock mysqlx_socket=/tmp/mysql/mysqlx.sock pid-file=/tmp/mysql/mysqld.pid # ===================== 性能优化配置 ===================== # InnoDB配置 innodb_buffer_pool_size = 4G # 根据系统内存大小调整 innodb_log_buffer_size = 64M innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 1 innodb_flush_method = O_DIRECT innodb_io_capacity = 2000 #=====================日志配置===================== #错误日志 log-error=/usr/local/mysql-8.4.3/log/error.log #慢查询日志 slow_query_log=1 slow_query_log_file=/usr/local/mysql-8.4.3/log/slow.log long_query_time=2#记录执行时间超过2秒的查询 #通用查询日志 general_log=1 general_log_file=/usr/local/mysql-8.4.3/log/general.log #=====================字符集设置===================== character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci #=====================主从复制配置===================== #如果有主从复制,确保每个实例的server-id唯一 #启用二进制日志及设置server-id server-id=1 #=====================系统资源配置===================== #文件描述符限制(适用于大连接数的系统) [mysqld_safe] ulimit=65535 [mysql] default-character-set=utf8mb4 [client] port=3306 socket=/tmp/mysql/mysql.sock
新建 mysql 用户及权限配置
1 2 3 4 5 6 7 sudo groupadd mysql sudo useradd -r -g mysql mysql # 更改刚才新建的文件及目录的所属用户和用户组 sudo chown -R mysql:mysql /usr/local/mysql-8.4.3 sudo chown mysql:mysql /tmp/mysql sudo chown mysql:mysql /etc/mysql.conf
SELinux
在不关闭 selinux 的情况下,需要配置刚才新建的文件及目录的安全上下文,否则会导致权限问题,selinux 无法让 MySQL 正常启动。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 sudo semanage fcontext -a -t mysqld_exec_t "/usr/local/mysql-8.4.3/bin/mysqld" sudo restorecon -v /usr/local/mysql-8.4.3/bin/mysqld sudo semanage fcontext -a -t mysqld_db_t "/usr/local/mysql-8.4.3/data(/.*)?" sudo restorecon -Rv /usr/local/mysql-8.4.3/data sudo semanage fcontext -a -t mysqld_etc_t "/etc/mysql.cnf" sudo restorecon -R -v /etc/mysql.cnf sudo semanage fcontext -a -t mysqld_log_t "/usr/local/mysql-8.4.3/log(/.*)?" sudo restorecon -Rv /usr/local/mysql-8.4.3/log sudo semanage fcontext -a -t mysqld_var_run_t "/tmp/mysql/mysql.sock" sudo restorecon -v /tmp/mysql/mysql.sock sudo semanage fcontext -a -t mysqld_var_run_t "/tmp/mysql/mysqlx.sock" sudo restorecon -v /tmp/mysql/mysqlx.sock sudo semanage fcontext -a -t mysqld_var_run_t "/tmp/mysql/mysqld.pid" sudo restorecon -v /tmp/mysql/mysqld.pid sudo semanage fcontext -a -t mysqld_var_run_t "/tmp/mysql(/.*)?" sudo restorecon -Rv /tmp/mysql(/.*)?
此外,一些可能用得到的查询的命令:
1 2 3 4 5 6 7 8 9 # 查询selinux的mysql策略 sudo semanage fcontext -l | grep mysql # 查询selinux开放了mysql的端口 sudo semanage port -l | grep mysql # selinux添加新的端口,mysqlx 的端口为 33060 sudo semanage port -a -t mysqld_port_t -p tcp 33060 # 删除刚才给文件设置的安全上下文: sudo semanage fcontext -d "/path/your/set" sudo restorecon -v /path/your/set
可参考 SELinux File Context
MySQL 的初始化及系统服务
MySQL 8.4以后,建议不要再使用 mysqld_safe
来启动 MySQL,直接使用 mysqld
即可。 mysqld_safe
的历史使命已经完成,现代的 systemd
能够提供更强大和灵活的服务管理功能,包括自动重启失败的服务、日志管理等。
1 2 cd /usr/local/mysql-8.4.3/bin ./mysqld --defaults-file=/etc/mysql.conf --user=mysql --initialize
初始化完成后,可以在 log/error.log
中看到为 root 用户生成的默认密码。
使用 systemd 来管理 MySQL,新建的 /etc/systemd/system/mysql.service
文件内容应该如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [Unit] Description=MySQL Community Server After=network.target [Service] Type=notify User=mysql Group=mysql ExecStart=/usr/local/mysql-8.4.3/bin/mysqld --defaults-file=/etc/mysql.cnf LimitNOFILE=65535 Environment=NOTIFY_SOCKET=/run/systemd/notify [Install] WantedBy=multi-user.target
特别注意:
根据官方文档,mysql 8.4
以后的版本 Type 改为了 notify。 见 Managing MySQL Server with systemd
In MySQL 8.4, mysqld uses the Type=notify process startup type. (Type=forking was used in MySQL 5.7.) With Type=notify, systemd automatically configures a socket file and exports the path to the NOTIFY_SOCKET environment variable.
这里面的 ExecStart
不能使用 mysqld_safe,否则会造成进程间无法通信。根据 AI 的说法,MySQL 的子进程尝试通过 NOTIFY_SOCKET 向 systemd 发送通知,但 systemd 只接受来自主进程的通知。这通常是由于 mysqld_safe 和 mysqld 之间的交互导致的问题。官方文档 Managing MySQL Server with systemd 里面提到:
On platforms for which systemd support for MySQL is installed, scripts such as mysqld_safe and the System V initialization script are unnecessary and are not installed. For example, mysqld_safe can handle server restarts, but systemd provides the same capability, and does so in a manner consistent with management of other services rather than by using an application-specific program.
重启服务或重启系统后,如果 systemctl status mysql
显示服务运行正常,即可用 mysql -uroot -p
命令登录,密码是log文件中生成的默认密码,登录后首先修改 root 用户密码
1 2 3 4 use mysql; alter user 'root'@'localhost' identified by 'your new password'; flush privileges;
至此,安装阶段基本完成。