Розрахунок використання дискового простору на базу даних 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.