Phần này liệt kê một số lỗi mà người dùng hay mắc phải. Bạn sẽ tìm thấy các mô tả về lỗi và cách giải quyết vấn đề tại đây Show
Máy chủ MySQL đã biến mất LỗiPhần này cũng đề cập đến lỗi liên quan Mất kết nối với máy chủ trong khi truy vấn Lý do phổ biến nhất cho lỗi máy chủ MySQL đã biến mất là máy chủ đã hết thời gian chờ và đóng kết nối. Theo mặc định, máy chủ sẽ đóng kết nối sau 8 giờ nếu không có gì xảy ra. Bạn có thể thay đổi giới hạn thời gian bằng cách đặt biến wait_timeout khi khởi động mysqld Một lý do phổ biến khác để nhận lỗi máy chủ MySQL đã biến mất là do bạn đã đưa ra lệnh “đóng” trên kết nối MySQL của mình và sau đó cố chạy truy vấn trên kết nối đã đóng Nếu bạn có tập lệnh, bạn chỉ cần thực hiện lại truy vấn để máy khách thực hiện kết nối lại tự động Thông thường, bạn có thể nhận được các mã lỗi sau trong trường hợp này (mã lỗi bạn nhận được phụ thuộc vào hệ điều hành) mã lỗi Sự miêu tả CR_SERVER_GONE_ERROR Khách hàng không thể gửi câu hỏi đến máy chủ CR_SERVER_LOST Máy khách không gặp lỗi khi ghi vào máy chủ, nhưng nó không nhận được câu trả lời đầy đủ (hoặc bất kỳ câu trả lời nào) cho câu hỏi Bạn cũng sẽ gặp lỗi này nếu ai đó giết chuỗi đang chạy bằng kill #threadid# Bạn có thể kiểm tra xem MySQL có chết không bằng cách chạy phiên bản mysqladmin và kiểm tra thời gian hoạt động. Nếu vấn đề là mysqld bị sập, bạn nên tập trung tìm ra nguyên nhân của sự cố. Trong trường hợp này, bạn nên bắt đầu bằng cách kiểm tra xem việc đưa ra lại truy vấn có giết MySQL lần nữa không. Nhìn thấy Bạn cũng có thể gặp các lỗi này nếu gửi truy vấn đến máy chủ không chính xác hoặc quá lớn. Nếu mysqld nhận được một gói quá lớn hoặc không đúng thứ tự, nó sẽ giả định rằng đã xảy ra sự cố với máy khách và đóng kết nối. Nếu bạn cần các truy vấn lớn (ví dụ: nếu bạn đang làm việc với các cột BLOB lớn), bạn có thể tăng giới hạn truy vấn bằng cách bắt đầu mysqld với tùy chọn -O max_allowed_packet=# (1M mặc định). Bộ nhớ bổ sung được phân bổ theo yêu cầu, vì vậy mysqld sẽ chỉ sử dụng nhiều bộ nhớ hơn khi bạn đưa ra một truy vấn lớn hoặc khi mysqld phải trả về một hàng kết quả lớn Nếu bạn muốn báo cáo lỗi liên quan đến vấn đề này, hãy chắc chắn rằng bạn bao gồm các thông tin sau
. Không thể kết nối với máy chủ MySQL [cục bộ] LỗiMáy khách MySQL trên Unix có thể kết nối với máy chủ mysqld theo hai cách khác nhau. Ổ cắm Unix, kết nối thông qua một tệp trong hệ thống tệp (mặc định ____0_______2) hoặc TCP/IP, kết nối thông qua một số cổng. Ổ cắm Unix nhanh hơn TCP/IP nhưng chỉ có thể được sử dụng khi kết nối với máy chủ trên cùng một máy tính. Ổ cắm Unix được sử dụng nếu bạn không chỉ định tên máy chủ hoặc nếu bạn chỉ định tên máy chủ đặc biệt localhost Trên Windows, nếu máy chủ mysqld đang chạy trên 9x/Me, bạn chỉ có thể kết nối qua TCP/IP. Nếu máy chủ đang chạy trên NT/2000/XP và mysqld được bắt đầu bằng --enable-named-pipe, bạn cũng có thể kết nối với các đường ống có tên. Tên của đường ống được đặt tên là MySQL. Nếu bạn không cung cấp tên máy chủ khi kết nối với mysqld, trước tiên, máy khách MySQL sẽ cố gắng kết nối với đường ống được đặt tên và nếu điều này không hoạt động, nó sẽ kết nối với cổng TCP/IP. Bạn có thể buộc sử dụng các đường dẫn có tên trên Windows bằng cách sử dụng. như tên máy chủ Lỗi (2002) Không thể kết nối với. thông thường có nghĩa là không có máy chủ MySQL nào đang chạy trên hệ thống hoặc bạn đang sử dụng sai tệp ổ cắm hoặc cổng TCP/IP khi cố gắng kết nối với máy chủ mysqld Bắt đầu bằng cách kiểm tra (sử dụng ps hoặc trình quản lý tác vụ trên Windows) xem có tiến trình nào đang chạy có tên mysqld trên máy chủ của bạn không. Nếu không có bất kỳ quy trình mysqld nào, bạn nên bắt đầu một quy trình. Nhìn thấy Nếu một quy trình mysqld đang chạy, bạn có thể kiểm tra máy chủ bằng cách thử các kết nối khác nhau này (tất nhiên, số cổng và tên đường dẫn ổ cắm có thể khác trong thiết lập của bạn) shell> mysqladmin version shell> mysqladmin variables shell> mysqladmin -h `hostname` version variables shell> mysqladmin -h `hostname` --port=3306 version shell> mysqladmin -h 'ip for your host' version shell> mysqladmin --socket=/tmp/mysql.sock version Lưu ý việc sử dụng các trích dẫn ngược thay vì trích dẫn chuyển tiếp bằng lệnh tên máy chủ; Dưới đây là một số lý do có thể xảy ra lỗi Không thể kết nối với máy chủ MySQL cục bộ
Nếu bạn nhận được thông báo lỗi Không thể kết nối với máy chủ MySQL trên some_hostname, bạn có thể thử những cách sau để tìm hiểu vấn đề là gì
Chủ nhà '. ' bị chặn LỗiNếu bạn gặp lỗi như thế này Host 'hostname' is blocked because of many connection errors. Unblock with 'mysqladmin flush-hosts' điều này có nghĩa là mysqld đã nhận được rất nhiều (max_connect_errors) yêu cầu kết nối từ 'tên máy chủ' của máy chủ đã bị gián đoạn ở giữa. Sau khi yêu cầu max_connect_errors không thành công, mysqld giả định rằng có điều gì đó không ổn (như cuộc tấn công từ kẻ bẻ khóa) và chặn trang web khỏi các kết nối tiếp theo cho đến khi ai đó thực thi lệnh mysqladmin flush-hosts Theo mặc định, mysqld chặn máy chủ sau 10 lỗi kết nối. Bạn có thể dễ dàng điều chỉnh điều này bằng cách khởi động máy chủ như thế này shell> safe_mysqld -O max_connect_errors=10000 & Lưu ý rằng nếu bạn nhận được thông báo lỗi này đối với một máy chủ nhất định, trước tiên bạn nên kiểm tra xem có vấn đề gì xảy ra với các kết nối TCP/IP từ máy chủ đó không. Nếu kết nối TCP/IP của bạn không hoạt động, bạn sẽ không tăng giá trị của biến max_connect_errors Lỗi quá nhiều kết nốiNếu bạn gặp lỗi Quá nhiều kết nối khi cố gắng kết nối với MySQL, điều này có nghĩa là đã có các ứng dụng khách max_connections được kết nối với máy chủ mysqld Nếu bạn cần nhiều kết nối hơn mặc định (100), bạn nên khởi động lại mysqld với giá trị lớn hơn cho biến max_connections Lưu ý rằng mysqld thực sự cho phép (max_connections+1) máy khách kết nối. Kết nối cuối cùng được dành riêng cho người dùng có đặc quyền quy trình. Bằng cách không cấp đặc quyền này cho người dùng bình thường (họ không cần điều này), quản trị viên có đặc quyền này có thể đăng nhập và sử dụng SHOW PROCESSLIST để tìm hiểu điều gì có thể sai. Nhìn thấy Số lượng kết nối tối đa cho phép với MySQL tùy thuộc vào mức độ tốt của thư viện luồng trên một nền tảng nhất định. Linux hoặc Solaris có thể hỗ trợ 500-1000 kết nối đồng thời, tùy thuộc vào dung lượng RAM bạn có và máy khách của bạn đang làm gì Không thể khôi phục một số bảng đã thay đổi không phải do giao dịchNếu bạn gặp lỗi/cảnh báo. Cảnh báo. Không thể khôi phục một số bảng đã thay đổi không phải giao dịch khi cố gắng thực hiện QUAY LẠI, điều này có nghĩa là một số bảng bạn đã sử dụng trong giao dịch không hỗ trợ giao dịch. Các bảng không giao dịch này sẽ không bị ảnh hưởng bởi câu lệnh ROLLBACK Thông thường, điều này xảy ra khi bạn đã cố gắng tạo một bảng thuộc loại không được hỗ trợ bởi tệp nhị phân mysqld của bạn. Nếu mysqld không hỗ trợ loại bảng (hoặc nếu loại bảng bị tắt bởi tùy chọn khởi động), thay vào đó, nó sẽ tạo loại bảng có loại bảng giống với loại bạn yêu cầu nhất, có thể là MyISAM Bạn có thể kiểm tra loại bảng cho một bảng bằng cách thực hiện HIỂN THỊ TÌNH TRẠNG BẢNG NHƯ 'tên_bảng'. Nhìn thấy Bạn có thể kiểm tra các tiện ích mở rộng hỗ trợ nhị phân mysqld của mình bằng cách thực hiện hiển thị các biến như 'have_%'. Nhìn thấy Nếu bạn đưa ra một truy vấn và gặp lỗi như sau ________số 8_______lưu ý rằng lỗi đề cập đến máy khách MySQL mysql. Nguyên nhân của lỗi này đơn giản là do client không đủ bộ nhớ để lưu toàn bộ kết quả Để khắc phục sự cố, trước tiên hãy kiểm tra xem truy vấn của bạn có đúng không. Có hợp lý không khi nó trả lại nhiều hàng như vậy? . Điều này đặt ít tải hơn cho máy khách (nhưng nhiều hơn cho máy chủ) Khi máy khách MySQL hoặc máy chủ mysqld nhận được một gói lớn hơn byte max_allowed_packet, nó sẽ báo lỗi Gói quá lớn và đóng kết nối Trong Mysql 3. 23 gói lớn nhất có thể là 16M (do giới hạn trong giao thức máy khách/máy chủ). Trong Mysql 4. 0. 1 trở lên, điều này chỉ bị giới hạn bởi dung lượng bộ nhớ bạn có trên máy chủ của mình (tối đa theo lý thuyết là 2G) Gói giao tiếp là một câu lệnh SQL đơn được gửi đến máy chủ MySQL hoặc một hàng đơn được gửi đến máy khách Khi máy khách MySQL hoặc máy chủ mysqld nhận được một gói lớn hơn byte max_allowed_packet, nó sẽ báo lỗi Gói quá lớn và đóng kết nối. Với một số máy khách, bạn cũng có thể gặp lỗi Mất kết nối với máy chủ MySQL trong khi truy vấn nếu gói liên lạc quá lớn Lưu ý rằng cả máy khách và máy chủ đều có biến max_allowed_packet riêng. Nếu bạn muốn xử lý các gói lớn, bạn phải tăng biến này ở cả máy khách và máy chủ Việc tăng biến này là an toàn vì bộ nhớ chỉ được cấp phát khi cần thiết; Nếu bạn đang sử dụng ứng dụng khách mysql, bạn có thể chỉ định bộ đệm lớn hơn bằng cách khởi động ứng dụng khách với mysql --set-variable=max_allowed_packet=8M. Các khách hàng khác có các phương pháp khác nhau để đặt biến này Bạn có thể sử dụng tệp tùy chọn để đặt max_allowed_packet thành kích thước lớn hơn trong mysqld. Ví dụ: nếu bạn muốn lưu trữ toàn bộ chiều dài của MEDIUMBLOB vào một bảng, bạn sẽ cần khởi động máy chủ với tùy chọn set-variable=max_allowed_packet=16M Bạn cũng có thể gặp sự cố lạ với các gói lớn nếu bạn đang sử dụng các đốm màu lớn, nhưng bạn chưa cấp quyền truy cập mysqld vào đủ bộ nhớ để xử lý truy vấn. Nếu bạn nghi ngờ trường hợp này xảy ra, hãy thử thêm ulimit -d 256000 vào đầu tập lệnh safe_mysqld và khởi động lại mysqld Lỗi giao tiếp/Kết nối bị hủyBắt đầu với MySQL 3. 23. 40, bạn chỉ gặp lỗi Kết nối bị hủy nếu bạn khởi động mysqld với --warnings Nếu bạn tìm thấy các lỗi như sau trong nhật ký lỗi của mình (xem phần ) 010301 14:38:23 Aborted connection 854 to db: 'users' user: 'josh' điều này có nghĩa là một trong những điều sau đây đã xảy ra
Khi điều này xảy ra, biến máy chủ Aborted_clients được tăng lên Biến máy chủ Aborted_connects được tăng lên
Lưu ý rằng điều này có thể chỉ ra rằng ai đó đang cố xâm nhập vào cơ sở dữ liệu của bạn Nhìn thấy Các lý do khác gây ra sự cố với máy khách bị hủy bỏ/kết nối bị hủy bỏ
Lỗi này xảy ra trong các phiên bản MySQL cũ hơn khi bảng tạm thời trong bộ nhớ trở nên lớn hơn tmp_table_size byte. Để tránh sự cố này, bạn có thể sử dụng tùy chọn -O tmp_table_size=# cho mysqld để tăng kích thước bảng tạm thời hoặc sử dụng tùy chọn SQL SQL_BIG_TABLES trước khi đưa ra truy vấn có vấn đề. Nhìn thấy Bạn cũng có thể bắt đầu mysqld với tùy chọn --big-tables. Điều này hoàn toàn giống với việc sử dụng SQL_BIG_TABLES cho tất cả các truy vấn Trong phiên bản MySQL 3. 23, các bảng tạm thời trong bộ nhớ sẽ tự động được chuyển đổi thành bảng MyISAM dựa trên đĩa sau khi kích thước bảng lớn hơn tmp_table_size Không thể tạo/ghi vào tệp LỗiNếu bạn gặp lỗi đối với một số truy vấn thuộc loại Can't create/write to file '\\sqla3fe_0.ism'. điều này có nghĩa là MySQL không thể tạo tệp tạm thời cho tập kết quả trong thư mục tạm thời đã cho. (Lỗi này là một thông báo lỗi điển hình trên Windows và thông báo lỗi Unix cũng tương tự. ) Cách khắc phục là khởi động mysqld bằng --tmpdir=path hoặc thêm vào tệp tùy chọn của bạn [mysqld] tmpdir=C:/temp giả sử rằng thư mục shell> mysqladmin -h `hostname` version6 tồn tại. Nhìn thấy Kiểm tra mã lỗi mà bạn nhận được với perror. Một lý do cũng có thể là lỗi đầy đĩa shell> perror 28 Error code 28: No space left on device Các lệnh không đồng bộ Lỗi trong Máy kháchNếu bạn nhận được các Lệnh không đồng bộ; Điều này có thể xảy ra, ví dụ: nếu bạn đang sử dụng mysql_use_result( ) và cố gắng thực hiện một truy vấn mới trước khi bạn gọi mysql_free_result( ). Điều này cũng có thể xảy ra nếu bạn cố gắng thực hiện hai truy vấn trả về dữ liệu mà không có mysql_use_result( ) hoặc mysql_store_result( ) ở giữa Nếu bạn gặp lỗi sau Tìm thấy mật khẩu sai cho người dùng. 'some_user@some_host'; điều này có nghĩa là khi mysqld được khởi động hoặc khi nó tải lại các bảng quyền, nó đã tìm thấy một mục nhập trong bảng người dùng có mật khẩu không hợp lệ. Do đó, mục nhập đơn giản bị bỏ qua bởi hệ thống cấp phép Nguyên nhân có thể và cách khắc phục sự cố này
Bảng 'xxx' không tồn tại LỗiNếu bạn gặp lỗi Bảng 'xxx' không tồn tại hoặc Không thể tìm thấy tệp. 'xxx' (lỗi. 2), điều này có nghĩa là không có bảng nào tồn tại trong cơ sở dữ liệu hiện tại có tên xxx Lưu ý rằng vì MySQL sử dụng các thư mục và tệp để lưu trữ cơ sở dữ liệu và bảng, tên cơ sở dữ liệu và bảng phân biệt chữ hoa chữ thường. (Trên Windows, tên bảng và cơ sở dữ liệu không phân biệt chữ hoa chữ thường, nhưng tất cả các tham chiếu đến một bảng đã cho trong một truy vấn phải sử dụng cùng một chữ hoa chữ thường. ) Bạn có thể kiểm tra những bảng bạn có trong cơ sở dữ liệu hiện tại với SHOW TABLES. Nhìn thấy Không thể khởi tạo lỗi bộ ký tự xxxNếu bạn gặp lỗi như shell> mysqladmin -h `hostname` version0 điều này có nghĩa là một trong những điều sau đây
Nếu bạn nhận được LỖI '. ' không tìm thấy (errno. 23), Không thể mở tập tin. . (lỗi. 24) hoặc bất kỳ lỗi nào khác với errno 23 hoặc errno 24 từ MySQL, điều đó có nghĩa là bạn chưa phân bổ đủ bộ mô tả tệp cho MySQL. Bạn có thể sử dụng tiện ích báo lỗi để nhận mô tả về ý nghĩa của số lỗi shell> mysqladmin -h `hostname` version1 Vấn đề ở đây là mysqld đang cố mở quá nhiều tệp cùng một lúc. Bạn có thể yêu cầu mysqld không mở quá nhiều tệp cùng một lúc hoặc tăng số lượng bộ mô tả tệp có sẵn cho mysqld Để yêu cầu mysqld tiếp tục mở ít tệp hơn cùng một lúc, bạn có thể làm cho bộ đệm của bảng nhỏ hơn bằng cách sử dụng tùy chọn -O table_cache=32 cho safe_mysqld (giá trị mặc định là 64). Việc giảm giá trị của max_connections cũng sẽ làm giảm số lượng tệp đang mở (giá trị mặc định là 90) Để thay đổi số lượng bộ mô tả tệp có sẵn cho mysqld, bạn có thể sử dụng tùy chọn --open-files-limit=# thành safe_mysqld hoặc -O open-files-limit=# thành mysqld. Nhìn thấy. Cách dễ nhất để làm điều đó là thêm tùy chọn vào tệp tùy chọn của bạn. Nhìn thấy. Nếu bạn có phiên bản mysqld cũ không hỗ trợ điều này, bạn có thể chỉnh sửa tập lệnh safe_mysqld. Có một dòng nhận xét ulimit -n 256 trong tập lệnh. Bạn có thể xóa ký tự '#' để bỏ ghi chú dòng này và thay đổi số 256 để ảnh hưởng đến số lượng bộ mô tả tệp có sẵn cho mysqld ulimit (và open-files-limit) có thể tăng số lượng bộ mô tả tệp, nhưng chỉ đến giới hạn do hệ điều hành áp đặt. Ngoài ra còn có một giới hạn “cứng” chỉ có thể bị ghi đè nếu bạn bắt đầu safe mysqld hoặc mysqld với quyền root (chỉ cần nhớ rằng bạn cũng cần sử dụng --user=. tùy chọn trong trường hợp này). Nếu bạn cần tăng giới hạn hệ điều hành về số lượng bộ mô tả tệp có sẵn cho mỗi quy trình, hãy tham khảo tài liệu dành cho hệ điều hành của bạn Lưu ý rằng nếu bạn chạy shell tcsh, ulimit sẽ không hoạt động. tcsh cũng sẽ báo cáo các giá trị không chính xác khi bạn yêu cầu các giới hạn hiện tại. Trong trường hợp này, bạn nên bắt đầu safe_mysqld với sh Làm cách nào để kiểm tra lỗi cuối cùng trong MySQL?Câu lệnh SHOW COUNT(*) ERRORS hiển thị số lượng lỗi. Bạn cũng có thể lấy số này từ biến error_count. HIỂN THỊ SỐ LỖI (*); .
Làm cách nào để nhận lỗi cuối cùng trong MySQL PHP?Bạn chỉ có thể sử dụng. $this->db_link->error để nhận thông báo lỗi cuối cùng. Đối với tất cả các lỗi, hãy sử dụng $this->db_link->error_list.
Làm thế nào để có được mục cuối cùng trong MySQL?Để lấy bản ghi cuối cùng, đây là truy vấn. mysql> select *from getLastRecord ORDER BY id DESC LIMIT 1; Sau đây là kết quả. Đầu ra ở trên cho thấy rằng chúng tôi đã tìm nạp bản ghi cuối cùng, với Id 4 và Tên Carol.
Làm cách nào để nhận lỗi truy vấn MySQL?Để nhận được thông báo lỗi, chúng ta phải sử dụng một hàm khác mysqli_error() để in thông báo lỗi do cơ sở dữ liệu MySQL trả về sau khi thực hiện truy vấn . Đây là cách in thông báo lỗi. tiếng vang mysqli_error(); . |