ibdata1 और MyISAM परस्पर अनन्य हैं।
सबसे पहले आपको यह गिनना चाहिए कि कितनी टेबल दोनों स्टोरेज इंजन का उपयोग करती हैं:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
अगर कुछ टेबल InnoDB हैं:
InnoDB का मेरा क्लीनअप करें
- Howto:Clean a mysql InnoDB स्टोरेज इंजन?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983#8983
अगर आपके पास केवल MyISAM टेबल हैं और InnoDB टेबल नहीं हैं:
सबसे पहले, InnoDB के किसी भी निशान को हटा दें, निम्न कार्य करें:
STEP01) इसे my.cnf में जोड़ें
[mysqld]
skip-innodb
STEP02) service mysql restart
STEP03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
इन चरणों के बाद, आप इस तरह प्रत्येक MyISAM तालिकाओं का संपीड़न कर सकते हैं:
तालिका के लिए mydb.mytable जो कि MyISAM है, बस निम्न में से कोई एक चलाएँ:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
यदि आप अपने सभी MyISAM तालिकाओं को डीफ़्रैग्मेन्ट करना चाहते हैं, तो ऐसा करने के लिए यहाँ एक शेल स्क्रिप्ट है...
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('OPTIMIZE TABLE ',table_schema,'.',table_name,';') "
SQL="${SQL} FROM information_schema.tables "
SQL="${SQL} WHERE engine='MyISAM' AND table_schema NOT IN "
SQL="${SQL} ('information_schema','performance_schema','mysql')"
mysql ${MYSQL_CONN} -ANe"${SQL}" > GlobalMyISAMOptmizeTable.sql
less GlobalMyISAMOptmizeTable.sql
एक बार जब आप स्क्रिप्ट पर दृष्टि से भरोसा कर लेते हैं, तो बस उसे चलाएं
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
इसे आज़माएं !!!
अपडेट 2012-07-25 09:52 EDT
मैं माईसाम के संपीड़न के लिए अपने सुझावों में से एक को स्पष्ट करना चाहता हूं
मैंने पहले कहा था
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
ये आदेश यांत्रिक रूप से समान हैं। OPTIMIZE TABLE
MyISAM तालिका का डीफ़्रैग करता है और फिर ANALYZE TABLE
. चलाता है ताजा सूचकांक आँकड़ों की गणना करने के लिए।
यांत्रिक रूप से कहें तो, यह ALTER TABLE mydb.mytable ENGINE=MyISAM;
है करता है:
CREATE TABLE mydb.mytabletmp LIKE mydb.mytable;
INSERT INTO mydb.mytabletmp SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytabletmp RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;