1. 环境准备与MySQL 8.0安装
在CentOS 7上部署MySQL 8.0之前,需要先确保系统环境干净。CentOS 7默认会安装MariaDB,这是MySQL的一个分支,可能与MySQL 8.0产生冲突。我遇到过不少因为没清理MariaDB导致安装失败的案例,所以第一步就是彻底移除它:
# 检查已安装的MariaDB相关包 rpm -qa | grep mariadb # 移除所有MariaDB组件(注意依赖关系,可能需要先移除依赖包) sudo yum remove mariadb-server mariadb-client mariadb-libs -y接下来下载MySQL 8.0的官方Yum仓库配置。这里有个坑点:MySQL官网的下载链接有时会更新版本号,直接复制老教程的命令可能会404。我推荐先去官网查看最新地址:
# 2024年最新稳定版仓库配置(建议先访问官网确认) wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm # 验证下载完整性(对比官网提供的MD5) md5sum mysql80-community-release-el7-11.noarch.rpm安装仓库配置后,你会注意到yum默认启用了MySQL 8.0的仓库。但这里有个优化技巧:国内用户可以通过修改repo文件使用阿里云镜像加速:
sudo rpm -ivh mysql80-community-release-el7-11.noarch.rpm sudo sed -i 's|http://repo.mysql.com|https://mirrors.aliyun.com/mysql|g' /etc/yum.repos.d/mysql-community.repo安装MySQL服务端时,可能会遇到密钥导入提示。这是因为MySQL使用了新的GPG密钥(2023年更新),直接输入y确认即可:
sudo yum install mysql-community-server -y安装完成后别急着启动,建议先做两个优化配置:
- 修改
/etc/my.cnf添加字符集配置(避免中文乱码) - 调整默认的密码策略(MySQL 8.0默认要求复杂密码)
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default_authentication_plugin=mysql_native_password2. 初始化配置与安全加固
首次启动MySQL服务时,系统会自动生成临时root密码。这个密码记录在日志中,很多新手会忽略这个步骤直接登录:
sudo systemctl start mysqld sudo grep 'temporary password' /var/log/mysqld.log使用临时密码登录后,必须立即修改密码。MySQL 8.0的密码策略比较严格,我建议先设置一个符合复杂要求的密码(如MyNewPass@123),等完成配置后再调整策略:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass@123';安全加固方面,MySQL自带了一个便捷脚本,会提示你:
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库等
mysql_secure_installation针对开发环境,你可能需要降低密码复杂度要求(生产环境不推荐):
SET GLOBAL validate_password.policy=LOW; ALTER USER 'root'@'localhost' IDENTIFIED BY 'simplepassword';3. 远程访问与用户权限管理
默认情况下,MySQL只允许本地连接。如果需要远程访问,需要两步操作:
- 修改绑定地址(谨慎操作,确保防火墙已配置)
# /etc/my.cnf [mysqld] bind-address = 0.0.0.0- 创建远程用户并授权(不要直接使用root)
CREATE USER 'developer'@'%' IDENTIFIED BY 'DevPassword123!'; GRANT ALL PRIVILEGES ON *.* TO 'developer'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;权限管理有个常见陷阱:MySQL 8.0修改了授权语法。以前常用的GRANT ALL ON *.*后面不跟IDENTIFIED BY了,必须分开执行:
-- 错误写法(MySQL 8.0会报语法错误) GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'password'; -- 正确写法 CREATE USER 'user'@'%' IDENTIFIED BY 'password'; GRANT ALL ON *.* TO 'user'@'%';4. Python连接MySQL实战
Python连接MySQL推荐使用官方驱动的改良版mysql-connector-python。在CentOS 7上安装时要注意系统自带的Python 2.7可能缺少依赖:
# 先安装开发依赖 sudo yum install python3-devel mysql-devel -y # 使用阿里云镜像加速安装 pip3 install mysql-connector-python -i https://mirrors.aliyun.com/pypi/simple/连接数据库时最常见的三个坑:
- 认证插件不匹配(需要指定auth_plugin)
- 字符集不一致导致中文乱码
- 时区问题导致时间字段异常
这是我优化后的连接代码模板:
import mysql.connector from mysql.connector import errorcode config = { 'host': 'localhost', 'user': 'developer', 'password': 'DevPassword123!', 'database': 'test_db', 'auth_plugin': 'mysql_native_password', # 关键参数 'charset': 'utf8mb4', # 支持完整unicode 'connection_timeout': 10 } try: conn = mysql.connector.connect(**config) cursor = conn.cursor(dictionary=True) # 返回字典形式结果 # 创建表示例 cursor.execute(""" CREATE TABLE IF NOT EXISTS articles ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, content LONGTEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 """) # 参数化插入数据(防止SQL注入) insert_sql = "INSERT INTO articles (title, content) VALUES (%s, %s)" data = ("MySQL 8.0指南", "这是一篇关于CentOS 7安装MySQL 8.0的详细教程...") cursor.execute(insert_sql, data) # 提交事务 conn.commit() except mysql.connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("账号密码错误") elif err.errno == errorcode.ER_BAD_DB_ERROR: print("数据库不存在") else: print(f"未知错误: {err}") finally: if 'conn' in locals() and conn.is_connected(): cursor.close() conn.close()5. 性能优化与故障排查
MySQL 8.0默认配置针对的是通用场景,对于特定应用需要调整。分享几个实测有效的优化参数:
# /etc/my.cnf 性能优化片段 [mysqld] innodb_buffer_pool_size = 1G # 建议设为物理内存的50-70% innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 2 # 非关键业务可设为2提升性能 max_connections = 200 # 根据应用需求调整遇到连接问题时,可以检查:
- 防火墙是否开放3306端口
sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reload- MySQL错误日志定位问题
sudo tail -50 /var/log/mysqld.log- 连接数监控
SHOW STATUS LIKE 'Threads_connected'; SHOW PROCESSLIST;对于Python应用,推荐使用连接池管理数据库连接。这是我常用的配置方案:
from mysql.connector import pooling dbconfig = { "host":"localhost", "user":"developer", "password":"DevPassword123!", "database":"test_db" } connection_pool = pooling.MySQLConnectionPool( pool_name="mypool", pool_size=5, # 根据并发量调整 **dbconfig ) # 使用示例 conn = connection_pool.get_connection() cursor = conn.cursor() cursor.execute("SELECT * FROM articles") print(cursor.fetchall()) conn.close() # 实际是返回连接池