Расчет использования дискового пространства для БД MySQL


28

В настоящее время я использую information_schema.TABLES для расчета общего использования дискового пространства, сгруппированного по имени базы данных, но он работает ужасно медленно. На серверах с сотнями баз данных вычисление может занять несколько минут.

Какой самый быстрый метод расчета использования дискового пространства базой данных? Должен ли я просто смотреть на файловую систему? Есть ли способ ускорения информационная_схема?

Ответы:


46

Есть 3 сценария.

  1. Если вы используете MyISAM, проще всего просто посмотреть на файловую систему и использовать du -sh /var/lib/mysql/database.
  2. Если вы используете InnoDB с установленным innodb_file_per_table , вы можете получить приблизительный ответ, используя du -sh. Он приблизительный, потому что в файле ibdata1 все еще хранятся некоторые данные, поэтому вы будете немного ниже. Этот метод также работает со смешанными innodb_file_per_tableбазами данных MyISAM / InnoDB ( ).
  3. Если вы используете InnoDB без innodb_file_per_table set, то вам нужно взглянуть на INFORMATION_SCHEMA.

В любом из указанных выше случаев вы можете выполнить следующий запрос, чтобы получить информацию, которую вы ищете.

mysql> select table_schema, sum((data_length+index_length)/1024/1024) AS MB from information_schema.tables group by 1;
+--------------------+-----------------+
| table_schema       | MB              |
+--------------------+-----------------+
| prod               | 298025.72448921 |
| information_schema |      0.00781248 |
| maatkit            |     70.77330779 |
| mysql              |      0.66873168 |
| test               |   4752.31449127 |
+--------------------+-----------------+
5 rows in set (0.01 sec)

Если у вас очень большое количество таблиц, оно может быть медленным, как вы уже обнаружили.


Я видел где-то еще, что вариант 3 не учитывает размеры VARCHAR.
Джо

3

Вы можете использовать эту команду для получения информации в ГБ:

mysql> select table_schema "DB name (table_schema)", 
sum((data_length+index_length)/1024/1024/1024) AS "DB size in GB" from 
information_schema.tables group by table_schema;
+-------------------------------------+-----------------+
| table_schema DB name (table_schema) | DB size in GB   |
+-------------------------------------+-----------------+
| prod                                |     29.72448921 |
| information_schema                  |      0.00781248 |
| miscDB                              |      0.77330779 |
| mysql                               |      0.66873168 |
| test                                |     47.31449127 |
+-------------------------------------+-----------------+
5 rows in set (0.01 sec)

Адаптировал ответ от Аарона Брауна, чтобы обеспечить размер в ГБ. Смотрите ответ Аарона Брауна для более подробной информации.

ИЛИ, чтобы включить свободное / возвращаемое пространство, используйте:

mysql> SELECT table_schema "database name",
sum( data_length + index_length ) / 1024 / 1024 "database size in MB",
sum( data_free )/ 1024 / 1024 "free reclaimable space in MB"
FROM information_schema.TABLES
GROUP BY table_schema; 

+--------------------+---------------+------------------------------+
| DB name            | DB size in GB | free/reclaimable space in GB |
+--------------------+---------------+------------------------------+
| prod               |          1.26 |                         0.03 |
| information_schema |         38.77 |                         3.75 |
| miscDB             |          0.00 |                         0.00 |
| mysql              |          0.00 |                         0.00 |
| test               |          0.00 |                         0.00 |
+--------------------+---------------+------------------------------+

Пространство может быть восстановлено с помощью команды OPTIMIZE TABLE для таблиц InnoDB, MyISAM и ARCHIVE.

Смотрите также Как получить истинный размер базы данных MySQL? Больше подробностей.


1

Для получения информации об имени таблицы и количестве записей в ней можно использовать следующий запрос:

SELECT * 
FROM information_schema.TABLES ;

Для получения информации о базах данных на серверах с соответствующим размером можно использовать следующий запрос:

SELECT 
TABLE_SCHEMA  AS `Database`,
SUM((data_length + index_length) / (1024 * 1024)) AS `Database_Size`
FROM information_schema.TABLES 
GROUP BY table_schema 
ORDER BY `Database_Size` DESC;

1

Для того, чтобы я мог видеть, где используется дисковое пространство (независимо от того, находится ли оно в таблице MySQL или нет), я использую свою команду «du». Вот пример того, как я обнаружил, где все пространство съедается.

$ sudo du -cks /* | sort -rn
954881224   total
945218092   /mysql
5299904 /usr
1781376 /opt
1166488 /var
671628  /home
343332  /run
213400  /root
93476   /lib
30784   /boot
20652   /etc
15940   /bin
13708   /sbin
12388   /tmp
24  /mnt
16  /lost+found
4   /srv
4   /snap
4   /media
4   /lib64
0   /vmlinuz
0   /sys
0   /proc
0   /initrd.img
0   /dev

Вы можете видеть, что большая часть пространства используется этой папкой. / MySQL

Эта папка содержит таблицы данных. Чтобы увидеть, какие таблицы занимают все пространство, вы можете действовать следующим образом, используя опцию «human» или «-h». Мне нравится делать управление дисковым пространством таким образом, потому что иногда вы даже не можете войти в MySQL, потому что вы не знаете пароль или пользователя.

$ sudo du -chs /mysql/*
2.3M    /mysql/blacklist
18M /mysql/clientservices
2.5G    /mysql/data
4.0K    /mysql/doubleverify
137G    /mysql/ias
4.0K    /mysql/IAS
2.2G    /mysql/innodb
16K /mysql/lost+found
4.0K    /mysql/ml_centroids
16G /mysql/moat
4.0K    /mysql/test
4.0K    /mysql/tmp
4.0K    /mysql/var
282G    /mysql/verticaAdFees
4.0K    /mysql/verticaViewability
247G    /mysql/Whiteops
217G    /mysql/Whiteops_TLX
902G    total

Вы можете видеть, что все пространство заполнено несколькими таблицами, содержащими много данных GiG. Надеюсь это поможет.


0

Я бы посмотрел размер файла в вашем словаре данных. Это мгновенно и точно.

Предупреждение : в соответствии с механизмом хранения, индексы хранятся в главном файле или в другом файле, не забудьте суммировать их при необходимости.


2
Да, но где это?
Магн

0

Я знаю, что это старо, но кто-то может найти это уместным.

В MySQL я использую:

SELECT concat(table_schema) 'Database Name',
concat(round(SUM(data_length/power(1024,3)),2),'G') DATA,
concat(round(SUM(index_length/power(1024,3)),2),'G') 'INDEX',
concat(round(SUM(data_free/power(1024,3)),2),'G') 'DATA FREE',
concat(round(sum(data_free)/(SUM(data_length+index_length))*100,2)) '% FRAGMENTED',
concat(round(SUM(data_length+index_length)/power(1024,3),2),'G') TOTAL
FROM information_schema.TABLES
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
GROUP BY table_schema;

Так как моя БД - InnoDB, это только оценка.

Я сравниваю этот вывод с:

du -sch /location/of_Mysql/* | sort -hr | head -n20

Надеюсь, это поможет вам


0

Лучший (после выполнения apt-get install ncdu):

cd "/var/lib/mysql" && ncdu

чтобы получить весь общий размер баз данных Mysql в вашем VPS.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.