it-swarm.asia

حساب استخدام مساحة القرص لكل MySQL DB

أستخدم حاليًا information_schema.TABLES لحساب إجمالي استخدام مساحة القرص مجمعة حسب اسم قاعدة البيانات ، ولكنها تعمل ببطء شديد. على الخوادم التي تحتوي على مئات قواعد البيانات ، قد يستغرق الحساب دقائق.

ما هي أسرع طريقة لحساب استخدام مساحة القرص من خلال قاعدة البيانات؟ هل يجب أن أنظر إلى نظام الملفات؟ هل هناك طريقة لتسريع المعلومات؟

29
GoldenNewby

هناك 3 سيناريوهات.

  1. إذا كنت تستخدم MyISAM ، فمن الأسهل أن تنظر إلى نظام الملفات وتستخدم du -sh /var/lib/mysql/database.
  2. إذا كنت تستخدم InnoDB مع innodb_file_per_table مجموعة ، فيمكنك الحصول على إجابة تقريبية باستخدام du -sh. إنه تقريبي لأنه لا يزال هناك بعض البيانات المخزنة في ملف ibdata1 ، لذلك ستكون قليلًا في الجانب المنخفض. تعمل هذه التقنية أيضًا مع مختلط MyISAM/InnoDB (innodb_file_per_table) قواعد بيانات.
  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)

إذا كان لديك عدد كبير جدًا من الجداول ، فقد تكون بطيئة ، كما اكتشفت بالفعل.

50
Aaron Brown

يمكنك استخدام هذا الأمر للحصول على معلومات بالغيغابايت:

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؟ لمزيد من التفاصيل.

4
user9269906

لكي أرى مكان استخدام مساحة القرص (بغض النظر عما إذا كانت موجودة في جدول 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

يمكنك أن ترى أن معظم المساحة المستخدمة من قبل هذا المجلد./الخلية

يحتوي هذا المجلد على جداول البيانات. لمعرفة الجداول التي تشغل كل المساحة ، يمكنك المتابعة باستخدام هذا الخيار "بشرية" أو "-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. أتمنى أن يساعدك هذا.

1
Russell Lego

للحصول على معلومات حول اسم الجدول وعدد السجلات الموجودة به ، يمكن استخدام الاستعلام أدناه ،

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
Mathew

سأبحث عن حجم الملف في قاموس البيانات الخاص بك. لحظي ودقيق.

تحذير: وفقًا لمحرك التخزين ، يتم تخزين الفهارس داخل الملف الرئيسي أو في ملف آخر ولا تنسَ تلخيصها إذا لزم الأمر.

0
Spredzy

أعلم أن هذا قديم ولكن قد يجد شخص ما هذا ملائمًا.

في 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
AJinSD

الأفضل (بعد القيام apt-get install ncdu):

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

للحصول على الحجم الكلي لقواعد بيانات Mysql في VPS الخاص بك.

0
T.Todua