Как определить размер базы данных программно?

Ответ

Размер БД можно определить через системные запросы СУБД или проверку файлов на диске. Способ зависит от типа базы данных.

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) — эти журналы-доносы могут раздуться так, что мама не горюй.
  • Место под авторасширение — база уже заранее отжала себе кусок диска, как жадный ребёнок тарелку с пирожками.
  • Сжатие — если оно есть, то на диске одно, а внутри — совсем другое, понимаешь?

Так что в продакшене, если тебе нужно точное число «сколько жрёт прямо сейчас», смотри на файлы. А если «сколько данных внутри», то доверяй запросам. И не путай, а то подозрение ебать чувствую, что перепутаешь.