মাইএসকিউএল ডিবি প্রতি ডিস্ক স্পেসের ব্যবহার গণনা করা হচ্ছে


28

আমি বর্তমানে তথ্য_স্কেমা ব্যবহার করছি am টেবিলগুলি ডাটাবেসের নাম অনুসারে গোষ্ঠীভুক্ত মোট ডিস্ক স্পেসের ব্যবহার গণনা করতে, তবে এটি ভীষণ ধীরে চলছে। শত শত ডাটাবেস সহ সার্ভারে, এটি গণনা করতে কয়েক মিনিট সময় নিতে পারে।

ডাটাবেস দ্বারা ডিস্ক স্পেসের ব্যবহার গণনার দ্রুততম পদ্ধতি কী? আমার কি কেবল ফাইল সিস্টেমের দিকে তাকানো উচিত? তথ্য_চেমার গতি বাড়ানোর জন্য কি কোনও পদ্ধতি আছে?

উত্তর:


46

3 টি দৃশ্য রয়েছে।

  1. আপনি যদি মাইআইএসএএম ব্যবহার করেন তবে কেবল ফাইল সিস্টেমটি ব্যবহার করা এবং এটি ব্যবহার করা সহজ du -sh /var/lib/mysql/database
  2. আপনি যদি ইনডোডিবি ব্যবহার করছেন ইনডোডবি_ফাইলে_পিটার_সেবদ্ধ সেট সহ, তবে আপনি ব্যবহার করে একটি আনুমানিক উত্তর পেতে পারেন du -sh। এটি আনুমানিক কারণ ইবদাটা 1 ফাইলে এখনও কিছু ডেটা সঞ্চিত আছে, তাই আপনি নীচের দিকে কিছুটা থাকবেন। এই কৌশলটি মিশ্র মাইআইএসএএম / ইনোডিবি ( 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)

আপনার যদি খুব বেশি সংখ্যক টেবিল থাকে তবে আপনি ইতিমধ্যে এটি আবিষ্কার করেছেন হিসাবে এটি ধীর হতে পারে।


আমি অন্য কোথাও দেখেছি option বিকল্পটি ভ্রচারের আকারগুলি গ্রহণ করে না।
জো

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 |
+--------------------+---------------+------------------------------+

ইনোডিবি , মাইআইএসএএম এবং আর্কাইভ টেবিলগুলির জন্য অপটিমাইজ টেবিল কমান্ডটি ব্যবহার করে স্পেসটি পুনরায় দাবি করা যেতে পারে ।

আরও দেখুন মাইএসকিউএল ডাটাবেজ সত্য সাইজ পান কিভাবে? আরো বিস্তারিত জানার জন্য.


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" কমান্ডটি ব্যবহার করি। সমস্ত স্থানটি কোথায় খাওয়া হচ্ছে তা সন্ধান করার জন্য এখানে আমার একটি উদাহরণ example

$ 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" বিকল্পটি ব্যবহার করে এভাবে এগিয়ে যেতে পারেন। আমি এইভাবে ডিস্ক স্পেস ম্যানেজমেন্টটি করতে পছন্দ করি কারণ আপনি কখনও কখনও মাইএসকিএল-তে লগ ইন করতে পারবেন না কারণ আপনি পাসওয়ার্ড বা ব্যবহারকারী জানেন না।

$ 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

আপনি দেখতে পাচ্ছেন যে সমস্ত স্থান অনেকগুলি জিগির ডেটা ধারণ করে কয়েকটি টেবিল দ্বারা জড়িয়ে রয়েছে। আশাকরি এটা সাহায্য করবে.


0

আমি আপনার ডেটা ডিকশনারিতে ফাইলের আকারটি অনুসন্ধান করব। এটি তাত্ক্ষণিক এবং নির্ভুল।

সতর্কতা : স্টোরেজ ইঞ্জিন অনুসারে, সূচিগুলি মূল ফাইলের মধ্যে বা অন্য কোনও ফাইলে সংরক্ষণ করা হয় যদি প্রয়োজন হয় তবে সেগুলি যোগ করতে ভুলবেন না।


2
হ্যাঁ, তবে কোথায়?
ম্যাগনে

0

আমি জানি এটি পুরানো তবে কেউ এটি প্রাসঙ্গিক বলে মনে করতে পারেন।

মাইএসকিউএল এ আমি ব্যবহার করি:

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;

যেহেতু আমার ডিবি ইনোডিবি, এটি কেবল একটি অনুমান।

আমি এই আউটপুট তুলনা করি:

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

আশা করি এটি আপনাকে সহায়তা করবে


0

সেরা (করার পরে apt-get install ncdu):

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

আপনার ভিপিএসে মাইএসকিএল ডাটাবেসের মোট আকার পেতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.