jcloude/press/utils/database.py
2025-12-23 19:17:16 +08:00

66 lines
1.8 KiB
Python

from __future__ import annotations
def find_db_disk_info(df_output: str) -> tuple[int, int] | None:
"""
> df --output=source,size,used,target | tail -n +2
/dev/root 9982728 6428268 /
/dev/nvme1n1p1 30297152 19780948 /opt/volumes/mariadb
"""
data_disk_available = False
if "/opt/volumes/mariadb" in df_output:
data_disk_available = True
for line in df_output.strip().split("\n"):
if not data_disk_available and not (
"/dev/root" in line or "/dev/sda1" in line or "/dev/vda1" in line or "/dev/xvda1" in line
):
continue
if data_disk_available and "/opt/volumes/mariadb" not in line:
continue
parts = line.split()
if len(parts) < 3:
continue
return int(parts[1]), int(parts[2])
return None
def parse_du_output_of_mysql_directory(du_output: str) -> dict[str, int]: # noqa: C901
"""
161392 /var/lib/mysql/_cc7c51c2a5c9f230
12M /var/lib/mysql/ibtmp1
140M /var/lib/mysql/mysql
101M /var/lib/mysql/mysql-bin.000452
"""
size_info = {}
for line in du_output.strip().split("\n"):
size_str, path = line.split(maxsplit=1)
size_info[path] = int(size_str)
data = {
"schema": {},
"bin_log": 0,
"slow_log": 0,
"error_log": 0,
"core": 0,
"other": 0,
}
for path, size in size_info.items():
if not path.startswith("/var/lib/mysql"):
continue
file = path[len("/var/lib/mysql/") :] # Remove the base path
if file.startswith("mysql-bin"):
data["bin_log"] += size
elif file.startswith("mysql-slow.log"):
data["slow_log"] += size
elif file.startswith("mysql-error.log"):
data["error_log"] += size
elif file in ["ibdata1", "ib_logfile0", "ibtmp1", "aria_log_control"] or file.startswith("aria_log."):
data["core"] += size
elif file.startswith("_") or file in ["mysql", "performance_schema", "sys", "percona"]:
data["schema"][file] = size
else:
data["other"] += size
return data