Ответ
Размер БД можно определить через системные запросы СУБД или проверку файлов на диске. Способ зависит от типа базы данных.
1. Через SQL-запросы (JDBC):
PostgreSQL:
String sql = "SELECT pg_database_size(current_database());"; // Размер текущей БД в байтах
// Или для конкретной БД:
// SELECT pg_database_size('my_database_name');
try (Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
if (rs.next()) {
long sizeInBytes = rs.getLong(1);
System.out.println("Database size: " + sizeInBytes + " bytes");
}
}
MySQL / MariaDB:
-- Суммарный размер всех таблиц в БД
SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size_MB"
FROM information_schema.tables
WHERE table_schema = DATABASE();
2. Для встраиваемых/файловых БД (H2, SQLite): Можно измерить размер файла(ов) БД средствами Java NIO:
import java.nio.file.*;
Path dbPath = Paths.get("./database.mv.db"); // Файл H2
long fileSize = Files.size(dbPath); // Размер в байтах
System.out.println("DB file size: " + fileSize + " bytes");
// Для SQLite обычно один файл .db или .sqlite
3. Практическое замечание:
Размер БД в запросе (pg_database_size) обычно включает данные, индексы, но может не включать служебные файлы (WAL, временные файлы). Полный размер на диске может быть больше. Для точной оценки в production-среде также стоит учитывать:
- Размер логов транзакций.
- Пространство, зарезервированное для авторасширения (autoextend).
- Сжатие данных, если оно используется.
Ответ 18+ 🔞
Да ты посмотри, какие извращения приходится вытворять, чтобы просто узнать, сколько места твоя база данных сожрала! Прямо как в анекдоте про Герасима — всё молчит, а потом бац, и выясняется, что она у тебя уже на три терабайта раздулась, блядь.
Ну ладно, слушай сюда, разбираемся по порядку, как нормальные люди.
1. Через SQL-запросы (JDBC):
Тут всё просто, как три копейки. Подключаешься к своей СУБД и спрашиваешь её вежливо, но настойчиво.
PostgreSQL: Он, сука, прямолинейный. Спросил — получил. Только не забудь, что размер в байтах вернёт, это ж овердохуища цифр может быть.
String sql = "SELECT pg_database_size(current_database());"; // Размер текущей БД в байтах
// Или для конкретной БД:
// SELECT pg_database_size('my_database_name');
try (Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
if (rs.next()) {
long sizeInBytes = rs.getLong(1);
System.out.println("Database size: " + sizeInBytes + " bytes");
}
}
MySQL / MariaDB: А эти хитрые жопы информацию по кусочкам хранят. Придётся самому всё суммировать, как последний бухгалтер.
-- Суммарный размер всех таблиц в БД
SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size_MB"
FROM information_schema.tables
WHERE table_schema = DATABASE();
2. Для встраиваемых/файловых БД (H2, SQLite): А вот это, блядь, моя любимая история. Тут вообще всё примитивно, как палка. База — это просто файл на диске. Ну или два. Берёшь и меряешь линейкой, то есть, средствами Java.
import java.nio.file.*;
Path dbPath = Paths.get("./database.mv.db"); // Файл H2
long fileSize = Files.size(dbPath); // Размер в байтах
System.out.println("DB file size: " + fileSize + " bytes");
// Для SQLite обычно один файл .db или .sqlite
3. Практическое замечание:
А вот тут, ёпта, начинается самое интересное. Тот размер, который тебе любезно сообщит pg_database_size — это как вес человека без одежды, блядь. А на деле-то он в шубе, в валенках и с арбузом под мышкой!
То есть, это данные и индексы, грубо говоря. Но есть же ещё:
- Логи транзакций (WAL) — эти журналы-доносы могут раздуться так, что мама не горюй.
- Место под авторасширение — база уже заранее отжала себе кусок диска, как жадный ребёнок тарелку с пирожками.
- Сжатие — если оно есть, то на диске одно, а внутри — совсем другое, понимаешь?
Так что в продакшене, если тебе нужно точное число «сколько жрёт прямо сейчас», смотри на файлы. А если «сколько данных внутри», то доверяй запросам. И не путай, а то подозрение ебать чувствую, что перепутаешь.