2008-10-08 2 views

ответ

26

У меня есть некоторые большие большие запросы, чтобы поделиться:

Выполнить это, чтобы получить Использование Total MySQL данных и индекса По хранилищ

SELECT IFNULL(B.engine,'Total') "Storage Engine", 
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM 
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize, 
SUM(data_length+index_length) TSize FROM 
information_schema.tables WHERE table_schema NOT IN 
('mysql','information_schema','performance_schema') AND 
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B, 
(SELECT 3 pw) A ORDER BY TSize; 

Выполнить это, чтобы получить Использование Total MySQL данных и индексирование страниц База данных

SELECT DBName,CONCAT(LPAD(FORMAT(SDSize/POWER(1024,pw),3),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size",CONCAT(LPAD(
FORMAT(SXSize/POWER(1024,pw),3),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", 
CONCAT(LPAD(FORMAT(STSize/POWER(1024,pw),3),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') "Total Size" FROM 
(SELECT IFNULL(DB,'All Databases') DBName,SUM(DSize) SDSize,SUM(XSize) SXSize, 
SUM(TSize) STSize FROM (SELECT table_schema DB,data_length DSize, 
index_length XSize,data_length+index_length TSize FROM information_schema.tables 
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')) AAA 
GROUP BY DB WITH ROLLUP) AA,(SELECT 3 pw) BB ORDER BY (SDSize+SXSize); 

Выполнить это, чтобы получить Использование Total MySQL данных и упорядочивание по базе данных и хранилищ

SELECT Statistic,DataSize "Data Size",IndexSize "Index Size",TableSize "Table Size" 
FROM (SELECT IF(ISNULL(table_schema)=1,10,0) schema_score, 
IF(ISNULL(engine)=1,10,0) engine_score, 
IF(ISNULL(table_schema)=1,'ZZZZZZZZZZZZZZZZ',table_schema) schemaname, 
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=2,"Storage for All Databases", 
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=1, 
CONCAT("Storage for ",B.table_schema), 
CONCAT(B.engine," Tables for ",B.table_schema))) Statistic, 
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') DataSize,CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') IndexSize, 
CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ', 
SUBSTR(' KMGTP',pw+1,1),'B') TableSize FROM (SELECT table_schema,engine, 
SUM(data_length) DSize,SUM(index_length) ISize, 
SUM(data_length+index_length) TSize FROM information_schema.tables 
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema') 
AND engine IS NOT NULL GROUP BY table_schema,engine WITH ROLLUP) B, 
(SELECT 3 pw) A) AA ORDER BY schemaname,schema_score,engine_score; 

CAVEAT

В каждом запросе, вы увидите (SELECT 3 pw). Pw означает Power Of 1024 для отображения результатов.

  • (SELECT 0 pw) будет отображать отчет в байтах
  • (SELECT 1 pw) будет отображать отчет в килобайтах
  • (SELECT 2 pw) будет отображать отчет в мегабайтах
  • (SELECT 3 pw) будет отображать отчет в гигабайтах
  • (SELECT 4 pw) Покажет Отчет в TeraBytes
  • (SELECT 5 pw) Показать отчет в PetaBytes (пожалуйста свяжитесь со мной, если вы запустите этот)

Вот отчет запроса с немного меньшим количеством форматирования:

SELECT IFNULL(db,'Total') "Database", 
datsum/power(1024,pw) "Data Size", 
ndxsum/power(1024,pw) "Index Size", 
totsum/power(1024,pw) "Total" 
FROM (SELECT db,SUM(dat) datsum,SUM(ndx) ndxsum,SUM(dat+ndx) totsum 
FROM (SELECT table_schema db,data_length dat,index_length ndx 
FROM information_schema.tables WHERE engine IS NOT NULL 
AND table_schema NOT IN ('information_schema','mysql')) AA 
GROUP BY db WITH ROLLUP) A,(SELECT 1 pw) B; 

Поверь мне, я сделал эти запросы более 4 лет назад и до сих пор используют их сегодня.

UPDATE 2013-06-24 15:53 ​​EDT

У меня есть что-то новое. Я изменил запросы, так что вам не нужно устанавливать параметр pw для разных дисплеев устройства. Каждый дисплей устройства рассчитан для вас.

Report By Storage Engine

SELECT 
    IFNULL(ENGINE,'Total') "Storage Engine", 
    LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ', 
    SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size", 
    LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ', 
    SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size", 
    LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ', 
    SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size" 
FROM 
(
    SELECT ENGINE,DAT,NDX,TBL, 
    IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3 
    FROM 
    (SELECT *, 
     FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px, 
     FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py, 
     FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz 
     FROM 
     (SELECT 
      ENGINE, 
      SUM(data_length) DAT, 
      SUM(index_length) NDX, 
      SUM(data_length+index_length) TBL 
     FROM 
     (
      SELECT engine,data_length,index_length FROM 
      information_schema.tables WHERE table_schema NOT IN 
      ('information_schema','performance_schema','mysql') 
      AND ENGINE IS NOT NULL 
     ) AAA GROUP BY ENGINE WITH ROLLUP 
) AAA) AA) A,(SELECT ' BKBMBGBTB' units) B; 

Report По базе данных

SELECT 
    IFNULL(DB,'Total') "Database", 
    LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ', 
    SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size", 
    LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ', 
    SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size", 
    LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ', 
    SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size" 
FROM 
(
    SELECT DB,DAT,NDX,TBL, 
    IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3 
    FROM 
    (SELECT *, 
     FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px, 
     FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py, 
     FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz 
    FROM 
    (SELECT 
     DB, 
     SUM(data_length) DAT, 
     SUM(index_length) NDX, 
     SUM(data_length+index_length) TBL 
    FROM 
    (
     SELECT table_schema DB,data_length,index_length FROM 
     information_schema.tables WHERE table_schema NOT IN 
     ('information_schema','performance_schema','mysql') 
     AND ENGINE IS NOT NULL 
    ) AAA GROUP BY DB WITH ROLLUP 
) AAA) AA) A,(SELECT ' BKBMBGBTB' units) B; 

Сообщить базой данных/Storage Engine

SELECT 
    IF(ISNULL(DB)+ISNULL(ENGINE)=2,'Database Total', 
    CONCAT(DB,' ',IFNULL(ENGINE,'Total'))) "Reported Statistic", 
    LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ', 
    SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size", 
    LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ', 
    SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size", 
    LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ', 
    SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size" 
FROM 
(
    SELECT DB,ENGINE,DAT,NDX,TBL, 
    IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3 
    FROM 
    (SELECT *, 
     FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px, 
     FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py, 
     FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz 
    FROM 
    (SELECT 
     DB,ENGINE, 
     SUM(data_length) DAT, 
     SUM(index_length) NDX, 
     SUM(data_length+index_length) TBL 
    FROM 
    (
     SELECT table_schema DB,ENGINE,data_length,index_length FROM 
     information_schema.tables WHERE table_schema NOT IN 
     ('information_schema','performance_schema','mysql') 
     AND ENGINE IS NOT NULL 
    ) AAA GROUP BY DB,ENGINE WITH ROLLUP 
) AAA) AA) A,(SELECT ' BKBMBGBTB' units) B; 
+0

Возможно, вы должны отредактировать свой вопрос и поставить перед каждой строкой 4 ведущих пространства, которые должны отображаться как код. – 2010-12-18 17:34:38

+0

Есть ли какая-то особая причина для LPAD до 17? – Bee 2013-06-09 10:47:03

4

Если доступен только MySQL, используйте команду SHOW TABLE STATUS и посмотрите столбец Data_length для каждой таблицы, которая находится в байтах.

Если у вас есть другие языки на компьютере, скрипт в любом из них, который работает регулярно (cron), проверяет свободное место на диске или размер каталога базы данных и обновляет вас по электронной почте или иным образом. Есть слишком много вариантов, чтобы предложить конкретное решение - это зависит от вашей ситуации.

0

Для таблиц MyISAM я обычно проверяю размер каталога/var/lib/mysql/mydatabasename /. Таблицы InnoDB используют монолитные файлы, поэтому вам нужно использовать SHOW TABLE STATUS.

0

Поскольку у вас есть VM и вы на самом деле не волнует, как пространство используется, Я думаю, что самый простой способ - проверить размер данных MySQL d л. По умолчанию это /var/lib/mysql. Также будет полезно очистить двоичные журналы mysql (если возможно), прежде чем проверять размер dir данных.

0

Вы можете обратиться MONyog, который имеет Disk Info функция, которая позволяет узнать анализ дискового пространства на уровне сервера, на уровне базы данных и на уровне таблицы

0
du -s /var/lib/mysql/* | sort -nr 

Результат

34128 /var/lib/mysql/db_name1 
33720 /var/lib/mysql/db_name2 
29744 /var/lib/mysql/db_name3 
26624 /var/lib/mysql/db_name4 
16516 /var/lib/mysql/db_name5 

Thsi покажет, как по убыванию в kb

Смежные вопросы