1. MySQL在Linux环境中的基础应用
作为最流行的开源关系型数据库,MySQL在Linux服务器上的部署率高达79%(DB-Engines 2023年数据)。不同于Windows环境下的图形化操作,Linux平台更依赖命令行管理,这种操作方式虽然学习曲线陡峭,但能为后续的数据库运维、性能调优打下坚实基础。我在电商平台担任DBA期间,每天都要通过SSH连接处理上百台Linux服务器的MySQL实例,这套命令行工具链的效率远超任何图形界面。
2. 环境准备与安装配置
2.1 主流Linux发行版的安装差异
在Ubuntu/Debian系系统上,推荐使用apt获取官方维护的MySQL版本:
bash复制sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
而RHEL/CentOS则需要先添加MySQL官方仓库:
bash复制sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
sudo yum install mysql-community-server
sudo systemctl enable mysqld
注意:MySQL 8.0默认启用caching_sha2_password加密插件,旧版客户端工具可能无法连接,需在配置文件中添加
default_authentication_plugin=mysql_native_password
2.2 安全初始化关键步骤
安装完成后必须执行安全向导,这个步骤会:
- 删除匿名用户
- 禁用root远程登录
- 移除测试数据库
- 重设root密码
bash复制sudo mysql_secure_installation
典型交互过程示例:
code复制Enter current password for root (enter for none): (直接回车)
Set root password? [Y/n] Y
New password: (输入新密码)
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
3. 核心操作命令详解
3.1 连接服务的三种方式
- 本地Socket连接(无需网络):
bash复制sudo mysql -u root -p
- TCP/IP远程连接(需开放3306端口):
bash复制mysql -h 192.168.1.100 -u admin -p
- 带执行命令的一次性连接:
bash复制mysql -e "SHOW DATABASES;" -u root -p
3.2 数据库管理四部曲
创建并授权新数据库的完整流程:
sql复制CREATE DATABASE web_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON web_app.* TO 'app_user'@'%' IDENTIFIED BY 'Str0ngP@ss';
FLUSH PRIVILEGES;
USE web_app;
实操技巧:使用
SHOW GRANTS FOR 'user'@'host'可验证权限是否生效
3.3 表操作最佳实践
创建包含索引和约束的用户表示例:
sql复制CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
数据操作CRUD示例:
sql复制-- 插入数据(避免SQL注入)
PREPARE stmt FROM 'INSERT INTO users (username, email) VALUES (?, ?)';
SET @uname = 'dev_user', @email = 'dev@example.com';
EXECUTE stmt USING @uname, @email;
-- 查询优化演示
EXPLAIN SELECT * FROM users WHERE email LIKE '%@example.com';
4. 运维管理进阶技巧
4.1 备份恢复方案对比
| 备份方式 | 命令示例 | 适用场景 | 恢复方法 |
|---|---|---|---|
| mysqldump | mysqldump -u root -p db > bak.sql |
小型数据库全量备份 | mysql -u root -p db < bak.sql |
| 二进制日志 | mysqlbinlog /var/log/mysql/mysql-bin.000123 > binlog.sql |
增量恢复 | mysql -u root -p < binlog.sql |
| Percona XtraBackup | xtrabackup --backup --target-dir=/backups/ |
大型数据库热备份 | 需执行prepare和copy-back |
4.2 性能监控关键指标
实时查看查询性能:
sql复制-- 显示运行中的线程
SHOW PROCESSLIST;
-- 查看慢查询配置
SHOW VARIABLES LIKE 'slow_query%';
-- 获取InnoDB状态
SHOW ENGINE INNODB STATUS\G
推荐长期开启的性能日志:
ini复制# /etc/mysql/my.cnf 配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
5. 故障排查手册
5.1 连接问题排查流程
- 检查服务状态:
bash复制systemctl status mysql
- 验证端口监听:
bash复制ss -tulnp | grep 3306
- 检查防火墙规则:
bash复制sudo ufw status verbose
- 查看错误日志:
bash复制sudo tail -50 /var/log/mysql/error.log
5.2 常见错误解决方案
ERROR 1045 (28000): Access denied
- 检查my.cnf中的
skip-grant-tables是否被误启用 - 确认密码包含特殊字符时使用单引号包裹
ERROR 2002 (HY000): Can't connect to local MySQL server
- 确认mysql.sock文件位置:
ps aux | grep mysql - 临时指定sock路径:
mysql --socket=/var/run/mysqld/mysqld.sock
表损坏修复步骤:
bash复制mysqlcheck -u root -p --auto-repair --optimize --all-databases
6. 安全加固建议
- 最小权限原则实施:
sql复制-- 只授予必要权限
GRANT SELECT, INSERT ON db.table TO 'user'@'192.168.1.%';
- 定期密码轮换策略:
sql复制ALTER USER 'webuser'@'%' IDENTIFIED BY 'N3wP@ssw0rd2023';
- 启用SSL加密连接:
bash复制# 检查SSL状态
SHOW VARIABLES LIKE '%ssl%';
# 创建自签名证书(生产环境建议使用CA签发)
sudo mysql_ssl_rsa_setup --uid=mysql
- 审计插件配置:
ini复制[mysqld]
plugin-load-add = audit_log.so
audit_log_format = JSON
audit_log_policy = ALL