การคำนวณการใช้พื้นที่ดิสก์ต่อฐานข้อมูล MySQL


28

ขณะนี้ฉันกำลังใช้ data_schema.TABLES เพื่อคำนวณการใช้พื้นที่ดิสก์ทั้งหมดที่จัดกลุ่มตามชื่อฐานข้อมูล แต่กำลังทำงานช้ามาก บนเซิร์ฟเวอร์ที่มีฐานข้อมูลนับร้อยอาจใช้เวลาในการคำนวณนาที

วิธีที่เร็วที่สุดในการคำนวณการใช้พื้นที่ดิสก์ด้วยฐานข้อมูลคืออะไร ฉันควรจะดูที่ระบบไฟล์หรือไม่ มีวิธีในการเร่งความเร็ว data_schema หรือไม่

คำตอบ:


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

คุณสามารถใช้คำสั่งนี้เพื่อรับข้อมูลเป็น GB:

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)

ปรับคำตอบจากAaron Brownให้มีขนาดเป็น GB ดูคำตอบของ Aaron Brownสำหรับรายละเอียดเพิ่มเติม

หรือหากต้องการรวมพื้นที่ว่าง / เรียกคืนได้ให้ใช้:

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" ของ trusty นี่คือตัวอย่างของฉันที่พบว่าพื้นที่ทั้งหมดกำลังถูกกลืนกิน

$ 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

โฟลเดอร์นั้นมีตารางข้อมูล เพื่อที่จะดูว่าตารางใดใช้พื้นที่ทั้งหมดคุณสามารถดำเนินการเช่นนี้ได้โดยใช้ตัวเลือก "มนุษย์" หรือ "-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

คุณจะเห็นว่าพื้นที่ทั้งหมดกำลังถูก hogged โดยตารางไม่กี่ตัวที่เก็บข้อมูลจำนวนมากของ GiG หวังว่านี่จะช่วยได้


0

ฉันจะมองหาขนาดของไฟล์ในพจนานุกรมข้อมูลของคุณ มันทันทีและถูกต้อง

คำเตือน : ตามเอนจิ้นการจัดเก็บดัชนีจะถูกจัดเก็บไว้ในไฟล์หลักหรือในไฟล์อื่นอย่าลืมที่จะสรุปผลรวมหากจำเป็น


2
ใช่ แต่นั่นอยู่ที่ไหน
Magne

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;

เนื่องจาก DB ของฉันคือ InnoDB นี่เป็นเพียงการประมาณการ

ฉันเปรียบเทียบผลลัพธ์นี้กับ:

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

หวังว่านี่จะช่วยคุณได้


0

ดีที่สุด (หลังจากทำapt-get install ncdu):

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

เพื่อรับขนาดทั้งหมดของฐานข้อมูล Mysql ใน VPS ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.