【Ubuntu安装MySQL教程】二进制部署8.0.45全流程(附MySQL安装包,避坑指南)

前言

在Linux运维和Web开发中,Ubuntu安装MySQL教程是每一位后端工程师、DBA和运维人员绕不开的必修课。MySQL作为全球最流行的开源关系型数据库,凭借其高性能、高可靠性和丰富的生态,支撑着无数互联网企业的核心业务。然而,很多初学者在Ubuntu系统上安装MySQL时,往往只懂得使用apt install一键安装,这种方式虽然简单,却存在版本滞后、目录结构不清晰、难以定制化配置等问题。

本文带来的Ubuntu安装MySQL教程,将采用通用二进制包(Generic Binary) 的方式进行部署。相比于APT仓库安装,二进制包安装具有三大优势:版本自主可控(可选择最新稳定版如8.0.45)、目录结构自定义(便于多实例管理和迁移)、生产环境更规范(符合企业级部署标准)。教程基于MySQL 8.0.45版本,涵盖从下载、解压、配置、初始化到启动验证的完整流程,并附上经过生产环境验证的my.cnf配置文件详解。无论你是刚入门的开发者,还是寻求规范化部署的运维工程师,这篇Ubuntu安装MySQL教程都能为你提供一站式的解决方案。

安装前必读:在开始之前,你需要先部署好一台Ubuntu Server系统(参考文章: https://www.cnblogs.com/dbbull/p/21557531

一、MySQL是什么?

MySQL是一个多线程、多用户、结构化的SQL数据库服务器。它采用客户端/服务器架构,由服务器守护进程(mysqld)和多种客户端程序及库组成。自1995年问世以来,MySQL凭借其开源性、高性能、跨平台等特性,成为LAMP(Linux+Apache+MySQL+PHP)和LNMP(Linux+Nginx+MySQL+PHP)架构中的核心数据存储组件。

MySQL 8.0的核心特性包括:

  • 数据字典(Data Dictionary) :将原本分散的元数据统一管理,提升系统表查询效率。
  • 通用表表达式(CTE) :支持WITH语句,简化复杂查询的编写。
  • 窗口函数(Window Functions) :提供更强大的分析查询能力。
  • 角色管理(Roles) :简化权限管理,支持将权限集合赋予角色再分配给用户。
  • 默认utf8mb4字符集:原生支持emoji和更多Unicode字符。

MySQL 8.0.45(2026年1月20日发布)是8.0系列的最新通用可用性(GA)版本。该版本在安全方面进行了重要加固——修复了多个高危漏洞,并将捆绑的OpenSSL库更新至3.0.18版本;同时修复了CTE、特定SQL查询执行、SHOW CREATE TABLE等多个优化器相关问题,以及InnoDB批量插入、二进制日志清理等关键Bug。选择8.0.45版本部署,意味着你使用的是经过充分测试、安全加固的最新稳定版

二、MySQL安装包下载

在进行Ubuntu安装MySQL教程的实操之前,首先需要获取MySQL 8.0.45的二进制安装包。

MySQL安装包下载地址

链接:https://pan.baidu.com/s/1DBY3D1h2Up4z-jMemxNSuA?pwd=5xib 提取码:5xib 
复制这段内容后打开百度网盘手机App,操作更方便哦

三、MySQL安装环境要求

在执行Ubuntu安装MySQL教程之前,请确保你的Ubuntu Server满足以下要求:

硬件要求(Ubuntu 22.04 LTS Server)

项目 最低配置 推荐配置
处理器 1.5 GHz单核 2 GHz双核及以上
内存 2 GB RAM 4 GB RAM及以上
硬盘空间 15 GB 25 GB及以上

如果是虚拟机环境,建议分配至少2核CPU、4GB内存、30GB硬盘。

软件依赖

  • libaio库:MySQL的异步I/O依赖库
  • numactl:NUMA架构下的CPU和内存管理工具
  • lrzsz:用于上传文件的rz/sz工具(可选)

前置检查

# 检查Ubuntu版本
lsb_release -a

# 检查glibc版本
ldd --version

# 检查系统架构
uname -m

四、Ubuntu安装MySQL步骤

以下是Ubuntu安装MySQL教程的核心实操部分,采用二进制包方式部署MySQL 8.0.45。

1. 创建MySQL虚拟用户

出于安全考虑,MySQL服务应使用专门的系统用户运行,而非root用户。

useradd -s /sbin/nologin -M mysql

参数说明-s /sbin/nologin 禁止该用户登录shell;-M 不创建用户家目录。

Ubuntu安装MySQL教程

2. 创建相关目录

# 创建工具存放目录
mkdir -p /server/tools

# 创建MySQL安装目录
mkdir -p /opt/mysql

# 创建MySQL数据目录(多实例规划,3306为端口号)
mkdir -p /data/mysql/mysql3306/{data,logs}

# 进入工具目录
cd /server/tools

目录规划说明/opt/mysql 存放MySQL软件;/data/mysql/mysql3306/ 存放数据和日志,便于多实例管理和数据迁移。

Ubuntu安装MySQL教程

3. 上传二进制包

将下载好的mysql-8.0.45-linux-glibc2.17-x86_64.tar.xz上传到服务器:

# 安装上传工具
apt install -y lrzsz    # Ubuntu/Debian系列

# 执行rz命令,选择本地文件上传
rz

Ubuntu安装MySQL教程

4. 解压二进制包

tar xf mysql-8.0.45-linux-glibc2.17-x86_64.tar.xz

Ubuntu安装MySQL教程

5. 移动软件到指定目录

mv mysql-8.0.45-linux-glibc2.17-x86_64 /opt/mysql/mysql-8.0.45

Ubuntu安装MySQL教程

6. 创建软连接

ln -s /opt/mysql/mysql-8.0.45/ /usr/local/mysql

软连接的作用:便于版本升级——未来升级时只需修改软连接指向新版本目录,无需改动配置文件中的路径。

Ubuntu安装MySQL教程

7. 删除mariadb-libs(如有冲突)

Ubuntu系统可能预装了mariadb的相关库,与MySQL安装会产生冲突:


# Ubuntu/Debian系列(检查并移除)
dpkg -l | grep mariadb
apt remove --purge mariadb-*

Ubuntu安装MySQL教程

8. 配置文件整理

创建MySQL配置文件/data/mysql/mysql3306/my3306.cnf

vim /data/mysql/mysql3306/my3306.cnf

配置文件内容如下:

[mysqld]
# 基础配置
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/mysql3306/data
socket=/data/mysql/mysql3306/mysql.sock
server_id=1
port=3306

# 日志配置
log_error=/data/mysql/mysql3306/logs/error.log
log_bin=/data/mysql/mysql3306/logs/mysql-bin
binlog_format=row
slow_query_log=on
slow_query_log_file=/data/mysql/mysql3306/logs/slow.log
long_query_time=0.5
log_queries_not_using_indexes=1

# GTID复制配置
gtid_mode=on
enforce_gtid_consistency=true
log_slave_updates=1

# 连接与性能配置
max_connections=1024
wait_timeout=60
sort_buffer_size=2M
max_allowed_packet=32M
join_buffer_size=2M

# InnoDB配置
innodb_buffer_pool_size=128M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=32M
innodb_log_file_size=128M
innodb_log_files_in_group=2

# Binlog配置
binlog_cache_size=2M
max_binlog_cache_size=8M
max_binlog_size=512M
expire_logs_days=7

Ubuntu安装MySQL教程

9. 安装MySQL依赖包

# Ubuntu使用apt安装
apt update
apt install libaio-dev numactl -y

libaio是MySQL的必需依赖,缺少会导致数据库初始化失败。

Ubuntu安装MySQL教程

10. 更改MySQL相关目录的用户组

chown -R mysql:mysql /data/*

Ubuntu安装MySQL教程

11. 初始化数据库

/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf \
    --initialize-insecure \
    --user=mysql \
    --basedir=/usr/local/mysql \
    --datadir=/data/mysql/mysql3306/data

参数说明--initialize-insecure 表示初始化时不生成root临时密码(便于首次登录后自行设置安全密码)。如需生成临时密码,可改用--initialize

Ubuntu安装MySQL教程

12. 加入环境变量

vim /etc/profile
# 在文件末尾添加
PATH="/usr/local/mysql/bin:$PATH"

# 使配置生效
source /etc/profile

配置完成后,可直接在任意目录执行mysqlmysqld等命令。

Ubuntu安装MySQL教程

Ubuntu安装MySQL教程

13. 启动MySQL

mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf &

Ubuntu安装MySQL教程

14. 查看是否启动成功

netstat -lntup | grep mysql

预期输出应包含0.0.0.0:3306127.0.0.1:3306的监听信息。

Ubuntu安装MySQL教程

设置开机自启(可选)

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
update-rc.d mysql defaults    # Ubuntu/Debian

五、验证MySQL安装

完成上述Ubuntu安装MySQL教程的步骤后,需要验证MySQL是否正常工作。

1. 检查进程状态

ps -ef | grep mysqld

2. 检查端口监听

ss -lntup | grep 3306

3. 登录MySQL报错

root@yuhaiqing:/server/tools# mysql -S /data/mysql/mysql3306/mysql.sock
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

# 安装 libncurses5 兼容库即可解决报错
sudo apt install -y libncurses5


Ubuntu安装MySQL教程

Ubuntu安装MySQL教程

由于初始化时使用了--initialize-insecure,首次登录无需密码。强烈建议立即设置root密码

4. 设置root密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的强密码';
FLUSH PRIVILEGES;

5. 查看MySQL版本

SELECT VERSION();

预期输出:8.0.45

六、MySQL基础操作

完成 Ubuntu安装MySQL教程 的部署后,您需要掌握MySQL的日常基础操作。本节涵盖连接方式、库表管理、数据增删改查、用户权限、字符集配置以及常用管理命令,共9个实用小节。

1. 连接MySQL的多种方式

方式一:通过socket文件连接(本地连接,无需网络)

mysql -S /data/mysql/mysql3306/mysql.sock -u root -p

方式二:通过TCP/IP连接(本地或远程)

mysql -h 127.0.0.1 -P 3306 -u root -p
# 远程连接示例
mysql -h 192.168.1.100 -P 3306 -u appuser -p

方式三:在命令行中直接执行SQL(脚本常用)

mysql -u root -p -e "SHOW DATABASES;"

提示:生产环境中建议使用socket方式,减少网络开销且更安全。

2. 数据库的日常管理

  • 查看所有数据库

    SHOW DATABASES;
    
  • 创建数据库(指定字符集和排序规则)

    CREATE DATABASE myapp 
      CHARACTER SET utf8mb4 
      COLLATE utf8mb4_unicode_ci;
    

    强烈建议使用 utf8mb4 字符集,支持完整的Unicode(包括emoji)。

  • 查看数据库创建语句

    SHOW CREATE DATABASE myapp;
    
  • 修改数据库字符集

    ALTER DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    
  • 删除数据库(谨慎操作)

    DROP DATABASE myapp;
    
  • 切换当前数据库

    USE myapp;
    

3. 表的基本管理

  • 查看当前库的所有表

    SHOW TABLES;
    
  • 创建表(示例:用户表)

    CREATE TABLE users (
        id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
        username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
        email VARCHAR(100) NOT NULL COMMENT '邮箱',
        age TINYINT UNSIGNED COMMENT '年龄',
        status TINYINT DEFAULT 1 COMMENT '状态:1启用,0禁用',
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
    
  • 查看表结构

    DESCRIBE users;   -- 或 DESC users;
    -- 更详细的查看
    SHOW FULL COLUMNS FROM users;
    
  • 查看建表语句

    SHOW CREATE TABLE users\G
    
  • 修改表结构(增加、修改、删除列)

    -- 增加列
    ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
    -- 修改列类型
    ALTER TABLE users MODIFY phone VARCHAR(30);
    -- 重命名列
    ALTER TABLE users CHANGE phone mobile VARCHAR(30);
    -- 删除列
    ALTER TABLE users DROP COLUMN mobile;
    
  • 重命名表

    RENAME TABLE users TO user_info;
    
  • 删除表

    DROP TABLE user_info;
    
  • 清空表数据(保留结构)

    TRUNCATE TABLE users;   -- 比 DELETE 更快,且重置自增ID
    

4. 数据操作(CRUD)

  • 插入数据(INSERT)

    -- 插入单条
    INSERT INTO users (username, email, age) VALUES ('alice', 'alice@example.com', 25);
    
    -- 插入多条
    INSERT INTO users (username, email, age) VALUES 
      ('bob', 'bob@example.com', 30),
      ('carol', 'carol@example.com', 28);
    
    -- 插入时指定所有字段(包括自增ID,通常不推荐)
    INSERT INTO users VALUES (100, 'dave', 'dave@example.com', 35, 1, NOW(), NOW());
    
  • 查询数据(SELECT)

    -- 基本查询
    SELECT * FROM users;
    -- 查询指定列
    SELECT id, username, email FROM users;
    -- 条件筛选
    SELECT * FROM users WHERE age > 25 AND status = 1;
    -- 排序
    SELECT * FROM users ORDER BY age DESC;
    -- 分页(LIMIT)
    SELECT * FROM users LIMIT 10 OFFSET 20;  -- 第21~30条
    -- 聚合函数
    SELECT COUNT(*) AS total, AVG(age) AS avg_age FROM users;
    -- 分组
    SELECT status, COUNT(*) FROM users GROUP BY status;
    -- 模糊查询(注意性能)
    SELECT * FROM users WHERE username LIKE 'a%';
    
  • 更新数据(UPDATE)

    -- 更新单条
    UPDATE users SET age = 26 WHERE username = 'alice';
    -- 批量更新
    UPDATE users SET status = 0 WHERE age < 18;
    -- 务必注意:不加WHERE会更新全表,谨慎操作!
    
  • 删除数据(DELETE)

    -- 删除指定记录
    DELETE FROM users WHERE id = 100;
    -- 删除所有记录(建议用TRUNCATE)
    DELETE FROM users;   -- 逐行删除,较慢
    

5. 用户和权限管理

  • 查看所有用户

    SELECT user, host, authentication_string FROM mysql.user;
    
  • 创建用户(指定允许登录的主机)

    -- 允许从任何主机连接
    CREATE USER 'appuser'@'%' IDENTIFIED BY 'SecurePass123!';
    -- 只允许本地连接
    CREATE USER 'admin'@'localhost' IDENTIFIED BY 'AdminPass456!';
    -- 允许从指定网段(例如192.168.1.%)
    CREATE USER 'backup'@'192.168.1.%' IDENTIFIED BY 'BackupPass789!';
    
  • 修改用户密码

    -- MySQL 8.0 推荐方式
    ALTER USER 'appuser'@'%' IDENTIFIED BY 'NewPass456!';
    -- 旧版方式(仍可用)
    SET PASSWORD FOR 'appuser'@'%' = 'NewPass456!';
    
  • 授予权限(细粒度控制)

    -- 授予对 myapp 库所有表的全部权限
    GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'%';
    -- 授予只读权限(SELECT)
    GRANT SELECT ON myapp.* TO 'readonly'@'%';
    -- 授予特定表的 INSERT 和 UPDATE 权限
    GRANT INSERT, UPDATE ON myapp.users TO 'editor'@'%';
    -- 授予全局管理权限(谨慎)
    GRANT RELOAD, PROCESS, SUPER ON *.* TO 'dba'@'localhost';
    -- 刷新权限使生效
    FLUSH PRIVILEGES;
    
  • 查看用户权限

    SHOW GRANTS FOR 'appuser'@'%';
    
  • 撤销权限

    REVOKE DELETE ON myapp.* FROM 'appuser'@'%';
    
  • 删除用户

    DROP USER 'appuser'@'%';
    

6. 字符集和排序规则设置

  • 查看当前数据库字符集

    SHOW VARIABLES LIKE 'character_set%';
    SHOW VARIABLES LIKE 'collation%';
    
  • 修改数据库默认字符集

    ALTER DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 修改表的字符集

    ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 修改字段字符集(单独修改某列)

    ALTER TABLE users MODIFY username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

7. 查看数据库状态和连接信息

  • 查看当前连接数及状态

    SHOW STATUS LIKE 'Threads_connected';   -- 当前活跃连接数
    SHOW STATUS LIKE 'Max_used_connections'; -- 历史最大连接数
    SHOW PROCESSLIST;    -- 查看所有连接及正在执行的SQL
    SHOW FULL PROCESSLIST; -- 显示完整的SQL语句
    
  • 查看数据库全局状态和变量

    SHOW GLOBAL STATUS;   -- 大量统计信息
    SHOW GLOBAL VARIABLES; -- 系统配置变量
    -- 查看特定变量,如最大连接数
    SHOW VARIABLES LIKE 'max_connections';
    
  • 查看存储引擎信息

    SHOW ENGINES;   -- 查看支持的引擎及默认引擎
    
  • 查看表大小和数据量

    -- 查看某张表的大小
    SELECT 
        table_name AS '表名',
        round(((data_length + index_length) / 1024 / 1024), 2) AS '大小(MB)'
    FROM information_schema.tables
    WHERE table_schema = 'myapp' AND table_name = 'users';
    

8. 导入导出数据

  • 使用 mysqldump 逻辑导出(在Shell中执行)

    # 导出整个数据库(含结构和数据)
    mysqldump -u root -p myapp > /tmp/myapp_backup.sql
    
    # 仅导出结构(无数据)
    mysqldump -u root -p --no-data myapp > /tmp/myapp_schema.sql
    
    # 仅导出数据(无结构)
    mysqldump -u root -p --no-create-info myapp > /tmp/myapp_data.sql
    
    # 导出指定表
    mysqldump -u root -p myapp users orders > /tmp/myapp_tables.sql
    
    # 添加 --single-transaction 保证一致性备份(InnoDB)
    mysqldump -u root -p --single-transaction myapp > /tmp/myapp_consistent.sql
    
  • 使用 source 命令导入(在MySQL客户端内)

    USE myapp;
    SOURCE /tmp/myapp_backup.sql;
    
  • 使用 mysql 命令导入(在Shell中)

    mysql -u root -p myapp < /tmp/myapp_backup.sql
    
  • 导出CSV格式(便于数据分析)

    SELECT * INTO OUTFILE '/tmp/users.csv'
    FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    FROM users;
    

    注意:OUTFILE 需要 FILE 权限,且路径需MySQL可写。

9. 常用管理命令速查

命令 作用
SHOW DATABASES; 列出所有数据库
SHOW TABLES; 列出当前库所有表
DESC table_name; 查看表结构
SHOW CREATE TABLE table_name\G 查看建表详细语句
SHOW INDEX FROM table_name; 查看表索引
SHOW STATUS LIKE 'uptime'; 查看MySQL运行时长
SHOW VARIABLES LIKE 'datadir'; 查看数据目录位置
KILL connection_id; 终止某个连接(从SHOW PROCESSLIST获得ID)
USE database_name; 切换当前数据库
SELECT DATABASE(); 查看当前所在数据库

七、MySQL进阶操作

当您熟练了基础操作后,本节将深入讲解 Ubuntu安装MySQL教程 后续的生产级进阶技能,涵盖主从复制、备份恢复、慢查询优化、二进制日志管理、性能监控以及常用运维工具,共7大模块。

1. 主从复制(GTID模式)

我们在配置文件中已启用了GTID(gtid_mode=on),复制配置更加简单可靠。

1.1 主库准备(Master)

  • 确保 server_id 唯一,且 log_bin 开启,log_slave_updates=1
  • 创建复制专用用户:
    CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass2026!';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    FLUSH PRIVILEGES;
    

1.2 从库配置(Slave)

  • 修改从库配置文件,设置 server_id 为不同值(如2),其余参数保持一致。
  • 重启从库MySQL。

1.3 启动复制(从库执行)

CHANGE MASTER TO
    MASTER_HOST='主库IP地址',
    MASTER_PORT=3306,
    MASTER_USER='repl',
    MASTER_PASSWORD='ReplPass2026!',
    MASTER_AUTO_POSITION=1;   -- 使用GTID自动定位

START SLAVE;

1.4 监控复制状态

SHOW SLAVE STATUS\G

重点关注:

  • Slave_IO_Running:应为 Yes
  • Slave_SQL_Running:应为 Yes
  • Last_IO_ErrorLast_SQL_Error:不应有错误
  • Seconds_Behind_Master:延迟秒数,越小越好

1.5 常见复制故障处理

  • IO线程中断:检查网络、用户权限、防火墙。
  • SQL线程中断:跳过错误(临时):
    STOP SLAVE;
    SET GTID_NEXT='具体跳过的事务GTID';
    BEGIN; COMMIT;
    SET GTID_NEXT='AUTOMATIC';
    START SLAVE;
    
    或使用 --slave-skip-errors 但需谨慎。

1.6 切换主从(故障转移)

  • 将从库提升为主库:
    STOP SLAVE;
    RESET SLAVE ALL;
    -- 然后清除从库原有复制信息,并开放写操作
    

2. 备份与恢复策略

2.1 逻辑备份(mysqldump)
适用于小数据量,可跨版本,缺点是慢且恢复时间长。

  • 全量备份:
    mysqldump -u root -p --all-databases --single-transaction --master-data=2 > /backup/full_$(date +%Y%m%d).sql
    
  • 定期备份建议结合cron。

2.2 物理备份(Percona XtraBackup)
适用于大数据量,支持热备份,不影响业务。

  • 安装:
    apt install percona-xtrabackup-80 -y
    
  • 全量备份:
    xtrabackup --backup --target-dir=/backup/base --datadir=/data/mysql/mysql3306/data
    
  • 准备(应用日志):
    xtrabackup --prepare --target-dir=/backup/base
    
  • 恢复(停止MySQL,覆盖datadir):
    systemctl stop mysql   # 或 kill mysqld进程
    rm -rf /data/mysql/mysql3306/data/*
    xtrabackup --copy-back --target-dir=/backup/base
    chown -R mysql:mysql /data/mysql/mysql3306/data
    # 启动MySQL
    

2.3 binlog增量恢复
当全量备份之后发生误操作,可通过binlog前滚或回滚。

  • 查看binlog列表:
    SHOW BINARY LOGS;
    
  • 使用 mysqlbinlog 解析:
    mysqlbinlog /data/mysql/mysql3306/logs/mysql-bin.000012 --start-datetime="2026-07-20 10:00:00" --stop-datetime="2026-07-20 11:00:00" | mysql -u root -p
    

2.4 备份策略建议

  • 每天凌晨全量备份(xtrabackup)
  • 每小时增量备份(xtrabackup --incremental)
  • binlog实时归档到远程服务器

3. 慢查询分析与优化

配置中已开启慢查询日志(long_query_time=0.5),记录超过0.5秒的SQL。

3.1 查看慢查询日志

tail -f /data/mysql/mysql3306/logs/slow.log

3.2 使用 mysqldumpslow 汇总

# 按平均查询时间排序,取前10
mysqldumpslow -s at -t 10 /data/mysql/mysql3306/logs/slow.log

# 按总耗时排序
mysqldumpslow -s t -t 5 /data/mysql/mysql3306/logs/slow.log

3.3 使用 pt-query-digest(Percona Toolkit)进行深度分析

# 安装
apt install percona-toolkit -y
# 分析
pt-query-digest /data/mysql/mysql3306/logs/slow.log > /tmp/slow_report.txt

3.4 使用 EXPLAIN 分析执行计划

EXPLAIN SELECT * FROM users WHERE age > 20 AND status = 1;

关键列解释:

  • type:访问类型,从好到差依次为 system > const > eq_ref > ref > range > index > ALL(ALL需优化)
  • possible_keys:可能使用的索引
  • key:实际使用的索引
  • rows:预估扫描行数
  • Extra:额外信息,如 Using index(覆盖索引)、Using filesort(需优化)、Using temporary(需优化)

3.5 索引优化建议

  • 为频繁作为WHERE条件的列创建索引
  • 联合索引注意顺序(左前缀原则)
  • 避免在索引列上使用函数或计算
  • 使用 SHOW INDEX FROM table_name; 查看现有索引

4. 二进制日志(binlog)管理

4.1 查看当前binlog状态

SHOW MASTER STATUS;   -- 当前正在写入的日志文件及位置
SHOW BINARY LOGS;     -- 列出所有binlog文件

4.2 刷新binlog(生成新文件)

FLUSH LOGS;

4.3 清除过期binlog(配置中已设 expire_logs_days=7)

  • 手动清除指定文件:
    PURGE BINARY LOGS TO 'mysql-bin.000010';
    
  • 按时间清除:
    PURGE BINARY LOGS BEFORE '2026-07-13 00:00:00';
    

4.4 使用 mysqlbinlog 恢复数据

  • 查看binlog内容:
    mysqlbinlog /data/mysql/mysql3306/logs/mysql-bin.000012
    
  • 基于位置恢复:
    mysqlbinlog --start-position=123 --stop-position=456 mysql-bin.000012 | mysql -u root -p
    
  • 基于时间恢复:
    mysqlbinlog --start-datetime="2026-07-20 08:00:00" --stop-datetime="2026-07-20 09:00:00" mysql-bin.000012 | mysql -u root -p
    

5. 性能监控

5.1 使用 Performance Schema
MySQL 8.0 默认启用 performance_schema

  • 查看当前活跃事务:
    SELECT * FROM performance_schema.threads WHERE PROCESSLIST_STATE IS NOT NULL;
    
  • 查看锁等待信息:
    SELECT * FROM performance_schema.data_locks;
    SELECT * FROM performance_schema.data_lock_waits;
    

5.2 使用 sys 库(更方便)

-- 查看消耗CPU/IO的TOP SQL
SELECT * FROM sys.statement_analysis ORDER BY total_latency DESC LIMIT 10;

-- 查看当前锁等待
SELECT * FROM sys.innodb_lock_waits;

-- 查看内存使用情况
SELECT * FROM sys.memory_global_total;

5.3 实时监控工具

  • mysqladmin 命令:
    mysqladmin -u root -p status   # 显示简略状态
    mysqladmin -u root -p extended-status | grep -i connections
    
  • 第三方监控:Prometheus + mysqld_exporter,或Zabbix。

6. 常用运维命令(mysqlbinlog、mysqladmin等)

  • mysqladmin(用于管理MySQL服务器)

    mysqladmin -u root -p shutdown        # 关闭MySQL
    mysqladmin -u root -p reload          # 重新加载权限表
    mysqladmin -u root -p flush-logs      # 刷新日志(生成新binlog)
    mysqladmin -u root -p variables       # 显示系统变量
    mysqladmin -u root -p processlist     # 显示进程列表
    
  • mysqlbinlog(处理二进制日志)

    mysqlbinlog --verbose mysql-bin.000012   # 显示SQL注释
    mysqlbinlog --base64-output=DECODE-ROWS  # 解析行事件为SQL
    
  • mysqlcheck(表维护)

    mysqlcheck -u root -p --all-databases --auto-repair   # 检查并修复所有表
    
  • mysqlslap(压力测试工具)

    mysqlslap -u root -p --concurrency=100 --iterations=5 --auto-generate-sql
    

7. 高可用架构简介

在生产环境中,单点故障不可接受,通常需要构建高可用集群。

  • MySQL Group Replication (MGR):原生支持的多主或单主模式,具备自动选主、故障转移功能。
  • InnoDB Cluster:基于MGR和MySQL Router的官方高可用解决方案,易于部署和管理。
  • 第三方方案:如ProxySQL + MGR、Orchestrator、Galera Cluster等。

本教程未展开这些,但作为进阶知识,建议您后续深入研究,构建真正企业级的数据库架构。

八、MySQL参数详解

以下是my3306.cnf中核心参数的详细说明:

参数 说明 推荐值
basedir MySQL安装根目录 /usr/local/mysql
datadir 数据文件存放目录 独立数据盘
socket Unix套接字文件路径 与datadir同盘
server_id 实例唯一ID(主从复制必需) 1-65535唯一
port 服务端口 3306(默认)
innodb_buffer_pool_size InnoDB缓存池大小 物理内存的50%-70%
max_connections 最大并发连接数 根据业务调整
wait_timeout 非交互连接超时(秒) 60-300
binlog_format 二进制日志格式 ROW(推荐)
gtid_mode 启用GTID复制 ON
expire_logs_days binlog保留天数 7-30
slow_query_log 开启慢查询日志 ON
long_query_time 慢查询阈值(秒) 0.5-2

调优建议innodb_buffer_pool_size是MySQL性能最关键的参数,建议设置为物理内存的70%左右。生产环境中应根据实际业务负载逐步调整。

文章结尾

至此,这篇Ubuntu安装MySQL教程已带你完整走完了从环境准备、二进制包下载、目录规划、配置文件编写、数据库初始化到启动验证的全流程。通过通用二进制包方式部署MySQL 8.0.45,你不仅获得了版本自主可控的灵活性,还建立了一套符合生产环境规范的目录结构和配置体系。

回顾这篇Ubuntu安装MySQL教程的核心要点:

  • ✅ 使用专用mysql用户运行服务,提升安全性
  • ✅ 采用独立的目录规划/opt/mysql存放软件,/data/mysql存放数据),便于管理和迁移
  • ✅ 配置了GTID复制、慢查询日志、binlog等生产级参数
  • ✅ 使用软连接管理版本,方便未来升级

MySQL 8.0.45作为2026年1月发布的最新稳定版,不仅修复了多个安全漏洞,还将OpenSSL库更新至3.0.18版本,安全性和稳定性都得到了充分保障。无论你是用于开发测试还是生产环境,这套Ubuntu安装MySQL教程的方案都值得信赖。

如果在安装过程中遇到任何问题,欢迎在评论区留言交流。后续还可以继续深入探讨MySQL的性能调优、高可用架构(MGR/InnoDB Cluster)等进阶话题。别忘了收藏这篇Ubuntu安装MySQL教程,下次部署时直接照着做,省时又省心!

posted @ 2026-07-20 19:55  DB哥  阅读(32)  评论(0)    收藏  举报