MySQL / PostgreSQL 初始化:装好之后的十件事

数据库装好默认状态是「能用但不该上生产」。这篇记装完之后必做的配置,以及日常最常用的运维命令。

一、安装与安全初始化

bash
# 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 跑应用)

bash
# MySQL:最小权限原则
mysql -u root -p
bash
CREATE 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;
bash
# 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

nginx
[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 = 2

PostgreSQL 允许远程连接要改两处:

bash
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

四、必须会的两条备份恢复命令

bash
# 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 很重要:不锁表,备份期间业务照常写。

五、日常运维命令

bash
# 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;

六、索引:最便宜的性能优化

bash
# 加索引前后各跑一次 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,几个办法:

  1. innodb_buffer_pool_size 调到 128M;
  2. 加 1G swap 兜底(第一篇笔记里写过);
  3. 或者干脆用 SQLite / PostgreSQL 小配置;
  4. 定期 mysqlcheck -o baize_db 优化表(低峰期做)。
bash
# 看数据库实际占了多少内存
ps aux | grep mysqld | awk '{print $6/1024 " MB"}'

如果只是个人博客这种量级(几千行数据),认真考虑一下 SQLite:零配置、零内存开销、备份就是拷文件。等真的需要并发写入再换也不迟。