B.3.3.3 & nbsp; Phải làm gì nếu MySQL tiếp tục gặp sự cố
Mỗi phiên bản MySQL được kiểm tra trên nhiều nền tảng trước khi nó được phát hành. Điều này không có nghĩa là không có lỗi trong MySQL, nhưng nếu có lỗi, chúng nên rất ít và có thể khó tìm. Nếu bạn gặp vấn đề, nó luôn có ích nếu bạn cố gắng tìm hiểu chính xác điều gì làm hỏng hệ thống của bạn, bởi vì bạn có cơ hội tốt hơn nhiều để khắc phục sự cố một cách nhanh chóng.
Đầu tiên, bạn nên cố gắng tìm hiểu xem vấn đề là máy chủ MySQLD chết hay liệu vấn đề của bạn có liên quan đến máy khách của bạn hay không. Bạn có thể kiểm tra thời gian máy chủ MySQLD của bạn đã tăng bằng cách thực hiện phiên bản mysqladmin. Nếu MySQLD đã chết và khởi động lại, bạn có thể tìm thấy lý do bằng cách nhìn vào nhật ký lỗi của máy chủ. Xem Phần & NBSP; 5.4.2, Nhật ký lỗi.mysqld server dies or whether your problem has to do with your client. You can check how long your mysqld server has been up by executing mysqladmin version. If mysqld has died and restarted, you may find the reason by looking in the server's error log. See Section 5.4.2, “The Error Log”.
Trên một số hệ thống, bạn có thể tìm thấy trong bản ghi lỗi một dấu vết của nơi MySQLD chết. Lưu ý rằng các giá trị biến được viết trong nhật ký lỗi có thể không phải lúc nào cũng chính xác 100%.mysqld died. Note that the variable values written in the error log may not always be 100% correct.
Nếu bạn thấy rằng MySQLD không thành công khi khởi động trong quá trình phục hồi InnoDB
, hãy tham khảo phần & NBSP; 15.21.2, Khắc phục sự cố khắc phục.mysqld fails at startup during InnoDB
recovery, refer to Section 15.21.2, “Troubleshooting Recovery Failures”.
Nhiều lối thoát máy chủ bất ngờ được gây ra bởi các tệp dữ liệu bị hỏng hoặc tệp chỉ mục. MySQL cập nhật các tệp trên đĩa với lệnh gọi hệ thống write[]
sau mỗi câu lệnh SQL và trước khi khách hàng được thông báo về kết quả. . Dữ liệu được ghi vào đĩa. Bạn có thể buộc MySQL xóa mọi thứ vào đĩa sau mỗi câu lệnh SQL bằng cách bắt đầu MySQLD với tùy chọn --flush
.mysqld crashes, because the operating system ensures that the unflushed data is written to disk. You can force MySQL to flush everything to disk after every SQL statement by starting mysqld with
the --flush
option.
Phần trước có nghĩa là thông thường bạn không nên nhận các bảng bị hỏng trừ khi một trong những điều sau đây xảy ra:
Máy chủ MySQL hoặc máy chủ máy chủ đã bị giết ở giữa bản cập nhật.
Bạn đã tìm thấy một lỗi trong MySQLD khiến nó chết ở giữa bản cập nhật.mysqld that caused it to die in the middle of an update.
Một số chương trình bên ngoài đang thao túng các tệp dữ liệu hoặc tệp chỉ mục cùng lúc với MySQLD mà không khóa bảng đúng cách.mysqld without locking the table properly.
Bạn đang chạy nhiều máy chủ MySQLD bằng cùng một thư mục dữ liệu trên một hệ thống không hỗ trợ khóa hệ thống tệp tốt [thường được xử lý bởi Trình quản lý khóa
lockd
] hoặc bạn đang chạy nhiều máy chủ với khóa bên ngoài bị tắt.mysqld servers using the same data directory on a system that does not support good file system locks [normally handled by thelockd
lock manager], or you are running multiple servers with external locking disabled.Bạn có một tệp dữ liệu bị lỗi hoặc tệp chỉ mục có chứa dữ liệu rất tham nhũng nhầm lẫn MySQLD.mysqld.
Bạn đã tìm thấy một lỗi trong mã lưu trữ dữ liệu. Điều này không có khả năng, nhưng ít nhất nó là có thể. Trong trường hợp này, bạn có thể cố gắng thay đổi công cụ lưu trữ thành một công cụ khác bằng cách sử dụng
ALTER TABLE
trên một bản sao đã sửa chữa của bảng.
Bởi vì rất khó để biết tại sao một cái gì đó bị sập, trước tiên hãy cố gắng kiểm tra xem những thứ hoạt động cho người khác có dẫn đến một lối thoát bất ngờ cho bạn hay không. Hãy thử những điều sau:
Dừng máy chủ MySQLD với Shutdown MySQLadmin, chạy myisamchk - -silent - -force */ *. Myi từ thư mục dữ liệu để kiểm tra tất cả các bảng
MyISAM
và khởi động lại MySQLD. Điều này đảm bảo rằng bạn đang chạy từ trạng thái sạch. Xem Chương & NBSP; 5, Quản trị máy chủ MySQL.mysqld server with mysqladmin shutdown, run myisamchk --silent --force */*.MYI from the data directory to check allMyISAM
tables, and restart mysqld. This ensures that you are running from a clean state. See Chapter 5, MySQL Server Administration.Bắt đầu MySQLD với nhật ký truy vấn chung được bật [xem Phần & NBSP; 5.4.3, Hồi The General Truy vấn nhật ký]. Sau đó, cố gắng xác định từ thông tin được ghi vào nhật ký xem một số truy vấn cụ thể có giết chết máy chủ hay không. Khoảng 95% của tất cả các lỗi có liên quan đến một truy vấn cụ thể. Thông thường, đây là một trong những truy vấn cuối cùng trong tệp nhật ký ngay trước khi máy chủ khởi động lại. Xem Phần & NBSP; 5.4.3, Nhật ký truy vấn chung. Nếu bạn có thể liên tục giết MySQL bằng một truy vấn cụ thể, ngay cả khi bạn đã kiểm tra tất cả các bảng ngay trước khi phát hành, thì bạn đã cô lập lỗi và nên gửi báo cáo lỗi cho nó. Xem Phần & NBSP; 1.6, Cách báo cáo lỗi hoặc vấn đề.mysqld with the general query log enabled [see Section 5.4.3, “The General Query Log”]. Then try to determine from the information written to the log whether some specific query kills the server. About 95% of all bugs are related to a particular query. Normally, this is one of the last queries in the log file just before the server restarts. See Section 5.4.3, “The General Query Log”. If you can repeatedly kill MySQL with a specific query, even when you have checked all tables just before issuing it, then you have isolated the bug and should submit a bug report for it. See Section 1.6, “How to Report Bugs or Problems”.
Cố gắng thực hiện một trường hợp thử nghiệm mà chúng ta có thể sử dụng để lặp lại vấn đề. Xem Phần & NBSP; 5.9, Debugging MySQL.
Hãy thử tập lệnh
fork_big.pl
. [Nó nằm trong thư mục phân phối nguồntests
.]Định cấu hình MySQL để gỡ lỗi giúp thu thập thông tin về các lỗi có thể dễ dàng hơn nhiều nếu có sự cố. Cấu hình lại MySQL với tùy chọn
InnoDB
0 thành CMake và sau đó thu lại. Xem Phần & NBSP; 5.9, Debugging MySQL.CMake and then recompile. See Section 5.9, “Debugging MySQL”.Hãy chắc chắn rằng bạn đã áp dụng các bản vá mới nhất cho hệ điều hành của bạn.
Sử dụng tùy chọn
InnoDB
1 cho MySQLD. Trên một số hệ thống, Trình quản lý khóalockd
không hoạt động đúng; Tùy chọnInnoDB
1 cho biết MySQLD không sử dụng khóa bên ngoài. .mysqld. On some systems, thelockd
lock manager does not work properly; theInnoDB
1 option tells mysqld not to use external locking. [This means that you cannot run two mysqld servers on the same data directory and that you must be careful if you use myisamchk. Nevertheless, it may be instructive to try the option as a test.]-
Nếu MySQLD dường như đang chạy nhưng không phản hồi, hãy thử danh sách xử lý gốc mysqladmin -u. Đôi khi MySQLD không được treo mặc dù có vẻ không phản hồi. Vấn đề có thể là tất cả các kết nối đang được sử dụng hoặc có thể có một số vấn đề khóa bên trong. MySQLadmin -u Danh sách xử lý gốc thường có thể tạo kết nối ngay cả trong những trường hợp này và có thể cung cấp thông tin hữu ích về số lượng kết nối hiện tại và trạng thái của chúng.mysqld appears to be running but not responding, try mysqladmin -u root processlist. Sometimes mysqld is not hung even though it seems unresponsive. The problem may be that all connections are in use, or there may be some internal lock problem. mysqladmin -u root processlist usually is able to make a connection even in these cases, and can provide useful information about the current number of connections and their status.
Chạy lệnh mysqladmin -i 5 trạng thái hoặc trạng thái mysqladmin -i 5 -r trong một cửa sổ riêng để tạo số liệu thống kê trong khi chạy các truy vấn khác.mysqladmin -i 5 status or mysqladmin -i 5 -r status in a separate window to produce statistics while running other queries.
Hãy thử những điều sau:
Bắt đầu MySQLD từ GDB [hoặc một trình gỡ lỗi khác]. Xem Phần & NBSP; 5.9, Debugging MySQL.mysqld from gdb [or another debugger]. See Section 5.9, “Debugging MySQL”.
Chạy các tập lệnh kiểm tra của bạn.
In backtrace và các biến cục bộ ở ba cấp thấp nhất. Trong GDB, bạn có thể thực hiện điều này với các lệnh sau khi MySQLD đã bị sập bên trong GDB:gdb, you can do this with the following commands when mysqld has crashed inside gdb:
backtrace info local up info local up info local
Với GDB, bạn cũng có thể kiểm tra các luồng nào tồn tại với
InnoDB
4 và chuyển sang một luồng cụ thể vớiInnoDB
5, trong đóInnoDB
6 là ID luồng.gdb, you can also examine which threads exist withInnoDB
4 and switch to a specific thread withInnoDB
5, whereInnoDB
6 is the thread ID.
Cố gắng mô phỏng ứng dụng của bạn bằng một tập lệnh Perl để buộc MySQL thoát hoặc sai.
Gửi một báo cáo lỗi bình thường. Xem Phần & NBSP; 1.6, Cách báo cáo lỗi hoặc vấn đề. Thậm chí còn chi tiết hơn bình thường. Vì MySQL hoạt động cho nhiều người, vụ tai nạn có thể xuất phát từ một cái gì đó chỉ tồn tại trên máy tính của bạn [ví dụ: một lỗi có liên quan đến các thư viện hệ thống cụ thể của bạn].
Nếu bạn có vấn đề với các bảng chứa các hàng có độ dài động và bạn chỉ sử dụng các cột
InnoDB
7 [không phảiInnoDB
8 hoặcInnoDB
9], bạn có thể cố gắng thay đổi tất cảInnoDB
7 thànhwrite[]
1 vớiALTER TABLE
. Điều này buộc MySQL phải sử dụng các hàng có kích thước cố định. Các hàng có kích thước cố định có thêm một chút không gian, nhưng chịu đựng tham nhũng hơn nhiều.Mã hàng động hiện tại đã được sử dụng trong vài năm với rất ít vấn đề, nhưng các hàng có độ dài động về bản chất dễ bị lỗi hơn, vì vậy có thể nên thử chiến lược này để xem liệu nó có giúp ích gì không.
-
Xem xét khả năng lỗi phần cứng khi chẩn đoán vấn đề. Phần cứng bị lỗi có thể là nguyên nhân của tham nhũng dữ liệu. Đặc biệt chú ý đến các hệ thống con bộ nhớ và đĩa của bạn khi khắc phục sự cố phần cứng.