在我的服务器中,Db 占用了太多空间:
Filesystem Size Used Avail Use% Mounted on
/dev/root 58G 58G 461M 100% /
tmpfs 966M 0 966M 0% /dev/shm
tmpfs 387M 856K 386M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/nvme0n1p15 105M 6.1M 99M 6% /boot/efi
tmpfs 194M 4.0K 194M 1% /run/user/1000
当我调查它时,我发现/var/lib/mysql
占据这个空间的人是:
ncdu 1.15.1 ~ Use the arrow keys to navigate, press ? for help
--- /var/lib
50.6 GiB [##########] /mysql
801.2 MiB [ ] /snapd
138.4 MiB [ ] /apt
90.1 MiB [ ] /mecab
39.4 MiB [ ] /dpkg
3.8 MiB [ ] /ubuntu-advantage
我尝试调查占用太多空间的是什么。所有数据库都为 wordpress 网站提供服务,因此我无法过多地修改架构。
但是我检查了数据库大小:
SELECT table_schema AS "Database", SUM(data_length + index_length) / 1024 / 1024 AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema;
+--------------------+--------------+
| Database | Size (MB) |
+--------------------+--------------+
| blog1 | 166.00000000 |
| information_schema | 0.00000000 |
| mysql | 2.76562500 |
| performance_schema | 0.00000000 |
| blog2 | 31.79687500 |
| sys | 0.01562500 |
+--------------------+--------------+
6 rows in set (0.35 sec)
它们都是相对较小的数据库。那么,/var/lib/mysql 到底怎么会占用太多空间呢?
该设置只是一个带有 mysql 的 LEMP 堆栈,没有复制。
编辑1
我查看了一下/var/lib/mysql
,发现有很多 binlog 记录:
sudo du -sk /var/lib/mysql
53151572 /var/lib/mysql
$ sudo ls -l /var/lib/mysql | wc -l
623
# I susspect 653 lines would be too much if pasted here
$ sudo ls -l /var/lib/mysql | grep binlog | head
-rw-r----- 1 mysql mysql 43170892 Jun 4 00:00 binlog.000233
-rw-r----- 1 mysql mysql 35975939 Jun 5 00:00 binlog.000234
-rw-r----- 1 mysql mysql 36153241 Jun 6 00:00 binlog.000235
-rw-r----- 1 mysql mysql 37148526 Jun 7 00:00 binlog.000236
-rw-r----- 1 mysql mysql 34947871 Jun 8 00:00 binlog.000237
-rw-r----- 1 mysql mysql 34058129 Jun 9 00:00 binlog.000238
-rw-r----- 1 mysql mysql 36786212 Jun 10 00:00 binlog.000239
-rw-r----- 1 mysql mysql 34790230 Jun 11 00:00 binlog.000240
-rw-r----- 1 mysql mysql 37634381 Jun 12 00:00 binlog.000241
-rw-r----- 1 mysql mysql 35801131 Jun 13 00:00 binlog.000242
$ sudo ls -l /var/lib/mysql | grep binlog | wc -l
545
# 545 lines are binlog files therefore I have binlogs
我已经找到了一种缓解该问题的方法:
$ cat /etc/mysql/mysql.conf.d/rj.cnf
# Added by Rick James
[mysqld]
log_bin = # turn off
binlog_expire_logs_seconds = 86400 # 1 day
max_binlog_size = 1 # 100M
我做到了:
mysql> SHOW BINARY LOGS;
PURGE BINARY LOGS BEFORE '2023-07-30 00:00:00';
Query OK, 0 rows affected, 1 warning (0.01 sec)
但是文件仍然在不断填满,如果我使用它们或者以某种方式可以告诉 binlog 存储在 /dev/null 中/var/lib/mysql
会安全吗?rm -rf
答案1
为了解决此问题,请执行以下操作:
去除/etc/mysql/mysql.conf.d/rj.cnf
rm -rf /etc/mysql/mysql.conf.d/rj.cnf
创建一个新的配置/etc/mysql/mysql.conf.d/no-binlog.cnf
并添加以下配置:
[mysqld]
disable_log_bin
然后做:
sudo service mysql restart
然后使用命令连接mysql
并运行:
RESET MASTER
这将解决您的问题。假设不使用复制,例如拥有一台具有典型 LAMP 或 LEMP 堆栈的服务器。(例如个人服务器)
之所以
原因是你有一些mysql在复制时使用的日志文件。这些日志文件是从binlog生成的,可以随着时间的推移而累积。
在我们的方法中,我们由于缺乏复制而禁用这种类型的日志记录。
答案2
但是,如果你没有任何复制以及您的备份/恢复计划不依赖于 bin 日志,那么你可以简单地限制历史记录保留或关闭二进制日志总的来说。看来 bin 日志是这个问题的根源。但故事还不止于此。
已删除的记录
根据 MySQL 数据的配置方式,它很少会释放之前用于已删除记录的磁盘空间。它会重新使用该空间来存储新记录。
恢复空间最简单的方法是进行转储/恢复。
WordPress 的
Wordpress 本身还不错。但它确实有一个庞大的插件生态系统,质量参差不齐。我见过很多安装,其中对数据库的写入(数量级)比读取要多。比这些插件存储大量数据更糟糕的是,它们通常使用 Wordpress 表来存储数据 - 因此您可以卸载插件,但永远无法删除数据。