1. 为什么选择MySQL作为数据库入门
在Linux环境下搭建第一个数据库时,我强烈推荐从MySQL开始。这个开源关系型数据库已经有25年历史,最新8.0版本在性能上比5.7版本提升了2倍以上。作为LAMP堆栈中的"M",它支撑着全球超过30%的网站后台,包括YouTube、Twitter等顶级应用。
初学者常问:为什么不选SQLite或PostgreSQL?SQLite虽然轻量但缺乏多用户管理能力,而PostgreSQL的高级功能对新手反而成了负担。MySQL恰好处在中间位置——功能完备但学习曲线平缓,社区文档丰富,遇到问题容易找到解决方案。
2. 环境准备与安装
2.1 选择Linux发行版
我在Ubuntu 22.04 LTS上做演示,这个长期支持版本会持续更新到2027年。其他主流发行版的安装命令略有不同:
- CentOS/RHEL:
sudo yum install mysql-server - Debian:
sudo apt install mariadb-server(注:Debian默认用MariaDB替代)
重要提示:生产环境强烈建议使用官方二进制包或Docker部署,本文为教学目的使用系统仓库版本
2.2 安装MySQL服务器
bash复制sudo apt update
sudo apt install mysql-server -y
安装完成后检查服务状态:
bash复制sudo systemctl status mysql
正常应该看到"active (running)"的绿色提示。如果没自动启动,手动执行:
bash复制sudo systemctl start mysql
sudo systemctl enable mysql
3. 初始安全配置
3.1 运行安全向导
MySQL安装后默认存在安全风险,必须运行:
bash复制sudo mysql_secure_installation
你会遇到几个关键配置项:
- 密码强度验证插件(建议启用)
- 设置root密码(至少12位含大小写数字符号)
- 移除匿名用户(必须选Y)
- 禁止root远程登录(生产环境必选)
- 移除测试数据库(建议移除)
- 立即重载权限表(选Y)
3.2 创建专用管理用户
永远不要用root账户日常操作,应该创建专属管理员:
sql复制CREATE USER 'dba_admin'@'localhost' IDENTIFIED BY 'ComplexP@ssw0rd!';
GRANT ALL PRIVILEGES ON *.* TO 'dba_admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
4. 基础数据库操作
4.1 连接MySQL
使用新建的管理账户登录:
bash复制mysql -u dba_admin -p
4.2 创建第一个数据库
sql复制CREATE DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
这里使用utf8mb4字符集支持完整的Unicode(包括emoji),比老旧的utf8更推荐。
4.3 建表示范
创建学生表:
sql复制USE school;
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age TINYINT UNSIGNED,
gender ENUM('M','F','O'),
enrollment_date DATE DEFAULT (CURRENT_DATE),
INDEX idx_name (name)
) ENGINE=InnoDB;
关键设计要点:
- 自增主键是InnoDB表的标配
- TINYINT UNSIGNED适合0-255范围的年龄
- ENUM类型约束性别输入
- 默认值使用当前日期
- 为name字段建立索引提高查询速度
5. 数据基本操作
5.1 CRUD操作示例
插入数据:
sql复制INSERT INTO students (name, age, gender)
VALUES ('张三', 18, 'M'),
('李四', 19, 'F');
查询数据:
sql复制-- 基础查询
SELECT * FROM students WHERE age > 18;
-- 带排序和限制
SELECT name, enrollment_date FROM students
ORDER BY enrollment_date DESC LIMIT 10;
更新数据:
sql复制UPDATE students SET age = 20 WHERE name = '张三';
删除数据:
sql复制DELETE FROM students WHERE id = 2;
5.2 事务处理
MySQL默认自动提交事务,重要操作应该手动控制:
sql复制START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE user_id = 1;
UPDATE account SET balance = balance + 100 WHERE user_id = 2;
COMMIT;
-- 如果出错可以执行 ROLLBACK;
6. 备份与恢复
6.1 基础备份方法
使用mysqldump工具:
bash复制mysqldump -u dba_admin -p school > school_backup.sql
6.2 定时自动备份
创建备份脚本/usr/local/bin/mysql_backup.sh:
bash复制#!/bin/bash
DATE=$(date +%Y%m%d)
mysqldump -u dba_admin -p'ComplexP@ssw0rd!' school > /backups/school_$DATE.sql
find /backups -name "school_*.sql" -mtime +30 -delete
添加到crontab每天凌晨执行:
bash复制0 3 * * * /usr/local/bin/mysql_backup.sh
7. 性能优化入门
7.1 慢查询日志
在/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 = 1
重启服务后分析慢查询:
bash复制mysqldumpslow -s t /var/log/mysql/mysql-slow.log
7.2 基础索引优化
为经常查询的字段添加索引:
sql复制ALTER TABLE students ADD INDEX idx_age (age);
使用EXPLAIN分析查询:
sql复制EXPLAIN SELECT * FROM students WHERE age > 18;
8. 常见问题解决
8.1 连接数问题
错误提示"Too many connections"时,临时解决方案:
sql复制SET GLOBAL max_connections = 200;
永久修改需在配置文件中设置:
ini复制max_connections = 200
8.2 密码重置
如果忘记root密码:
- 停止MySQL服务
- 启动时跳过权限检查:
bash复制sudo mysqld_safe --skip-grant-tables &
- 无密码登录后修改密码:
sql复制FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
9. 进阶学习建议
掌握基础后可以继续深入:
- 学习数据库规范化设计(三大范式)
- 研究存储引擎区别(InnoDB vs MyISAM)
- 实践主从复制配置
- 了解分库分表策略
- 学习使用Percona Toolkit等运维工具
我建议新手从《MySQL必知必会》开始,然后过渡到《高性能MySQL》。实际工作中遇到问题时,MySQL官方文档永远是第一手参考资料。