MySQL / PostgreSQL 初始化:装好之后的十件事
数据库装好默认状态是「能用但不该上生产」。这篇记装完之后必做的配置,以及日常最常用的运维命令。
一、安装与安全初始化
# MySQL
sudo apt install -y mysql-server
sudo mysql_secure_installation
# PostgreSQL
sudo apt install -y postgresql
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'strong-password';"mysql_secure_installation 会引导你做:设 root 密码、删匿名用户、禁止 root 远程登录、删 test 库。全部选 Y。
二、建库建用户(别用 root 跑应用)
# MySQL:最小权限原则
mysql -u root -pCREATE DATABASE baize_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'baize'@'localhost' IDENTIFIED BY 'strong-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON baize_db.* TO 'baize'@'localhost';
FLUSH PRIVILEGES;# PostgreSQL
sudo -u postgres createuser baize -P
sudo -u postgres createdb baize_db -O baize字符集一定要
utf8mb4(不是utf8,MySQL 的 utf8 是残的,存不了 emoji)。
三、配置文件要点
MySQL /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
bind-address = 127.0.0.1 # 只监听本机,要远程再改
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 小内存机器:默认配置可能吃掉 400M+
innodb_buffer_pool_size = 128M
max_connections = 50
# 排错必备
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2PostgreSQL 允许远程连接要改两处:
sudo vim /etc/postgresql/16/main/postgresql.conf
# listen_addresses = 'localhost' → '*'
sudo vim /etc/postgresql/16/main/pg_hba.conf
# 加一行:host baize_db baize 10.0.0.0/8 scram-sha-256
sudo systemctl restart postgresql四、必须会的两条备份恢复命令
# MySQL 备份
mysqldump -u root -p --single-transaction --routines --triggers baize_db \
| gzip > db-$(date +%F).sql.gz
# MySQL 恢复
gunzip < db-2026-04-26.sql.gz | mysql -u root -p baize_db
# PostgreSQL 备份
pg_dump -U baize -h localhost baize_db | gzip > pg-$(date +%F).sql.gz
# PostgreSQL 恢复
gunzip < pg-2026-04-26.sql.gz | psql -U baize -d baize_db--single-transaction 很重要:不锁表,备份期间业务照常写。
五、日常运维命令
# MySQL
SHOW PROCESSLIST; # 看当前连接和慢查询
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
EXPLAIN SELECT * FROM posts WHERE id = 1; # 看执行计划
# PostgreSQL
SELECT * FROM pg_stat_activity;
SELECT pg_size_pretty(pg_database_size('baize_db'));
EXPLAIN ANALYZE SELECT * FROM posts WHERE id = 1;六、索引:最便宜的性能优化
# 加索引前后各跑一次 EXPLAIN,对比 rows 和 type
EXPLAIN SELECT * FROM posts WHERE slug = 'abc';
CREATE INDEX idx_posts_slug ON posts(slug);
# 联合索引注意最左前缀
CREATE INDEX idx_posts_cat_date ON posts(category, created_at);常见建议:
WHERE/JOIN/ORDER BY用到的列加索引;- 别给低区分度的列加(比如「性别」只有两个值);
- 索引不是越多越好,每个索引都会拖慢写入;
- 用
EXPLAIN验证,别凭感觉。
七、小内存机器生存指南
1G 内存跑 MySQL 很容易 OOM,几个办法:
innodb_buffer_pool_size调到 128M;- 加 1G swap 兜底(第一篇笔记里写过);
- 或者干脆用 SQLite / PostgreSQL 小配置;
- 定期
mysqlcheck -o baize_db优化表(低峰期做)。
# 看数据库实际占了多少内存
ps aux | grep mysqld | awk '{print $6/1024 " MB"}'如果只是个人博客这种量级(几千行数据),认真考虑一下 SQLite:零配置、零内存开销、备份就是拷文件。等真的需要并发写入再换也不迟。
