在Java中获取MYSQL数据库大小

7

我的MYSQL表格有3个表。

我无法使给出的示例工作。

Java中,使用java.sql.*,我想知道整个数据库还剩下多少空间,因为空间非常有限。

以下是我的方法:

// this.conn = DriverManager.getConnection("jdbc:mysql://......");

public long remainingSpace() {
    String sql = "SELECT table_schema AS \"Database\", "
        + "ROUND(SUM(data_length + index_length) / 1024, 2) AS \"Size (KB)\" "
        + "FROM information_schema.TABLES GROUP BY table_schema;";
    ResultSet rs;
    PreparedStatement prpSttm = this.conn.prepareStatement(sql);
    rs = prpSttm.executeQuery();
    rs.next();
    long remainingSpace = rs.getInt("Size (KB)");
    return remainingSpace;
}

这个返回 9 (KB)。

phpMyAdmin告诉我我一个表里有64 KiB的数据: Table size according to phpMyAdmin

我该如何在Java中获取正确的大小?

2个回答

4

您只是显示了ResultSet返回的第一个数据库的大小,您的DBMS中可能有更多的数据库(有一些默认系统数据库)。 您应该使用while循环。

while (rs.next()) {
    System.out.println(rs.getString("Database") " | " + rs.getString("Size (KB)"));
}

*根据我的经验,信息模式(information_schema)数据库的默认大小通常为约9KB。

**由于此查询按字母顺序返回数据库,我猜测您的数据库名称以大于等于i的字母开头;因此,如果您将数据库重命名为以'a'开头的名称,那么令人惊讶的是您的代码将会起作用 :) :)


这个有效!给定的代码片段对我输出了以下内容:information_schema | 9.00 sql560710 | 96.00 谢谢! - phil294

1
您的Java程序只读取了ResultSet中的一行。但是您的查询为服务器上每个不同的数据库(模式)生成一行。您可能正在报告其他数据库的信息。最好读取该ResultSet的所有行。
注意:MySQL的磁盘空间耗尽可能是灾难性的。您真的不想完全用完磁盘空间。如果您明智,您将留下至少几GB的余地。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接