刚刚看到这篇文章,对不起,但评论不是很有用,所以决定给出一个答案,分享我在我的一个 mySQL 服务器上的内容。
不是每个人都跟踪它自己的数据库增长,但实施起来并不难。这个想法是每周或根据您的需要从 INFORMATION_SCHEMA.TABLES 中简单地捕获表统计信息。
首先,您在单独的架构或您喜欢的任何架构下创建一个表。
#
# Use stats_db for the default schema for this tool
#
USE stats_db;
#
# CREATE TABLE table_growth_history
#
DROP TABLE IF EXISTS `table_growth_history` ;
CREATE TABLE `table_growth_history`
(
`DATE` date not null
,
`TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT ''
,
`TABLE_NAME` varchar(64) NOT NULL DEFAULT ''
,
`ENGINE` varchar(64) DEFAULT NULL
,
`TABLE_ROWS` bigint(21) unsigned DEFAULT NULL
,
`DATA_LENGTH` bigint(21) unsigned DEFAULT NULL
,
`INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL
,
`DATA_FREE` bigint(21) unsigned DEFAULT NULL
,
`AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL
,
PRIMARY KEY(DATE,TABLE_SCHEMA,TABLE_NAME)
,
KEY(TABLE_SCHEMA,TABLE_NAME)
)
ENGINE=INNODB DEFAULT CHARSET=utf8;
然后添加插入脚本。您也可以使用 cronjob,但我更愿意使用 MySQL EVENT 调度程序:
#
# MySQL EVENT to add table stats for our new history table
#
DELIMITER ;;
CREATE
EVENT IF NOT EXISTS `get_table_growth_history`
ON SCHEDULE EVERY 1 WEEK
STARTS CURRENT_DATE + INTERVAL 7 - WEEKDAY(CURRENT_DATE) DAY
ON COMPLETION PRESERVE ENABLE
DO BEGIN
INSERT INTO
stats_db.table_growth_history
SELECT
DATE(NOW())
,
TABLE_SCHEMA
,
TABLE_NAME
,
ENGINE
,
TABLE_ROWS
,
DATA_LENGTH
,
INDEX_LENGTH
,
DATA_FREE
,
AUTO_INCREMENT
FROM
INFORMATION_SCHEMA.TABLES;
END ;;
DELIMITER ;
这将为下周一创建一个事件,然后每个周一将在表中插入数据。根据您的需要更改日期
现在您想要的是表数据增长的月度报告,您可以使用此查询来获取,一旦完成 1 个月的数据捕获,您就可以运行它:
-- get dates
select distinct `date` from stats_db.table_growth_history order by `date` desc limit 1 INTO @this_week ;
set @last_month := @this_week - interval 4 week ;
-- pivot table
SET @report_monthly = NULL;
SET @report_monthly
= CONCAT('select table_schema,table_name,
max(case when date = @last_month then round(((data_length + index_length) / 1024 / 1024), 2) end) as `last_month__',@last_month,'`,
max(case when date = @this_week then round(((data_length + index_length) / 1024 / 1024), 2) end) as `current_week__',@this_week,'`,
(max(case when date = @this_week then round(((data_length + index_length) / 1024 / 1024), 2) end) -
max(case when date = @last_month then round(((data_length + index_length) / 1024 / 1024), 2) end)
) as data_grow
from stats_db.table_growth_history t
where date in (@last_month , @this_week)
group by table_name');
PREPARE stmt FROM @report_monthly;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
您也可以根据需要更改时间范围。
您将拥有服务器中所有数据库的规格和大小。