linux数据库存满了怎么办
linux数据库存满了怎么办详细介绍
当 Linux 系统中数据库存储满时,可按以下步骤排查和解决问题:
第一步:确认存储空间使用情况
- 查看磁盘整体占用
使用df -h命令查看各分区的磁盘使用情况,重点关注数据库所在分区(如/var/lib/mysql或/data/db)的Use%列,确认是否已接近 100%。
bash - 定位大文件 / 目录
进入数据库数据目录(如 MySQL 默认在/var/lib/mysql,MongoDB 在/data/db),使用du -sh *命令按大小排序,快速找到占用空间大的文件(如日志、表数据、备份文件)。
bash/var/lib/mysql*
第二步:针对性清理空间
根据定位到的大文件类型,选择以下方法清理:
1. 数据库日志文件
数据库的事务日志(如 MySQL 的 ib_logfile*、PostgreSQL 的 pg_xlog)或慢查询日志可能占用大量空间。
- 临时清理:
- MySQL:通过
FLUSH LOGS;命令生成新日志文件,并删除旧日志(需确保日志已归档或无用)。 - PostgreSQL:使用
pg_resetwal工具(需谨慎,可能导致数据丢失,仅在集群崩溃时使用)。
- MySQL:通过
- 长期优化:调整日志保留策略(如缩短日志保留时间、限制日志文件大小)。
2. 无用数据或表
- 删除过期数据:通过 SQL 语句删除不再需要的历史记录(如
DELETE FROM old_table WHERE create_time < '2023-01-01';)。 - 归档大表:将大表数据迁移到历史库或冷存储(如通过
CREATE TABLE archive_table AS SELECT * FROM old_table;后删除原表)。
3. 临时文件 / 未提交事务
- 数据库临时表(如 MySQL 的
#sql_*文件)或未提交的事务可能占用空间。- 检查是否有长事务:MySQL 执行
SHOW FULL PROCESSLIST;查看是否有状态为Waiting for commit的长时间事务,手动终止(KILL [线程ID])。 - 清理临时文件:重启数据库服务(如
systemctl restart mysql),自动删除未提交的临时文件。
- 检查是否有长事务:MySQL 执行
第三步:扩展存储空间(临时 / 长期)
若清理后空间仍不足,需扩展存储:
- 临时方案:挂载新磁盘并挂载到数据库目录(需注意文件系统权限)。bash
/var/lib/mysql_backup
/var/lib/mysql/* /var/lib/mysql_backup/
mkfs.ext4 /dev/sdb1
/dev/sdb1 /var/lib/mysql
/var/lib/mysql_backup/* /var/lib/mysql/
- 长期方案:扩容原磁盘(通过云平台或物理存储扩容),并调整文件系统大小(如
resize2fs /dev/sda1)。
第四步:监控与预防
为避免再次发生,建议设置监控:
- 使用
cron定期清理日志或过期数据(如每周执行一次find /var/log/mysql -name "*.log" -mtime +7 -delete清理 7 天前的日志)。 - 配置磁盘告警(如通过
monit或Prometheus+Grafana监控磁盘使用率,阈值设为 80%)。
注意:操作前务必备份关键数据,避免因误删导致数据丢失!涉及数据库核心文件(如日志、数据文件)的修改,建议在业务低峰期执行,并暂停写入操作。