Nó khá dễ dàng để một bảng MyISAM bị sập.
Trong tiêu đề của mỗi bảng MyISAM là một bộ đếm theo dõi có bao nhiêu tệp xử lý đang mở đối với bảng.
Nếu bạn khởi động mysql và số trong tiêu đề không khớp với số lượng tệp xử lý thực tế so với, mysqld coi bảng là bị hỏng.
Nếu một đơn giản REPAIR TABLE mdl_user
làm cho nó hoạt động trở lại mỗi lần mà không mất dữ liệu, điều này có thể cho thấy rằng bạn có một trang web bị buôn bán rất cao mà ghi vào mdl_user
.
Nếu hàng tá bảng yêu cầu điều này REPAIR TABLE
, tôi sẽ chuyển đổi tất cả các bảng thành InnoDB. Tuy nhiên, nếu mdl_user
bảng là bảng duy nhất có vấn đề này, có một số thứ bạn có thể làm (ví dụ này, giả sử cơ sở dữ liệu là moodle
);
Nếu bạn muốn tất cả các bảng còn lại là MyISAM
BƯỚC 01: Tạo Tập lệnh Bảng sửa chữa
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
BƯỚC 02: Khai báo Script Script là tệp khởi động
Thêm phần này vào /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
BƯỚC 03: Khởi động lại mysql
Mỗi lần khởi động lại của mysql sẽ kích hoạt Script Table Repair
Nếu bạn muốn tất cả các bảng trở thành InnoDB
Chạy mã này để tạo tập lệnh chuyển đổi hàng loạt các bảng MyISAM sang InnoDB và xem nó
MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql
Khi bạn hài lòng với nội dung của tập lệnh chuyển đổi, sau đó chạy nó
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
CẬP NHẬT 2012/03/15 14:00 EDT
@Kevin , Trong khi sử dụng MyISAM, điều gì xảy ra nếu hết Dung lượng đĩa là vấn đề của bạn?
Đây là một cái gì đó để xem xét: Theo Hướng dẫn nghiên cứu chứng chỉ MySQL 5.0 ,
gạch đầu dòng # 11 nói như sau trên trang 408,409 Mục 29.2:
Nếu bạn hết dung lượng đĩa trong khi thêm hàng vào bảng MyISAM, sẽ không xảy ra lỗi. Máy chủ tạm dừng hoạt động cho đến khi có chỗ trống, và sau đó hoàn thành thao tác.
Khi bạn hết dung lượng đĩa, không chỉ tắt hoặc giết mysql. Số lượng xử lý tệp đang mở trong mọi MyISAM hiện đang sử dụng sẽ không bị xóa. Do đó, bảng MyISAM bị đánh dấu bị lỗi. Nếu bạn có thể giải phóng không gian đĩa trong ổ dữ liệu mà mysqld vẫn đang chạy, mysqld sẽ chạy trên một khi không gian đĩa có sẵn.