1. 为什么选择Ubuntu + MySQL组合
在Linux发行版中部署数据库服务,Ubuntu和MySQL的组合堪称经典CP。作为长期维护的LTS版本,Ubuntu Server提供了稳定的运行环境,而MySQL作为最流行的开源关系型数据库,二者搭配既能满足开发测试需求,也经得起生产环境考验。
我最早接触这个组合是在2016年维护一个电商后台系统,当时用Ubuntu 16.04 LTS + MySQL 5.7搭建的集群至今仍在稳定运行。这种稳定性来自于:
- Ubuntu的APT包管理机制能确保依赖项完整安装
- MySQL官方为Ubuntu提供专属的.deb安装包
- 两者都有活跃的社区支持,遇到问题容易找到解决方案
提示:虽然MySQL 8.0已是当前主流版本,但部分传统企业仍在使用5.7版本。安装前请确认业务系统对MySQL版本的兼容性要求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的系统准备
2.1 硬件资源检查
在实体机或虚拟机上安装前,建议先执行以下命令检查系统资源:
bash复制free -h # 查看内存(MySQL至少需要2GB)
df -h # 查看磁盘空间(建议预留10GB以上)
lscpu # 查看CPU核心数
对于开发测试环境,最低配置建议:
- 2核CPU
- 2GB内存
- 20GB存储空间
生产环境则需要根据数据量和并发量进行调整,一般建议:
- 4核以上CPU
- 8GB以上内存
- SSD存储(特别是redo log和binlog目录)
2.2 系统更新与依赖安装
首先更新软件包索引并升级现有组件:
bash复制sudo apt update
sudo apt upgrade -y
安装MySQL所需的依赖库:
bash复制sudo apt install -y libaio1 libnuma1 libmecab2
注意:如果之前安装过MySQL但失败,需要先彻底清理残留文件:
bash复制sudo apt purge mysql* sudo rm -rf /etc/mysql /var/lib/mysql sudo apt autoremove
3. MySQL安装方案选择与实施
3.1 官方APT源安装(推荐方案)
MySQL官方为Ubuntu维护了专用软件源,这是最稳定的安装方式:
- 下载官方提供的.deb配置包:
bash复制wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb
- 安装配置包(会弹出版本选择界面):
bash复制sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb
在弹出的界面中选择MySQL 8.0(或需要的版本),Tab键选择OK确认。
- 更新软件源并安装:
bash复制sudo apt update
sudo apt install -y mysql-server
安装过程中会提示设置root密码,建议设置强密码并牢记。
3.2 使用Ubuntu默认仓库安装
如果不需要特定版本,可以使用Ubuntu自带的仓库:
bash复制sudo apt install -y mysql-server
但需要注意:
- 版本可能不是最新的(如Ubuntu 22.04默认安装MySQL 8.0.29)
- 某些高级功能可能被裁剪
- 安全更新会有延迟
3.3 二进制包手动安装
适合需要自定义安装路径或编译参数的高级用户:
- 下载tar包:
bash复制wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz
- 解压并移动到标准位置:
bash复制tar -xvf mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz
sudo mv mysql-8.0.33-linux-glibc2.17-x86_64-minimal /usr/local/mysql
- 创建mysql用户和组:
bash复制sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
- 初始化数据库:
bash复制cd /usr/local/mysql
sudo mkdir mysql-files
sudo chown mysql:mysql mysql-files
sudo chmod 750 mysql-files
sudo bin/mysqld --initialize --user=mysql
这种方式需要手动处理服务注册、环境变量等配置,适合有特殊需求的场景。
4. 安装后的基础配置
4.1 安全加固脚本
MySQL提供了一个交互式安全配置工具:
bash复制sudo mysql_secure_installation
按提示完成以下操作:
- 设置密码强度验证插件
- 修改root密码(如果安装时未设置)
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 立即重载权限表
4.2 服务管理命令
掌握服务控制命令是运维基础:
bash复制sudo systemctl start mysql # 启动
sudo systemctl stop mysql # 停止
sudo systemctl restart mysql # 重启
sudo systemctl status mysql # 查看状态
sudo systemctl enable mysql # 设置开机自启
4.3 配置文件调整
主要配置文件位于/etc/mysql/my.cnf,实际配置被拆分为:
- /etc/mysql/mysql.conf.d/mysqld.cnf(服务端配置)
- /etc/mysql/mysql.conf.d/mysql.cnf(客户端配置)
建议初次部署时调整以下参数:
ini复制[mysqld]
default_authentication_plugin=mysql_native_password # 兼容旧版认证方式
character-set-server=utf8mb4 # 完整UTF-8支持
collation-server=utf8mb4_unicode_ci
max_connections=200 # 根据硬件调整
innodb_buffer_pool_size=1G # 建议为内存的50-70%
修改后需要重启服务生效:
bash复制sudo systemctl restart mysql
5. 数据库连接与基础操作
5.1 本地连接MySQL
使用root账户连接:
bash复制mysql -u root -p
如果出现"Access denied"错误,可能是由于Ubuntu的auth_socket插件认证方式。解决方法是:
bash复制sudo mysql -u root
然后在MySQL命令行执行:
sql复制ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;
5.2 创建新用户和数据库
基本操作流程:
sql复制-- 创建数据库
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户并授权
CREATE USER 'myuser'@'%' IDENTIFIED BY 'complex_password';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%';
FLUSH PRIVILEGES;
安全提示:生产环境建议:
- 使用'myuser'@'specific_ip'限制访问来源
- 避免使用%通配符授权所有主机
- 定期使用ALTER USER修改密码
5.3 基础SQL操作示例
sql复制-- 表操作
USE mydb;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 数据操作
INSERT INTO users (username, email) VALUES ('admin', 'admin@example.com');
SELECT * FROM users WHERE username LIKE 'a%';
UPDATE users SET email='new@example.com' WHERE id=1;
DELETE FROM users WHERE id=1;
6. 性能优化与问题排查
6.1 常用性能查看命令
查看运行状态:
sql复制SHOW STATUS LIKE 'Threads_connected'; -- 当前连接数
SHOW VARIABLES LIKE 'max_connections'; -- 最大连接数
SHOW PROCESSLIST; -- 活动线程
InnoDB引擎状态:
sql复制SHOW ENGINE INNODB STATUS;
6.2 慢查询日志配置
在/etc/mysql/mysql.conf.d/mysqld.cnf中添加:
ini复制slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
然后创建日志文件并重启服务:
bash复制sudo touch /var/log/mysql/mysql-slow.log
sudo chown mysql:mysql /var/log/mysql/mysql-slow.log
sudo systemctl restart mysql
使用mysqldumpslow工具分析:
bash复制sudo mysqldumpslow /var/log/mysql/mysql-slow.log
6.3 常见问题解决方案
连接数耗尽
错误信息:Too many connections
解决方法:
sql复制-- 临时增加
SET GLOBAL max_connections = 300;
-- 永久生效需修改my.cnf
max_connections = 300
内存不足
错误信息:Out of memory
优化方向:
- 增加innodb_buffer_pool_size
- 优化复杂查询
- 添加适当索引
忘记root密码
- 停止MySQL服务:
bash复制sudo systemctl stop mysql
- 以跳过权限表方式启动:
bash复制sudo mysqld_safe --skip-grant-tables &
- 无密码连接并修改密码:
sql复制FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
- 重启正常服务:
bash复制sudo systemctl restart mysql
7. 备份与恢复策略
7.1 使用mysqldump备份
全库备份:
bash复制mysqldump -u root -p --all-databases > full_backup.sql
单库备份:
bash复制mysqldump -u root -p mydb > mydb_backup.sql
定时备份脚本示例(保存为/usr/local/bin/mysql_backup.sh):
bash复制#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/mysql"
mkdir -p $BACKUP_DIR
mysqldump -u root -p'your_password' --all-databases | gzip > "$BACKUP_DIR/full_$DATE.sql.gz"
find $BACKUP_DIR -type f -mtime +7 -delete
添加到crontab每天凌晨执行:
bash复制sudo chmod +x /usr/local/bin/mysql_backup.sh
sudo crontab -e
添加行:
code复制0 3 * * * /usr/local/bin/mysql_backup.sh
7.2 二进制日志增量备份
首先确认binlog已开启(my.cnf中):
ini复制log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 7
max_binlog_size = 100M
定期执行刷新日志并备份:
sql复制FLUSH BINARY LOGS;
恢复时先还原全量备份,再按顺序应用binlog:
bash复制mysqlbinlog /var/log/mysql/mysql-bin.000123 | mysql -u root -p
7.3 物理备份方案
对于大型数据库,可以考虑物理备份:
- 停止MySQL服务:
bash复制sudo systemctl stop mysql
- 直接复制数据文件:
bash复制sudo rsync -av /var/lib/mysql /backup/mysql_data
- 恢复时替换整个/var/lib/mysql目录
重要提示:物理备份期间必须确保数据库服务停止,否则可能导致备份损坏
8. 高可用方案扩展
8.1 主从复制配置
主库配置(my.cnf):
ini复制[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_do_db = mydb # 可选,指定复制哪些库
从库配置:
ini复制[mysqld]
server-id = 2
relay_log = mysql-relay-bin
read_only = 1
在主库创建复制账号:
sql复制CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
查看主库状态:
sql复制SHOW MASTER STATUS;
-- 记录File和Position值
在从库配置复制:
sql复制CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=123456;
START SLAVE;
验证复制状态:
sql复制SHOW SLAVE STATUS\G
-- 确保Slave_IO_Running和Slave_SQL_Running都为Yes
8.2 组复制方案
MySQL Group Replication提供了更高可用性的方案:
- 所有节点配置:
ini复制[mysqld]
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "node1:33061"
group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
group_replication_bootstrap_group=off
- 第一个节点引导组:
sql复制SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
- 其他节点加入组:
sql复制START GROUP_REPLICATION;
8.3 使用MySQL Router
MySQL Router可以实现自动故障转移和读写分离:
安装:
bash复制sudo apt install mysql-router
基本配置(/etc/mysqlrouter/mysqlrouter.conf):
ini复制[routing:read_write]
bind_address = 0.0.0.0
bind_port = 6446
destinations = master1:3306,master2:3306
routing_strategy = round-robin
[routing:read_only]
bind_address = 0.0.0.0
bind_port = 6447
destinations = slave1:3306,slave2:3306
routing_strategy = round-robin
启动服务:
bash复制sudo systemctl start mysqlrouter
