Infobright/MySQL 统计实用工具 (C++)






4.91/5 (5投票s)
在 C++ 中显示 Infobright/MySQL 数据库统计信息
介绍
这个 C++ 程序连接到 Infobright 数据库,并显示其统计信息(大小、压缩大小、压缩率等),包括特定数据库中的数据库和表。该代码也可用于 MySQL 数据库。
注意:您可能需要删除压缩部分,因为 MySQL 没有其数据库的压缩率。
此程序的目的是为用户提供一些关于如何使用 C++、Infobright 数据库和 MySQL 的简单代码。
所需软件
- Windows 用户:带有 g++ 和数据库软件包的 Cygwin
- Linux 用户:g++、mysql-client 和 MySQL 开发库
- Infobright 或 MySQL 数据库
运行可执行文件
源代码中有两种文件。可执行文件适用于 Windows 用户;二进制文件适用于 Linux 用户。
对于Windows 用户,请在 Cygwin 中运行该文件,命令如下:
./databases_windows [选项]
对于Linux 用户,请在终端中运行该程序,命令如下:
./databases_linux [选项]
选项与 mysql 命令几乎相同
- -u 用户名
- -P 端口 (注意:这是大写的 'P')
- -h 主机名
- -p (注意:此标志不接受任何参数。如果使用,程序将要求输入密码。)
未指定选项将使用默认选项。
- 用户名:root
- 密码:空
- 端口:5029
- 主机:127.0.0.1
即,对于Windows 用户
./databases_windows -h 127.0.0.1
对于Linux 用户
./databases_linux -h 127.0.0.1
注意:如果您在输入命令后看到“Permission denied
”(权限被拒绝),您可能需要执行此操作来授予程序权限:
chmod +x databases_windows 和/或 chmod +x databases_linux
这是数据库的统计信息
这是特定数据库中表的统计信息
编辑源代码
如果您想查看/编辑源代码,我们已经包含了一个编译脚本。
对于Linux 用户,您需要 g++、mysql-client 和 MySQL 开发库。
Ubuntu:sudo apt-get install g++ mysql-client libmysqlclient-dev
CentOS:sudo yum install gcc-c++ mysql-client mysql-devel
对于Windows 用户,请安装 Cygwin
http://www.cygwin.com/install.html
下载setup.exe,然后按照步骤安装 gcc 和其他软件包。
详细的安装过程请参见此处:
http://www.mcclean-cooper.com/valentino/cygwin_install/
注意:在选择软件包时,至少选择以下软件包:
(1) Admin
(2) Database
(3) Devel
(4) Libs
(5) System
(6) Math
(7) Shells
分析代码
现在我们来分析一些源代码。首先,main
函数会请求参数并连接到您选择的数据库。如果您在命令行中输入“-?”或“--help”,则会调用 show_help_screen
函数并在屏幕上显示命令选项和默认设置。
在我们显示数据库和表的统计信息之前,我们需要将统计信息保存在内存中,因为这样以后获取这些值会更容易。我个人倾向于使用链表作为数据结构。database_linked_list
是用于创建此类链表的函数。
链表的结构如下所示:
struct table_stat {
string table_name;
double table_size;
double table_raw;
double table_compression;
table_stat * table_next;
};
struct data_stat {
string data_name;
double compressed_size;
double raw_size;
double compression;
data_stat * next;
table_stat * mytable;
};
显然,table_stat
用于表统计信息,data_stat
用于数据库统计信息。每个 table_stat
都有一个指向其 table_stat
列表的指针,以及另一个指向下一个 data_stat
的指针。最后一个 table_stat
和 data_stat
指向 NULL
,以告知这是列表的最后一个块。
下图显示了这些列表之间的链接关系
此外,total_raw
、total_compressed
和 total_ratio
被用作全局变量,以便保存整个数据库的原始总大小、压缩总大小和压缩总比率。
不幸的是,您从数据库获取的统计信息是字符串形式的,这意味着数字是以字符而不是特定数字的形式保存的。因此,我们需要一个额外的步骤,我称之为 string_to_double
,它的作用就像字面意思一样,将类型从字符串转换为双精度浮点数。
代码如下:
double string_to_double (string num){
double return_result = 0.0;
//first we want to find the '.'
int i = 0;
int no_dot = 0;
while (num[i] != '.'){
if (num[i] == '\0'){
no_dot = 1;
break;
}
i++;
}
int dot = i;
i--;
double temp = 1;
for (int j = i; j>= 0; j--){
return_result = return_result + (((double)num[j])-48)*temp;
temp = temp * 10;
}
dot++;
temp =10;
if (no_dot == 0){
while (num[dot] != '\0'){
return_result = return_result + (((double)num[dot])-48)/temp;
dot++;
temp =temp * 10;
}
}
return return_result;
}
创建数据结构后,我们最后需要使用 show_table
和 show_data_stat
这两个函数将统计信息显示在屏幕上。最终结果显示在上图所示。
当输入“exit”时,我们需要调用 mysql_free_result
和 mysql_close
这两个函数来关闭数据库。此外,由于我们为链表分配了一些内存空间,我们还需要删除这些内存以避免内存泄漏。因此,调用 delete_linked_list
来完成此操作。
有用查询
在从 MySQL 获取数据时,我们需要使用一些查询来帮助我们获取特定信息。以下是一些我在本项目中使用过的查询。
此查询列出了每个数据库的大小(以 MB 为单位):
SELECT table_schema, sum( data_length + index_length ) / 1024 / 1024 'Data Base Size in MB',TABLE_COMMENT
FROM information_schema.TABLES
WHERE ENGINE = 'BRIGHTHOUSE'
GROUP BY table_schema;
此查询显示当前安装的 DBMS 的版本show variables like 'version_comment';
此查询显示名为 test
的数据库的表统计信息:
USE test;
SHOW TABLE STATUS WHERE ENGINE='BRIGHTHOUSE';
注意:上面的查询是针对 Infobright 数据库的。如果您想获取 InnoDB 或 MyISAM 数据库的统计信息,请从查询中删除“where Engine='BRIGHTHOUSE'”。
历史
最新版本同时包含 Linux 和 Windows 用户的版本。具体使用方法如上所示以及在 README.txt 文件中。
结论
此代码旨在作为构建数据库统计应用程序的起点。鼓励您修改代码以满足您的具体需求。