拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Ubuntu 22.04安装MySQL 8.0及性能调优指南

1. Ubuntu系统MySQL安装全指南作为Linux系统管理员我每年要在各种Ubuntu服务器上部署数十次MySQL数据库。虽然apt安装看似简单但新手常因忽略关键配置导致后续性能问题。本文将分享我总结的Ubuntu 22.04 LTS下MySQL 8.0的最佳实践方案包含从安装到生产环境调优的全流程。1.1 环境准备要点在Ubuntu 22.04上安装MySQL前建议先执行以下命令更新软件源sudo apt update sudo apt upgrade -y sudo apt autoremove注意生产服务器建议先在测试环境验证升级兼容性。我曾遇到过因未测试直接升级导致Python-MySQL连接器不兼容的情况。通过lsb_release -a确认系统版本No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy1.2 安装方案选择Ubuntu官方源提供两种MySQL安装方式默认APT安装推荐新手sudo apt install mysql-server自动安装当前稳定版如8.0.36包含服务自动配置MySQL官方仓库安装需特定版本时wget https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb sudo dpkg -i mysql-apt-config_0.8.28-1_all.deb sudo apt update sudo apt install mysql-community-server实测对比官方仓库版本通常比Ubuntu源版本更新2-3个小版本但需要额外处理GPG密钥。普通业务用Ubuntu源即可。2. 安全初始化详解安装完成后必须运行安全脚本sudo mysql_secure_installation2.1 密码策略设置现代MySQL 8.0默认启用caching_sha2_password认证插件。如果客户端工具不支持如旧版Workbench需要修改ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;密码强度策略建议SET GLOBAL validate_password.policy MEDIUM; -- 要求大小写数字特殊字符 SET GLOBAL validate_password.length 12; -- 最小长度12位2.2 远程访问控制默认只允许本地连接如需远程访问CREATE USER admin% IDENTIFIED BY 复杂密码; GRANT ALL PRIVILEGES ON *.* TO admin% WITH GRANT OPTION;然后修改配置文件sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf找到bind-address改为bind-address 0.0.0.0安全警告开放远程访问必须配合防火墙规则如UFWsudo ufw allow 3306/tcp sudo ufw enable3. 性能调优实战3.1 内存配置公式对于4GB内存的服务器建议配置innodb_buffer_pool_size 2G # 物理内存的50-60% key_buffer_size 256M # MyISAM表专用如仍在使用 query_cache_size 0 # MySQL 8.0已移除查询缓存计算工具推荐sudo apt install mysql-tuning-primer ./mysql-tuning-primer.sh3.2 存储引擎优化InnoDB关键参数innodb_flush_log_at_trx_commit 1 # ACID保障默认 innodb_flush_method O_DIRECT # 避免双缓冲 innodb_file_per_table ON # 每个表独立表空间遇到性能瓶颈时可临时调整SET GLOBAL innodb_flush_log_at_trx_commit 2; # 折衷性能与安全4. 运维管理技巧4.1 备份方案原生工具mysqldumpmysqldump -u root -p --all-databases --single-transaction full_backup.sql物理备份需停机sudo systemctl stop mysql sudo rsync -av /var/lib/mysql /backup/mysql sudo systemctl start mysql二进制日志实时备份FLUSH BINARY LOGS; PURGE BINARY LOGS BEFORE NOW() - INTERVAL 7 DAY;4.2 监控指标关键命令SHOW ENGINE INNODB STATUS\G SHOW GLOBAL STATUS LIKE Threads_connected; SHOW PROCESSLIST;配置Prometheus监控scrape_configs: - job_name: mysql static_configs: - targets: [localhost:9104]5. 故障排查手册5.1 连接数爆满现象Too many connections错误应急处理SET GLOBAL max_connections 500; -- 临时调高根治方案sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf添加max_connections 300 wait_timeout 605.2 内存泄漏排查使用pmap分析sudo pmap -x $(pgrep mysqld) | sort -n -k3重点关注持续增长的匿名内存块anon。6. 版本升级策略从MySQL 5.7升级到8.0的步骤检查兼容性mysqlcheck -u root -p --all-databases --check-upgrade创建完整备份停止服务sudo systemctl stop mysql修改源列表sudo nano /etc/apt/sources.list.d/mysql.list执行升级sudo apt update sudo apt install mysql-server运行升级检查sudo mysql_upgrade -u root -p升级后必做事项重置密码插件检查存储引擎变化验证触发器/存储过程7. 高可用方案7.1 主从复制配置主库配置server-id 1 log_bin /var/log/mysql/mysql-bin.log binlog_format ROW从库配置CHANGE MASTER TO MASTER_HOSTmaster_ip, MASTER_USERrepl_user, MASTER_PASSWORDpassword, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS154; START SLAVE;验证状态SHOW SLAVE STATUS\G7.2 组复制Group Replication三节点集群配置示例plugin-load-addgroup_replication.so group_replication_group_nameaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa group_replication_start_on_bootoff group_replication_local_address node1:33061 group_replication_group_seeds node1:33061,node2:33061,node3:33061 group_replication_bootstrap_groupoff初始化集群SET GLOBAL group_replication_bootstrap_groupON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_groupOFF;8. 安全加固措施8.1 审计日志配置安装审计插件sudo apt install mysql-enterprise-audit配置文件示例[mysqld] plugin-load-addaudit_log.so audit_log_formatJSON audit_log_policyALL8.2 加密传输生成SSL证书sudo mysql_ssl_rsa_setup --uidmysql强制SSL连接ALTER USER appuser% REQUIRE SSL;验证连接mysql --ssl-modeREQUIRED -u appuser -p9. 开发适配指南9.1 Python连接配置推荐使用mysqlclientimport MySQLdb db MySQLdb.connect( hostlocalhost, userappuser, passwdpassword, dbappdb, ssl{ca: /path/to/ca.pem} )异步方案aiomysqlasync with aiomysql.connect(hostlocalhost, useruser, passwordpwd, dbdb, ssl_ca/path/to/ca.pem) as conn: async with conn.cursor() as cur: await cur.execute(SELECT 42;) print(await cur.fetchone())9.2 连接池配置使用SQLAlchemy配置from sqlalchemy import create_engine engine create_engine( mysqlpymysql://user:pwdlocalhost/db, pool_size10, max_overflow20, pool_pre_pingTrue )10. 性能测试方法10.1 sysbench基准测试安装工具sudo apt install sysbench准备测试数据sysbench oltp_read_write \ --db-drivermysql \ --mysql-userroot \ --mysql-passwordyourpassword \ --mysql-dbsbtest \ prepare执行测试sysbench oltp_read_write \ --threads8 \ --time300 \ --mysql-ignore-errorsall \ run10.2 慢查询分析启用慢查询日志slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 1 log_queries_not_using_indexes 1使用pt-query-digest分析sudo apt install percona-toolkit pt-query-digest /var/log/mysql/mysql-slow.log11. 容器化部署方案11.1 Docker单实例官方镜像运行docker run --name mysql \ -e MYSQL_ROOT_PASSWORDyourpassword \ -p 3306:3306 \ -v /path/to/data:/var/lib/mysql \ -d mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci11.2 Kubernetes部署示例StatefulSet配置apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql replicas: 3 template: spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: yourpassword ports: - containerPort: 3306 volumeMounts: - name: data mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: data spec: accessModes: [ ReadWriteOnce ] resources: requests: storage: 10Gi12. 替代方案评估12.1 MySQL分支对比特性官方MySQLMariaDBPercona线程池企业版包含包含备份锁8.010.58.0默认引擎InnoDBAriaInnoDB监控工具企业监控无PMM12.2 云服务选择AWS RDS配置建议启用多AZ部署设置自动扩展存储配置增强监控每1秒粒度自建与云服务成本对比以4核16GB为例自建约$200/月含硬件折旧RDS约$350/月Aurora约$450/月13. 历史问题解析13.1 字符集演进MySQL 5.7默认SHOW VARIABLES LIKE character_set%; ------------------------------------------------------ | Variable_name | Value | ------------------------------------------------------ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | ------------------------------------------------------MySQL 8.0改进------------------------------------------------------ | Variable_name | Value | ------------------------------------------------------ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | ------------------------------------------------------重要提示utf8mb4完全支持emoji和所有Unicode字符新项目必须使用。13.2 密码插件变更MySQL 8.0默认认证插件default_authentication_plugincaching_sha2_password兼容性处理方案ALTER USER legacyapp% IDENTIFIED WITH mysql_native_password BY password;14. 最佳实践总结经过多年运维经验我总结的UbuntuMySQL黄金法则安装后必做三件事运行mysql_secure_installation调整innodb_buffer_pool_size配置合适的日志轮转连接管理原则每个应用使用独立数据库账号生产环境禁用root远程登录使用连接池控制连接数备份策略每日全备binlog增量定期验证备份可恢复性异地保存至少一份副本监控重点指标连接数利用率查询响应时间P99复制延迟如有从库最后分享一个诊断连接泄漏的技巧watch -n 1 mysqladmin processlist | grep -v Sleep | sort -k6
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门