引言
MySQL是世界上最流行的开源关系型数据库管理系统之一,广泛应用于各类网站和应用程序中。在CentOS系统上安装MySQL数据库是许多开发者和系统管理员的常见任务。本文将详细介绍在CentOS 7和CentOS 8上安装MySQL的完整步骤,以及解决常见问题的方案。
一、准备工作
在开始安装MySQL之前,需要确保系统满足以下条件:
系统更新
:确保系统软件包是最新的
网络连接
:确保系统可以访问互联网以下载MySQL安装包
root权限
:需要有管理员权限来安装软件
1.1 更新系统
sudo yum update -y
1.2 检查系统版本
cat /etc/redhat-release
二、安装MySQL
2.1 CentOS 7安装MySQL
2.1.1 添加MySQL官方Yum仓库
# 下载MySQL仓库配置包
sudo yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# 验证仓库是否添加成功
sudo yum repolist enabled | grep mysql
2.1.2 安装MySQL服务器
# 安装MySQL服务器
sudo yum install -y mysql-community-server
# 启动MySQL服务
sudo systemctl start mysqld
# 设置MySQL服务开机自启
sudo systemctl enable mysqld
2.1.3 获取初始密码
MySQL 5.7在首次安装时会生成一个临时root密码:
sudo grep ‘temporary password’ /var/log/mysqld.log
输出示例:
2023-10-15T08:23:45.678901Z 1 [Note] A temporary password is generated for root@localhost: abc123DEF$
2.2 CentOS 8安装MySQL
2.2.1 添加MySQL官方Yum仓库
# 下载MySQL仓库配置包
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
# 验证仓库是否添加成功
sudo dnf repolist enabled | grep mysql
2.2.2 安装MySQL服务器
# 安装MySQL服务器
sudo dnf install -y mysql-community-server
# 启动MySQL服务
sudo systemctl start mysqld
# 设置MySQL服务开机自启
sudo systemctl enable mysqld
2.2.3 获取初始密码
MySQL 8.0同样会生成临时密码:
sudo grep ‘temporary password’ /var/log/mysqld.log
三、MySQL安全设置
安装完成后,必须运行MySQL安全脚本来提高安全性:
sudo mysql_secure_installation
脚本会依次提示:
输入当前root密码
:使用刚才获取的临时密码
设置新密码
:输入强密码(至少8位,包含大小写字母、数字和特殊字符)
移除匿名用户
:建议输入Y
禁止root远程登录
:建议输入Y(除非需要远程管理)
删除测试数据库
:建议输入Y
重新加载权限表
:建议输入Y
四、基本配置与管理
4.1 登录MySQL
# 使用root用户登录
mysql -u root -p
# 输入设置的密码后进入MySQL命令行
4.2 创建新用户
— 创建新用户(MySQL 5.7语法)
CREATE USER ‘newuser’@’localhost’ IDENTIFIED BY ‘StrongPassword123!’;
— MySQL 8.0需要使用以下语法(因为caching_sha2_password插件)
CREATE USER ‘newuser’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘StrongPassword123!’;
— 授予权限
GRANT ALL PRIVILEGES ON *.* TO ‘newuser’@’localhost’ WITH GRANT OPTION;
— 刷新权限
FLUSH PRIVILEGES;
4.3 配置远程访问
— 允许用户从任何主机连接(不推荐在生产环境使用)
CREATE USER ‘remoteuser’@’%’ IDENTIFIED WITH mysql_native_password BY ‘RemotePass123!’;
— 授予权限
GRANT ALL PRIVILEGES ON *.* TO ‘remoteuser’@’%’ WITH GRANT OPTION;
— 刷新权限
FLUSH PRIVILEGES;
4.4 修改MySQL配置文件
MySQL配置文件位于
/etc/my.cnf
或
/etc/mysql/my.cnf
:
sudo vi /etc/my.cnf
常用配置示例:
[mysqld]
# 设置字符集为UTF-8
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 设置最大连接数
max_connections=200
# 设置缓冲区大小
innodb_buffer_pool_size=1G
# 设置慢查询日志
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2
# 设置错误日志
log_error=/var/log/mysql/error.log
[client]
default-character-set=utf8mb4
修改配置后重启MySQL服务:
sudo systemctl restart mysqld
五、防火墙配置
如果需要远程访问MySQL,必须配置防火墙:
5.1 CentOS 7防火墙配置
# 开放3306端口
sudo firewall-cmd –zone=public –add-port=3306/tcp –permanent
# 重新加载防火墙规则
sudo firewall-cmd –reload
# 查看已开放端口
sudo firewall-cmd –list-ports
5.2 CentOS 8防火墙配置
# 开放3306端口
sudo firewall-cmd –zone=public –add-port=3306/tcp –permanent
# 重新加载防火墙规则
sudo firewall-cmd –reload
六、常见问题解决方案
6.1 问题1:无法启动MySQL服务
症状
:执行
systemctl start mysqld
后服务无法启动
解决方案
:
# 查看服务状态
sudo systemctl status mysqld
# 查看详细日志
sudo journalctl -xe -u mysqld
# 检查数据目录权限
sudo ls -ld /var/lib/mysql
# 如果权限不正确,修复权限
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod -R 755 /var/lib/mysql
# 重新启动服务
sudo systemctl start mysqld
6.2 问题2:忘记root密码
解决方案
:
# 1. 停止MySQL服务
sudo systemctl stop mysqld
# 2. 以安全模式启动MySQL
sudo mysqld_safe –skip-grant-tables &
# 3. 无密码登录MySQL
mysql -u root
# 4. 在MySQL命令行中执行以下命令
FLUSH PRIVILEGES;
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘NewStrongPassword123!’;
# 5. 退出MySQL并重启服务
exit
sudo systemctl restart mysqld
6.3 问题3:无法远程连接
症状
:本地可以连接,但远程无法连接
解决方案
:
# 1. 检查MySQL用户权限
mysql -u root -p -e “SELECT user, host FROM mysql.user;”
# 2. 确保用户有远程访问权限(host为%或具体IP)
# 3. 检查MySQL配置文件中的bind-address
sudo grep bind-address /etc/my.cnf
# 4. 如果bind-address=127.0.0.1,修改为0.0.0.0或注释掉
sudo vi /etc/my.cnf
# 添加或修改:bind-address=0.0.0.0
# 5. 重启MySQL服务
sudo systemctl restart mysqld
# 6. 检查防火墙设置
sudo firewall-cmd –list-ports
6.4 问题4:安装过程中出现GPG密钥错误
症状
:安装时提示 “The downloaded packages were saved in cache until the next successful transaction. You could remove cached packages using ‘yum clean packages’.”
解决方案
:
# 导入GPG密钥
sudo rpm –import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
# 清理缓存
sudo yum clean all
# 重新安装
sudo yum install -y mysql-community-server
6.5 问题5:MySQL服务启动失败,提示端口被占用
症状
:日志中出现 “Can’t start server: Bind on TCP/IP port: Address already in use”
解决方案
:
# 1. 查看3306端口是否被占用
sudo netstat -tulnp | grep 3306
# 2. 如果被占用,找出占用进程
sudo lsof -i :3306
# 3. 停止占用端口的进程(注意:不要停止重要服务)
sudo kill -9
# 4. 或者修改MySQL配置文件,使用其他端口
sudo vi /etc/my.cnf
# 添加:port=3307
# 5. 重启MySQL服务
sudo systemctl restart mysqld
6.6 问题6:磁盘空间不足导致MySQL无法启动
症状
:日志中出现 “No space left on device”
解决方案
:
# 1. 检查磁盘空间
df -h
# 2. 查看MySQL日志文件大小
sudo du -sh /var/log/mysql/*
# 3. 清理旧日志文件
sudo find /var/log/mysql -name “*.log” -mtime +30 -delete
# 4. 或者清理二进制日志(如果启用了)
mysql -u root -p -e “PURGE BINARY LOGS BEFORE ‘2023-01-01 00:00:00’;”
# 5. 如果空间仍然不足,考虑扩展磁盘或删除不必要的文件
6.7 问题7:字符集问题导致中文乱码
症状
:插入中文数据后显示为问号或乱码
解决方案
:
# 1. 检查当前字符集设置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘character_set%’; SHOW VARIABLES LIKE ‘collation%’;”
# 2. 修改MySQL配置文件
sudo vi /etc/my.cnf
# 在[mysqld]部分添加:
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect=’SET NAMES utf8mb4′
# 在[client]部分添加:
default-character-set=utf8mb4
# 在[mysql]部分添加:
default-character-set=utf8mb4
# 3. 重启MySQL服务
sudo systemctl restart mysqld
# 4. 重建数据库和表
mysql -u root -p
— 在MySQL命令行中:
DROP DATABASE IF EXISTS testdb;
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE testdb;
CREATE TABLE test_table (id INT, name VARCHAR(100));
INSERT INTO test_table VALUES (1, ‘中文测试’);
SELECT * FROM test_table;
6.8 问题8:MySQL 8.0与旧版客户端不兼容
症状
:使用旧版客户端(如PHP 5.x、Python 2.7等)无法连接MySQL 8.0
原因
:MySQL 8.0默认使用
caching_sha2_password
插件,而旧版客户端不支持
解决方案
:
# 1. 修改用户认证插件
mysql -u root -p
# 在MySQL命令行中:
ALTER USER ‘oldclient’@’%’ IDENTIFIED WITH mysql_native_password BY ‘NewPassword123!’;
FLUSH PRIVILEGES;
# 2. 或者修改MySQL 8.0默认认证插件(不推荐)
# 修改配置文件 /etc/my.cnf
sudo vi /etc/my.cnf
# 在[mysqld]部分添加:
default_authentication_plugin=mysql_native_password
# 3. 重启MySQL服务
sudo systemctl restart mysqld
6.9 问题9:无法创建用户或授权失败
症状
:执行CREATE USER或GRANT命令时出现错误
解决方案
:
# 1. 检查当前用户权限
mysql -u root -p -e “SHOW GRANTS FOR CURRENT_USER();”
# 2. 确保使用root用户或有足够权限的用户
# 3. 如果是MySQL 8.0,注意语法变化
# MySQL 8.0中,GRANT不能隐式创建用户
# 正确的MySQL 8.0语法:
CREATE USER ‘username’@’host’ IDENTIFIED WITH mysql_native_password BY ‘Password123!’;
GRANT ALL PRIVILEGES ON database.* TO ‘username’@’host’;
FLUSH PRIVILEGES;
# 4. 如果出现 “Access denied” 错误,检查是否启用了skip-grant-tables
sudo grep skip-grant-tables /etc/my.cnf
# 如果有,注释掉并重启服务
6.10 问题10:性能问题排查
症状
:MySQL运行缓慢,CPU或内存占用高
解决方案
:
# 1. 查看MySQL进程列表
mysql -u root -p -e “SHOW PROCESSLIST;”
# 2. 查看慢查询日志
sudo tail -f /var/log/mysql/slow.log
# 3. 使用EXPLAIN分析慢查询
mysql -u root -p -e “EXPLAIN SELECT * FROM your_table WHERE condition;”
# 4. 查看InnoDB状态
mysql -u root -p -e “SHOW ENGINE INNODB STATUS\G”
# 5. 检查配置参数
mysql -u root -p -e “SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’; SHOW VARIABLES LIKE ‘max_connections’;”
# 6. 优化配置(示例)
sudo vi /etc/my.cnf
# 根据服务器配置调整:
innodb_buffer_pool_size=物理内存的50-70%
max_connections=根据需求调整(默认151)
query_cache_size=0 # MySQL 8.0已移除查询缓存
innodb_log_file_size=256M
七、备份与恢复
7.1 使用mysqldump备份
# 备份单个数据库
mysqldump -u root -p –databases mydb > /backup/mydb_$(date +%Y%m%d).sql
# 备份所有数据库
mysqldump -u root -p –all-databases > /backup/all_$(date +%Y%m%d).sql
# 备份单个表
mysqldump -u root -p mydb mytable > /backup/mytable_$(date +%Y%m%d).sql
# 压缩备份
mysqldump -u root -p mydb | gzip > /backup/mydb_$(date +%Y%m%d).sql.gz
7.2 恢复备份
# 解压(如果压缩)
gzip -d /backup/mydb_20231015.sql.gz
# 恢复数据库
mysql -u root -p mydb < /backup/mydb_20231015.sql
# 恢复所有数据库
mysql -u root -p < /backup/all_20231015.sql
7.3 物理备份(Percona XtraBackup)
对于大型数据库,推荐使用物理备份工具:
# 安装Percona XtraBackup
sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo yum install -y percona-xtrabackup-80
# 创建完整备份
sudo xtrabackup --backup --user=root --password=YourPassword --target-dir=/backup/xtrabackup_$(date +%Y%m%d)
# 准备备份
sudo xtrabackup --prepare --target-dir=/backup/xtrabackup_$(date +%Y%m%d)
# 恢复备份
sudo systemctl stop mysqld
sudo rm -rf /var/lib/mysql/*
sudo xtrabackup --copy-back --target-dir=/backup/xtrabackup_$(date +%Y%m%d)
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysqld
八、监控与维护
8.1 查看MySQL状态
# 查看服务状态
sudo systemctl status mysqld
# 查看MySQL运行状态
mysqladmin -u root -p status
# 查看详细状态
mysqladmin -u root -p extended-status
8.2 日志管理
# 查看错误日志
sudo tail -f /var/log/mysql/error.log
# 查看慢查询日志
sudo tail -f /var/log/mysql/slow.log
# 设置日志轮转
sudo vi /etc/logrotate.d/mysql-server
# 添加以下内容:
/var/log/mysql/*.log {
daily
rotate 7
missingok
compress
delaycompress
notifempty
create 640 mysql mysql
}
8.3 定期维护任务
# 创建维护脚本
sudo vi /usr/local/bin/mysql_maintenance.sh
#!/bin/bash
# MySQL维护脚本
# 备份目录
BACKUP_DIR="/backup/mysql"
mkdir -p $BACKUP_DIR
# 备份所有数据库
mysqldump -u root -p'YourPassword' --all-databases | gzip > $BACKUP_DIR/full_$(date +%Y%m%d_%H%M%S).sql.gz
# 清理旧备份(保留最近7天)
find $BACKUP_DIR -name “*.sql.gz” -mtime +7 -delete
# 优化表(每周一次)
if [ $(date +%u) -eq 7 ]; then
mysqlcheck -u root -p’YourPassword’ –auto-repair –optimize –all-databases
fi
# 设置脚本权限
sudo chmod +x /usr/local/bin/mysql_maintenance.sh
# 添加到crontab(每天凌晨2点执行备份)
sudo crontab -e
# 添加:
0 2 * * * /usr/local/bin/mysql_maintenance.sh
九、安全最佳实践
定期更新MySQL
:保持MySQL版本最新以获取安全补丁
强密码策略
:使用复杂密码并定期更换
最小权限原则
:只授予必要的权限
禁用root远程登录
:使用普通用户进行日常操作
定期备份
:实施自动化备份策略
监控异常登录
:检查MySQL日志中的异常登录尝试
使用SSL连接
:对远程连接启用SSL加密
十、总结
本文详细介绍了在CentOS系统上安装MySQL数据库的完整步骤,包括:
系统准备和仓库配置
MySQL 5.7和8.0的安装方法
安全配置和基本管理
防火墙设置
10个常见问题的详细解决方案
备份恢复策略
监控维护方法
通过遵循这些步骤,您可以在CentOS系统上成功安装并配置MySQL数据库,同时能够解决常见的安装和运行问题。记住在生产环境中始终遵循安全最佳实践,并定期备份数据。