跳到主要内容

MySQL单机部署安装指南

简介​

本文档详细介绍了在Linux系统上部署单机版MySQL数据库的完整步骤。与集群部署不同,单机部署适用于开发测试环境或小型应用场景,配置相对简单,无需考虑主从同步、高可用等复杂配置。

通过遵循本指南,您将能够:

  • 成功安装MySQL单机版
  • 完成基本配置和初始化
  • 设置安全访问权限
  • 配置服务自启动

环境规划​

系统要求​

  • 操作系统:Oracle Linux 9 / Ubuntu 22.04 LTS 或更高版本
  • 内存:至少4GB RAM(推荐8GB及以上)
  • 存储:至少20GB可用磁盘空间
  • CPU:至少2核心

安装版本​

  • MySQL版本:8.4.0 或 8.0.37
  • 安装方式:二进制包离线安装
  • 安装路径:/usr/local/mysql
  • 数据存储路径:/data

数据库安装​

下载和解压安装包​

cd /root

# 下载MySQL二进制包(以8.0.37版本为例)
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz

# 解压安装包
tar -xvJf mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz

# 移动到安装目录
mv mysql-8.0.37-linux-glibc2.28-x86_64 /usr/local/mysql

创建用户和目录​

# 创建mysql用户组和用户
groupadd mysql
useradd -r -g mysql mysql

# 创建必要的目录
mkdir /usr/local/mysql/{binlog,logs,tmp,data} -p

# 设置目录权限
cd /data
chgrp -R mysql .

cd /usr/local/mysql
chown -R mysql .
chgrp -R mysql .

配置环境变量​

# 编辑环境变量文件
vim /etc/profile

在文件末尾添加以下内容:

export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib

使环境变量生效:

source /etc/profile

初始化MySQL数据库​

创建配置文件​

删除系统默认配置文件并创建新的配置文件:

rm -rf /etc/my.cnf
vim /etc/my.cnf

添加以下单机版MySQL配置内容:

[mysql]
port = 3306
socket = /usr/local/mysql/data/mysql.sock
default-character-set = utf8mb4

[mysqld]
port = 3306
datadir = /data
basedir = /usr/local/mysql
socket = /usr/local/mysql/data/mysql.sock
tmpdir = /usr/local/mysql/tmp
# MySQL启动用户
user = mysql
# 建议禁用符号链接以防止各种安全风险
symbolic-links = 0
explicit_defaults_for_timestamp = true
# 服务器的默认排序规则。
collation_server=utf8mb4_general_ci
# 默认的身份验证插件。(mysql_native_password,sha256_password,caching_sha2_password)
default-authentication-plugin=mysql_native_password
#mysql_native_password=ON
max_allowed_packet = 16M
# 允许的最大同时客户端连接数。(1-100000)
max_connections = 1000
max_user_connections = 1000
# 在max_connect_errors之后,来自主机的连续连接请求在没有成功连接的情况下被中断,服务器将阻止该主机进行进一步的连接。
max_connect_errors = 1000000
transaction_isolation = READ-COMMITTED
thread-cache-size = 50
open-files-limit = 65535
# 表名不区分大小写(修改后需要重新初始化mysql)
lower_case_table_names=1
# 设置sql_mode(没有NO_AUTO_CREATE_USER了)
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
group_concat_max_len=102400
character-set-server = utf8mb4
wait_timeout=1800
tmp_table_size=1G
sort_buffer_size=1048576
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 2
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_print_all_deadlocks = 1
innodb_log_file_size = 100M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_log_files_in_group = 3
innodb_log_group_home_dir = /usr/local/mysql/logs
# 单机版不需要GTID相关配置
# gtid-mode=on
# log-slave-updates=true
# enforce-gtid-consistency=true
# slave-parallel-type=LOGICAL_CLOCK
# slave-parallel-workers=4
# master-info-repository=TABLE
# relay-log-info-repository=TABLE
# sync-master-info=1
# binlog-checksum=CRC32
# rpl_semi_sync_master_enabled=1
# rpl_semi_sync_master_timeout=1000
# rpl_semi_sync_master_trace_level=32
# rpl_semi_sync_master_wait_no_slave=on
# auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n
# auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL
# binlog-ignore=mysql #忽略mysql库
# binlog-ignore=information_schema #忽略information_schema库
# replicate-do-db=test #要同步的数据库,默认所有库
log-bin = /usr/local/mysql/binlog/mysql-bin.log
expire_logs_days = 7
binlog_cache_size = 2097152
max-binlog-size=100M
log_bin_trust_function_creators = 1
sync-binlog = 1
binlog_format=row
# 单机版不需要以下配置
# log_slave_updates=1
# master_info_repository = TABLE
# relay_log_info_repository = TABLE
# relay_log_recovery = 1
# relay_log = /usr/local/mysql/binlog/mysql-relay.log
log-error = /usr/local/mysql/logs/mysqld.log
log-queries-not-using-indexes = 0
slow-query-log = 1
slow-query-log-file = /usr/local/mysql/logs/mysql-slow.log
long_query_time = 3
server-id = 1

[mysqld_safe]
pid-file = /usr/local/mysql/data/mysqld.pid

初始化配置权限​

chmod 644 /etc/my.cnf
chown -R mysql:mysql /etc/my.cnf

chmod 755 /data
chown -R mysql:mysql /data

# 如果要重新初始化则需要删掉datadir下的所有文件
rm -rf /data/*
rm -rf /usr/local/mysql/data/*
rm -rf /usr/local/mysql/logs/*

touch /usr/local/mysql/logs/mysqld.log
touch /usr/local/mysql/logs/mysqld_safe.log
chown -R mysql:mysql /usr/local/mysql/logs/

初始化MySQL​

# 初始化MySQL数据库
mysqld --defaults-file=/etc/my.cnf --initialize

# 创建mysql命令软链接
ln -s /usr/local/mysql/bin/mysql /usr/bin

启动MySQL服务​

使用mysqld_safe方式启动​

# 启动MySQL服务
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql > /usr/local/mysql/logs/mysqld_safe.log 2>&1 &

或者使用systemd服务方式启动​

创建systemd服务配置文件:

vim /etc/systemd/system/mysql.service

添加以下内容:

[Unit]
Description=MySQL Server
After=network.service

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=forking
TimeoutSec=0
PermissionsStartOnly=true
ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --log-error=/usr/local/mysql/logs/mysqld_safe.log
LimitNOFILE=5000
Restart=on-failure
RestartSec=10
RestartPreventExitStatus=1
PrivateTmp=false

启用并启动服务:

# 重载系统服务
systemctl daemon-reload

# 设置开机自启
systemctl enable mysql

验证服务状态​

# 查看MySQL服务状态
systemctl status mysql

# 查看端口
netstat -tnap | grep 3306

# 查看MySQL进程
ps aux|grep mysql

安全配置​

获取初始密码​

MySQL初始化时会生成一个临时密码,可以通过以下命令查看:

cat /usr/local/mysql/logs/mysqld.log | grep "A temporary password"

登录MySQL并修改密码​

使用初始密码登录MySQL:

mysql -hlocalhost -uroot -p

登录后修改root用户密码:

-- 修改root用户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_secure_password';

-- 刷新权限
flush privileges;

-- 查看用户信息
select host, user, plugin, authentication_string from mysql.user;

-- 退出
quit;

配置远程访问(可选)​

如果需要从其他机器访问MySQL,可以开启远程访问:

mysql -hlocalhost -uroot -p
-- 开启root用户远程访问权限
update mysql.user set host = '%', plugin='mysql_native_password' where user='root';

-- 刷新权限
flush privileges;

-- 退出
quit;

注意:在生产环境中,不建议开启root用户的远程访问权限,应该创建专用的用户进行远程访问。

防火墙配置​

根据操作系统不同,使用相应的命令放行3306端口:

CentOS/Oracle Linux​

firewall-cmd --add-port=3306/tcp --permanent --zone=public

# 重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

Ubuntu/Debian​

ufw allow 3306/tcp
ufw reload

系统优化配置​

关闭SELINUX(CentOS/Oracle Linux)​

编辑SELINUX配置文件:

vim /etc/selinux/config

将SELINUX=enforcing修改为SELINUX=disabled:

#SELINUX=enforcing 修改为  SELINUX=disabled
SELINUX=disabled

重启服务器验证​

reboot

重启后验证MySQL服务是否正常启动:

# 重新连接服务器,查看mysql 服务的状态:
systemctl status mysql

# 查看端口
netstat -tnap | grep 3306

# 查看mysql启动情况
ps aux|grep mysql

故障排除​

常见问题​

  1. 无法启动MySQL服务

    • 检查错误日志:cat /usr/local/mysql/logs/mysqld.log
    • 确认配置文件是否正确:cat /etc/my.cnf
    • 检查目录权限是否正确设置
  2. 忘记root密码

    • 停止MySQL服务:systemctl stop mysql
    • 使用跳过权限表方式启动:mysqld --skip-grant-tables &
    • 登录MySQL并修改密码
    • 重启MySQL服务
  3. 连接拒绝错误

    • 检查防火墙设置
    • 确认MySQL是否监听正确的IP地址
    • 检查用户权限设置

总结​

通过本文档,您已经完成了MySQL单机版的完整安装和配置过程。相比于集群部署,单机版更适合用于开发测试环境,配置更简单,维护成本更低。在生产环境中,建议根据实际需求选择合适的部署方案。

参考资料​

如需了解MySQL高可用部署方案,请参考 MySQL高可用故障转移(双主热备) 文档。