ibdata1 và MyISAM loại trừ lẫn nhau.
Điều đầu tiên bạn nên làm là đếm xem có bao nhiêu bảng sử dụng cả hai công cụ lưu trữ:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Nếu MỘT SỐ bảng là InnoDB:
Thực hiện CleanUp of InnoDB của tôi
- Cách thực hiện:Làm sạch công cụ lưu trữ mysql InnoDB?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983 # 8983
Nếu bạn chỉ có bảng MyISAM và không có bảng InnoDB:
Đầu tiên, loại bỏ bất kỳ dấu vết nào của InnoDBDo như sau:
BƯỚC01) Thêm cái này vào my.cnf
[mysqld]
skip-innodb
STEP02) service mysql restart
BƯỚC03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Sau các bước này, bạn có thể thực hiện Nén từng bảng MyISAM như sau:
Đối với bảng mydb.mytable là MyISAM, chỉ cần chạy một trong các thao tác sau:
-
OPTIMIZE TABLE mydb.mytable;
-
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Nếu bạn muốn chống phân mảnh tất cả các bảng MyISAM của mình, đây là một tập lệnh shell để làm như vậy ...
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
Khi bạn tin tưởng tập lệnh một cách trực quan, chỉ cần chạy nó
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Hãy thử !!!
CẬP NHẬT 2012-07-25 09:52 EDT
Tôi muốn làm rõ một trong những đề xuất của tôi để nén MyISAM
Tôi đã nói trước đó
-
OPTIMIZE TABLE mydb.mytable;
-
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Các lệnh này giống hệt nhau về mặt cơ học. OPTIMIZE TABLE
thực hiện chống phân mảnh bảng MyISAM và sau đó chạy ANALYZE TABLE
để tính toán thống kê chỉ mục mới.
Nói một cách máy móc, đây là ALTER TABLE mydb.mytable ENGINE=MyISAM;
hiện:
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;