
有个朋友上周找我,说他网站慢得像蜗牛,让我帮忙看看。
登上去一查,CPU正常,内存够用,磁盘不忙。最后看数据库——好家伙,好几张表几十万条数据,连个索引都没建。查询全是全表扫描,不慢才怪。
我问他:你平时怎么维护数据库的?
他愣了一下:维护?不就装上去能用就行了吗?
这是他,也是很多人。数据库这东西,大家都觉得“能用就行”,直到崩了才开始学。其实数据库没那么玄乎,就是个存数据的地方,但你对它好一点,它就对你好一点。
今天从头捋一遍,MySQL(或者它的孪生兄弟 MariaDB)怎么装、怎么配、日常该干点啥。不讲高深原理,只说用得上的。
MySQL 还是 MariaDB?
这俩什么关系?MySQL 被 Oracle 收了之后,原班人马出来另立山头,搞了 MariaDB。用法一模一样,命令通用,连配置文件都差不多。
区别在哪?MariaDB 更新更激进,新功能上得快;MySQL 更稳重,Oracle 在背后撑着。个人站长、小公司用哪个都行,你熟悉哪个就用哪个。
本文以 MySQL 为例,MariaDB 用户照搬命令基本都能跑。
安装:比你想的简单
Ubuntu/Debian 装 MySQL:
bash
apt update apt install mysql-server -y
CentOS/RHEL 装 MariaDB(默认源里是 MariaDB):
bash
yum install mariadb-server -y
装完启动:
bash
systemctl start mysql # Ubuntu systemctl start mariadb # CentOS systemctl enable mysql # 开机自启
然后跑一个安全脚本,这一步千万别跳:
bash
mysql_secure_installation
它会让你:设置 root 密码、删除匿名用户、禁止 root 远程登录、删除测试库。一路 y 下来就行。
反常识提醒:很多人装完数据库就不管了,root 空密码、允许远程、测试库留着。这就像你家门没锁,还贴张纸条“欢迎光临”。
基础配置:别用默认配置跑生产
配置文件在哪?Ubuntu 一般在 /etc/mysql/my.cnf,CentOS 在 /etc/my.cnf。用 vim 打开,改这几个地方:
1. 字符集
默认字符集不是 utf8mb4,存表情(emoji)会变问号。加在 [mysqld] 下面:
ini
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
2. 允许远程连接
默认只允许本地访问(bind-address = 127.0.0.1)。如果想从别的机器连,把这行注释掉,或者改成 0.0.0.0:
ini
# bind-address = 127.0.0.1 bind-address = 0.0.0.0
注意:允许远程有风险,配合防火墙和强密码使用。
3. 慢查询日志
以后排查问题用得上。加在 [mysqld] 下:
ini
slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2
执行超过 2 秒的 SQL 会被记下来。
改完重启:
bash
systemctl restart mysql
常用命令:增删改查和用户权限
登录数据库:
bash
mysql -u root -p
输密码,进去之后看到 mysql> 提示符。
查看所有数据库:
sql
SHOW DATABASES;
创建数据库:
sql
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
创建用户并授权:
sql
-- 创建用户(只允许本地登录) CREATE USER 'myuser'@'localhost' IDENTIFIED BY '复杂密码'; -- 给用户某库的所有权限 GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES;
如果想允许远程登录,把 localhost 改成 %(所有 IP)或具体 IP。
退出:
sql
EXIT;
日常维护:这些事定期做
数据库不是装完就一劳永逸的。每个月(或者每周)花十分钟做这几件事,能少踩很多坑。
1. 查看数据库大小
sql
SELECT table_schema,
ROUND(SUM(data_length+index_length)/1024/1024,2) AS size_mb
FROM information_schema.tables
GROUP BY table_schema;
看看哪个库在疯狂膨胀。
2. 查看慢查询日志
bash
tail -100 /var/log/mysql/slow.log
找出执行慢的 SQL,看看是不是忘了加索引。
3. 查看当前连接
sql
SHOW PROCESSLIST;
如果有几百个 Sleep 进程,可能是连接没释放,需要调整程序或数据库配置。
4. 备份(最重要的一条)
用 mysqldump 备份:
bash
mysqldump -u root -p --all-databases > backup_$(date +%Y%m%d).sql
恢复:
bash
mysql -u root -p < backup_20260319.sql
写个脚本,放 crontab 里每天自动跑。
常见问题:遇上了别慌
1. 忘记 root 密码
停掉数据库,用跳过权限表的方式启动:
bash
systemctl stop mysql mysqld_safe --skip-grant-tables & mysql -u root
进去之后改密码:
sql
FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
重启正常模式。
2. 远程连接不上
三步排查:
- 防火墙放行 3306 端口了吗?
- 配置文件里
bind-address改了吗? - 用户允许远程登录吗?(
'user'@'%')
3. 导入大文件报错
默认限制 16M,改配置文件:
ini
[mysqld] max_allowed_packet = 128M
重启生效。
4. 磁盘满了
数据库会直接挂掉,连不上。所以磁盘监控很重要(之前的文章讲过)。
入门级优化:不用成为 DBA 也能做
1. 加索引
这是性价比最高的优化。经常作为查询条件的字段(比如用户名、订单号),加上索引:
sql
CREATE INDEX idx_username ON users(username);
没索引的查询是灾难。
**2. 避免 SELECT ***
只查需要的字段,别 SELECT *。数据量大时差很多。
3. 用 EXPLAIN 看查询计划
sql
EXPLAIN SELECT * FROM users WHERE username='admin';
看到 type=ALL 就是全表扫描,该加索引了。
4. 调几个关键参数
innodb_buffer_pool_size 是 InnoDB 的缓存池,设成内存的 70% 左右。在配置文件里加:
ini
[mysqld] innodb_buffer_pool_size = 2G # 假设内存 4G
重启生效。
数据库没你想的那么难
那天帮朋友加了几个索引,网站速度从 3 秒降到 0.3 秒。他感叹:原来数据库也要伺候啊。
我说:不是伺候,是互相尊重。你定期看看它,给它建建索引、做做备份,它就给你好好干活。你不理它,它早晚给你脸色看。
数据库没那么神秘,就是个存数据的仓库。但仓库需要打扫,需要整理,需要知道什么东西放哪。
今天这篇帮你入了门。接下来就是在用中学,慢慢你会发现,数据库其实挺听话的——你对它好,它对你好。




