統(tǒng)計每個庫每個表的大小是數(shù)據(jù)治理的其中最簡單的一個要求,本文將從抽樣統(tǒng)計結(jié)果及精確統(tǒng)計結(jié)果兩方面來統(tǒng)計MySQL的每個庫每個表的數(shù)據(jù)量情況。
1、統(tǒng)計預(yù)估數(shù)據(jù)量
mysql數(shù)據(jù)字典庫information_schema里記錄了統(tǒng)計的預(yù)估數(shù)據(jù)量(innodb引擎表不準(zhǔn)確,MyISAM引擎表準(zhǔn)確)及數(shù)據(jù)大小、索引大小及表碎片的大小等信息。
如果想了解每個庫及表的大概數(shù)據(jù)量級,可以直接查information_schema.tables進行統(tǒng)計即可。例如:
SELECT table_schema,table_name,table_rows,data_length+index_length+ data_free data_size
FROM information_schema.`TABLES` WHERE table_schema IN ('db1','db2');
其中data_size單位為B
如上文所述,統(tǒng)計信息里的數(shù)據(jù)條數(shù)及size是根據(jù)部分?jǐn)?shù)據(jù)抽樣統(tǒng)計的值,與實際大小存在差異,且表越大,差異越明顯,如果想知道每張表的實際情況,需用后續(xù)的方法。
2、統(tǒng)計實際數(shù)據(jù)量
想要統(tǒng)計每張表的實際大小就得去遍歷每個表算出對的記錄數(shù),通過查看表空間大?。總€表獨立表空間)查看每個表的size。通過以下步驟即可達(dá)到精確統(tǒng)計的目的。
創(chuàng)建路徑
創(chuàng)建一個工作路徑,保存腳本及臨時文件等
mkdir -p /usr/local/data_size
創(chuàng)建統(tǒng)計庫及表
在需要統(tǒng)計的數(shù)據(jù)庫實例上創(chuàng)建統(tǒng)計庫
SQL> create database bak_db;
創(chuàng)建統(tǒng)計的存儲過程
SQL> use bak_db;
SQL>CREATE PROCEDURE `p_db_size`()
BEGIN
DECLARE v_id INT;
DECLARE v_maxid INT;
DECLARE v_tbname VARCHAR(50);
DECLARE v_dbname VARCHAR(50);
DECLARE v_sql_upd VARCHAR(200);
SET v_id =(SELECT MIN(id) FROM bak_db.tb_size);
SET v_maxid =(SELECT MAX(id) FROM bak_db.tb_size);
WHILE v_id =v_maxid
DO
SET v_tbname = (SELECT tbname FROM bak_db.tb_size WHERE id=v_id);
SET v_dbname = (SELECT dbname FROM bak_db.tb_size WHERE id=v_id);
SET v_sql_upd = CONCAT('update bak_db.tb_size set tb_rows=(select count(*) from ',v_dbname,".",v_tbname,") where id=",v_id);
SET @v_sql_upd := v_sql_upd;
PREPARE stmt FROM @v_sql_upd;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt;
SET v_id = v_id +1;
END WHILE;
END;
創(chuàng)建腳本
vim data.sh
/* 插入如下內(nèi)容*/
#! /bin/bash
cd /usr/local/data_size
du -s /data/mysql/mysql3306/data/db1/* |grep -v ".frm" |grep -v ".opt" >/usr/local/data_size/data_size
du -s /data/mysql/mysql3306/data/db2/* |grep -v ".frm" |grep -v ".opt">>/usr/local/data_size/data_size
# 后面4步是拼接成sql
awk '{print "insert into bak_db.tb_size(size,tb_route)values("""$0}' /usr/local/data_size/data_size >/usr/local/data_size/data_size1
awk '{print $0";"}' /usr/local/data_size/data_size1 >/usr/local/data_size/data_size.sql
sed -i "s#\t#,'#g" /usr/local/data_size/data_size.sql
sed -i "s#;#');#g" /usr/local/data_size/data_size.sql
# 創(chuàng)建統(tǒng)計表
/usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "drop table if exists bak_db.tb_size;CREATE TABLE IF NOT EXISTS bak_db.tb_size ( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT ,size INT,tb_route VARCHAR(200),tbname VARCHAR(50),dbname VARCHAR(50),tb_rows INT(11));"
# 導(dǎo)入數(shù)據(jù)
/usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "use bak_db;truncate table bak_db.tb_size;source /usr/local/data_size/data_size.sql;"
# 生成庫名及表名,當(dāng)然該步驟也可以從數(shù)據(jù)字段中獲取
/usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "use bak_db;UPDATE bak_db.tb_size SET tbname=REPLACE(SUBSTRING_INDEX(tb_route,'/',-1),'.ibd','');"
/usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "UPDATE bak_db.tb_size SET dbname=LEFT (SUBSTRING_INDEX(tb_route,'/',-2),INSTR(SUBSTRING_INDEX(tb_route,'/',-2),'/')-1);"
sleep 10 # 如果之前的步驟在主庫金學(xué)習(xí)學(xué)習(xí),則建議暫停一段時間 以免后面統(tǒng)計的時候無法獲得表及內(nèi)容,如果前面的步驟都在從庫,則可以省略該步驟
echo 'start call procedure'
# 調(diào)用存儲過程 統(tǒng)計每個表的記錄條數(shù)
/usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.132 -e "use bak_db;call bak_db.p_db_size();"
# 把表及數(shù)據(jù)導(dǎo)出
/usr/local/mysql5.7/bin/mysqldump -uroot -p'Test#123456' -h 192.168.28.132 --single-transaction bak_db tb_size >/usr/local/data_size/tb_size.sql
# 將表及結(jié)果導(dǎo)入主庫(從庫相當(dāng)于刪除在重建了一次)
/usr/local/mysql5.7/bin/mysql -uroot -p'Test#123456' -h 192.168.28.128 -e "use bak_db;source /usr/local/data_size/tb_size.sql;"
結(jié)果如下:
可以看出精確值與統(tǒng)計信息里的值差異還是很大的,且表越大 差異越明顯。
TIPS: 本文精確統(tǒng)計的腳本還有許多優(yōu)化空間,寫的比較倉促,大家可以按需自行調(diào)整,水平有限,歡迎斧正。如有問題,歡迎與我溝通。
以上就是實例講解MySQL統(tǒng)計庫表大小的詳細(xì)內(nèi)容,更多關(guān)于MySQL統(tǒng)計庫表大小的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- 概述MySQL統(tǒng)計信息
- 一個Shell小腳本精準(zhǔn)統(tǒng)計Mysql每張表的行數(shù)實現(xiàn)
- mysql實現(xiàn)多表關(guān)聯(lián)統(tǒng)計(子查詢統(tǒng)計)示例
- Python實現(xiàn)Mysql數(shù)據(jù)統(tǒng)計及numpy統(tǒng)計函數(shù)
- sqlserver/mysql按天、按小時、按分鐘統(tǒng)計連續(xù)時間段數(shù)據(jù)【推薦】
- 詳解mysql 獲取某個時間段每一天、每一個小時的統(tǒng)計數(shù)據(jù)
- PHP+MySQL實現(xiàn)對一段時間內(nèi)每天數(shù)據(jù)統(tǒng)計優(yōu)化操作實例
- php 廣告點擊統(tǒng)計代碼(php+mysql)
- MySQL 8.0統(tǒng)計信息不準(zhǔn)確的原因