
有个朋友上周找我,说他网站慢得像蜗牛,让我帮忙看看。
登上去一查,CPU正常,内存够用,磁盘不忙。最后看数据库——好家伙,好几张表几十万条数据,连个索引都没建。查询全是全表扫描,不慢才怪。
我问他:你平时怎么维护数据库的?
他愣了一下:维护?不就装上去能用就行了吗?
这是他,也是很多人。数据库这东西,大家都觉得“能用就行”,直到崩了才开始学。其实数据库没那么玄乎,就是个存数据的地方,但你对它好一点,它就对你好一点。
今天从头捋一遍,MySQL(或者它的孪生兄弟 MariaDB)怎么装、怎么配、日常该干点啥。不讲高深原理,只说用得上的。
MySQL 还是 MariaDB?
这俩什么关系?MySQL 被 Oracle 收了之后,原班人马出来另立山头,搞了 MariaDB。用法一模一样,命令通用,连配置文件都差不多。
区别在哪?MariaDB 更新更激进,新功能上得快;MySQL 更稳重,Oracle 在背后撑着。个人站长、小公司用哪个都行,你熟悉哪个就用哪个。
本文以 MySQL 为例,MariaDB 用户照搬命令基本都能跑。
安装:比你想的简单
Ubuntu/Debian 装 MySQL:
bash
apt update
apt install mysql-server -yCentOS/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_ci2. 允许远程连接
默认只允许本地访问(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 秒。他感叹:原来数据库也要伺候啊。
我说:不是伺候,是互相尊重。你定期看看它,给它建建索引、做做备份,它就给你好好干活。你不理它,它早晚给你脸色看。
数据库没那么神秘,就是个存数据的仓库。但仓库需要打扫,需要整理,需要知道什么东西放哪。
今天这篇帮你入了门。接下来就是在用中学,慢慢你会发现,数据库其实挺听话的——你对它好,它对你好。