Sqlalchemy Mất kết nối với máy chủ MySQL trong khi truy vấn

Trước tiên, hãy đảm bảo rằng quy trình không chạy trên máy khách mặc dù đã hết thời gian kết nối. Bạn có thể kiểm tra điều này bằng cách truy cập

SHOW VARIABLES LIKE "%timeout";
4 trên MySQL Workbench và đảm bảo rằng không có quy trình/truy vấn nào vẫn đang chạy liên quan đến quá trình nhập

Tiếp theo, tôi khuyên bạn nên tăng khoảng thời gian chờ cho Phiên MySQL của bạn. Điều đó có thể được tìm thấy trên MySQL Workbench bên dưới

SHOW VARIABLES LIKE "%timeout";
5 và đặt khoảng thời gian chờ cho mỗi phần là 600 giây

Cũng có thể là bạn đang hết thời gian chờ sau 5 phút, nếu vậy, tôi khuyên bạn nên tăng thời gian chờ lên 10 phút bằng cách thực hiện các dòng này trong MySQL Workbench

SHOW VARIABLES LIKE "%timeout";
6
SHOW VARIABLES LIKE "%timeout";
7
SHOW VARIABLES LIKE "%timeout";
8
SHOW VARIABLES LIKE "%timeout";
9

Sau khi thực hiện các dòng trên, hãy thử nhập all_database. sql và theo dõi trang Kết nối máy khách trong khi tệp đang được nhập. Nếu chúng tôi có thể xác định rằng Workbench đang mất kết nối với cơ sở dữ liệu của bạn, chúng tôi có thể cần thực hiện khôi phục dòng lệnh

Tôi đã thử truy vấn một phiên bản Cơ sở dữ liệu Amazon Relational Database Service (Amazon RDS) đang chạy MySQL và tôi nhận được một trong các thông báo lỗi sau. "Máy chủ MySQL đã biến mất" hoặc "Mất kết nối với máy chủ trong khi truy vấn. "

Mô tả ngắn

Nếu máy chủ hết thời gian chờ và đóng kết nối, bạn có thể gặp một trong các lỗi sau

  • CR_SERVER_GONE_ERROR - Máy khách 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 máy khách 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

Để biết thêm thông tin, hãy xem tài liệu MySQL dành cho máy chủ MySQL đã biến mất

Nghị quyết

Xem các nguyên nhân sau đây và các giải pháp liên quan cho các lỗi này

  • Nếu một kết nối không hoạt động quá lâu, thì kết nối có thể bị ngắt không chính xác từ máy khách. Để giải quyết vấn đề này, hãy xác minh rằng thời gian chờ của ứng dụng ngắn hơn thời gian chờ của MySQL và đảm bảo rằng các ứng dụng của bạn đóng các kết nối không hoạt động
  • Nếu kết nối hết thời gian chờ, thì hãy tăng thời gian chờ cho MySQL bằng cách tăng các tham số wait_timeout và Interactive_timeout bằng cách sử dụng nhóm tham số tùy chỉnh. Để biết thêm thông tin, hãy xem Làm việc với các nhóm tham số DB
  • Nếu truy vấn tạo ra lỗi đang truy xuất tập dữ liệu lớn thì hãy tăng tham số kích thước max_allowed_packet bằng cách sử dụng nhóm tham số tùy chỉnh. Để biết thêm thông tin, hãy xem phần Sửa đổi tham số trong nhóm tham số DB.
    Lưu ý. Đối với Amazon Aurora, bạn có thể sửa đổi các tham số và đặt chúng trong một nhóm tham số cụm để áp dụng ở cấp độ toàn bộ cụm. Đặt nó trong nhóm tham số DB chỉ áp dụng các tham số ở cấp phiên bản. Đối với cơ sở dữ liệu MySQL của Amazon Lightsail, bạn phải kiểm tra xem có sẵn các tham số để sửa đổi hay không trước khi sửa đổi chúng bằng giao diện dòng lệnh (CLI). Để biết thêm thông tin, hãy xem Cập nhật tham số cơ sở dữ liệu trong Amazon Lightsail. Đối với phiên bản Lightsail hoặc cơ sở dữ liệu MySQL cục bộ của máy chủ hoặc MySQL của Amazon Elastic Compute Cloud (Amazon EC2), bạn có thể đặt tham số trong tệp cấu hình. Bạn cũng có thể đặt xxx chung, tương tự như cách nó được đặt trong môi trường MySQL tại chỗ bình thường.
  • Nếu lỗi chỉ xảy ra khi trả về tập dữ liệu lớn, máy khách có thể đang sử dụng giá trị MTU lớn là 9001. Để giải quyết vấn đề này, hãy giảm giá trị MTU TCP/IP của máy khách. Để biết thông tin về cách thay đổi giá trị MTU máy khách của bạn, hãy xem Định cấu hình MTU của phiên bản
  • Nếu bất kỳ tham số init_connect nào được đặt thành giá trị không cho phép xử lý tham số đó, các kết nối máy khách được liên kết có thể không thành công. Đảm bảo rằng tất cả các tham số init_connect đều được xử lý chính xác. Đảm bảo rằng người dùng có quyền EXECUTE đối với bất kỳ quy trình nào được tham chiếu dưới dạng tham số init_connect
  • Nếu tất cả các kết nối bị rớt cùng lúc, hãy xác nhận rằng các kết nối khác vẫn hoạt động khi sự cố này xảy ra. Để giải quyết vấn đề này, hãy xác minh phiên bản Cơ sở dữ liệu MySQL không gặp sự cố hoặc lỗi bằng cách xem các sự kiện Amazon RDS và xem lại nhật ký lỗi MySQL của bạn



Bạn có cần thanh toán hoặc hỗ trợ kỹ thuật?

Lỗi trên thường xảy ra khi bạn chạy một truy vấn MySQL dài hoặc phức tạp kéo dài hơn vài giây

Để khắc phục lỗi, bạn có thể cần thay đổi cài đặt chung liên quan đến thời gian chờ trong máy chủ cơ sở dữ liệu MySQL của mình

Tăng thời gian chờ kết nối từ dòng lệnh bằng tùy chọn –connect-timeout

Nếu bạn đang truy cập MySQL từ dòng lệnh, thì bạn có thể tăng số giây mà MySQL sẽ đợi phản hồi kết nối bằng cách sử dụng tùy chọn

+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| connect_timeout                   | 10       |
| delayed_insert_timeout            | 300      |
| have_statement_timeout            | YES      |
| innodb_flush_log_at_timeout       | 1        |
| innodb_lock_wait_timeout          | 50       |
| innodb_rollback_on_timeout        | OFF      |
| interactive_timeout               | 28800    |
| lock_wait_timeout                 | 31536000 |
| mysqlx_connect_timeout            | 30       |
| mysqlx_idle_worker_thread_timeout | 60       |
| mysqlx_interactive_timeout        | 28800    |
| mysqlx_port_open_timeout          | 0        |
| mysqlx_read_timeout               | 30       |
| mysqlx_wait_timeout               | 28800    |
| mysqlx_write_timeout              | 60       |
| net_read_timeout                  | 30       |
| net_write_timeout                 | 60       |
| replica_net_timeout               | 60       |
| rpl_stop_replica_timeout          | 31536000 |
| rpl_stop_slave_timeout            | 31536000 |
| slave_net_timeout                 | 60       |
| wait_timeout                      | 28800    |
+-----------------------------------+----------+
0

Theo mặc định, MySQL sẽ đợi trong 10 giây trước khi phản hồi với lỗi hết thời gian chờ kết nối

Bạn có thể tăng số lên 120 giây để đợi trong hai phút

mysql -uroot -proot --connect-timeout 120

Bạn có thể điều chỉnh số

+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| connect_timeout                   | 10       |
| delayed_insert_timeout            | 300      |
| have_statement_timeout            | YES      |
| innodb_flush_log_at_timeout       | 1        |
| innodb_lock_wait_timeout          | 50       |
| innodb_rollback_on_timeout        | OFF      |
| interactive_timeout               | 28800    |
| lock_wait_timeout                 | 31536000 |
| mysqlx_connect_timeout            | 30       |
| mysqlx_idle_worker_thread_timeout | 60       |
| mysqlx_interactive_timeout        | 28800    |
| mysqlx_port_open_timeout          | 0        |
| mysqlx_read_timeout               | 30       |
| mysqlx_wait_timeout               | 28800    |
| mysqlx_write_timeout              | 60       |
| net_read_timeout                  | 30       |
| net_write_timeout                 | 60       |
| replica_net_timeout               | 60       |
| rpl_stop_replica_timeout          | 31536000 |
| rpl_stop_slave_timeout            | 31536000 |
| slave_net_timeout                 | 60       |
| wait_timeout                      | 28800    |
+-----------------------------------+----------+
1 ở trên thành số giây bạn muốn đợi phản hồi kết nối

Khi bạn đang ở trong bảng điều khiển

+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| connect_timeout                   | 10       |
| delayed_insert_timeout            | 300      |
| have_statement_timeout            | YES      |
| innodb_flush_log_at_timeout       | 1        |
| innodb_lock_wait_timeout          | 50       |
| innodb_rollback_on_timeout        | OFF      |
| interactive_timeout               | 28800    |
| lock_wait_timeout                 | 31536000 |
| mysqlx_connect_timeout            | 30       |
| mysqlx_idle_worker_thread_timeout | 60       |
| mysqlx_interactive_timeout        | 28800    |
| mysqlx_port_open_timeout          | 0        |
| mysqlx_read_timeout               | 30       |
| mysqlx_wait_timeout               | 28800    |
| mysqlx_write_timeout              | 60       |
| net_read_timeout                  | 30       |
| net_write_timeout                 | 60       |
| replica_net_timeout               | 60       |
| rpl_stop_replica_timeout          | 31536000 |
| rpl_stop_slave_timeout            | 31536000 |
| slave_net_timeout                 | 60       |
| wait_timeout                      | 28800    |
+-----------------------------------+----------+
2, hãy thử chạy lại truy vấn của mình để xem truy vấn đã hoàn tất thành công chưa

Sử dụng tùy chọn

+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| connect_timeout                   | 10       |
| delayed_insert_timeout            | 300      |
| have_statement_timeout            | YES      |
| innodb_flush_log_at_timeout       | 1        |
| innodb_lock_wait_timeout          | 50       |
| innodb_rollback_on_timeout        | OFF      |
| interactive_timeout               | 28800    |
| lock_wait_timeout                 | 31536000 |
| mysqlx_connect_timeout            | 30       |
| mysqlx_idle_worker_thread_timeout | 60       |
| mysqlx_interactive_timeout        | 28800    |
| mysqlx_port_open_timeout          | 0        |
| mysqlx_read_timeout               | 30       |
| mysqlx_wait_timeout               | 28800    |
| mysqlx_write_timeout              | 60       |
| net_read_timeout                  | 30       |
| net_write_timeout                 | 60       |
| replica_net_timeout               | 60       |
| rpl_stop_replica_timeout          | 31536000 |
| rpl_stop_slave_timeout            | 31536000 |
| slave_net_timeout                 | 60       |
| wait_timeout                      | 28800    |
+-----------------------------------+----------+
0 sẽ tạm thời thay đổi thời gian chờ giây. Nó chỉ hoạt động cho phiên MySQL hiện tại mà bạn đang chạy, vì vậy bạn cần sử dụng tùy chọn này mỗi khi bạn muốn thời gian chờ kết nối lâu hơn

Nếu bạn muốn thực hiện thay đổi vĩnh viễn đối với biến thời gian chờ kết nối, thì bạn cần điều chỉnh cài đặt từ máy chủ cơ sở dữ liệu MySQL hoặc công cụ GUI mà bạn đã sử dụng để truy cập máy chủ cơ sở dữ liệu của mình

Trước tiên, hãy xem cách thay đổi các biến toàn cục hết thời gian chờ trong máy chủ cơ sở dữ liệu MySQL của bạn

Điều chỉnh các biến toàn cục thời gian chờ trong máy chủ cơ sở dữ liệu MySQL của bạn

Cơ sở dữ liệu MySQL lưu trữ các biến toàn cục liên quan đến thời gian chờ mà bạn có thể truy cập bằng truy vấn sau

SHOW VARIABLES LIKE "%timeout";

Đây là kết quả từ cơ sở dữ liệu cục bộ của tôi. Các biến được đánh dấu là những biến bạn cần thay đổi để MySQL chạy các truy vấn dài hơn

+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| connect_timeout                   | 10       |
| delayed_insert_timeout            | 300      |
| have_statement_timeout            | YES      |
| innodb_flush_log_at_timeout       | 1        |
| innodb_lock_wait_timeout          | 50       |
| innodb_rollback_on_timeout        | OFF      |
| interactive_timeout               | 28800    |
| lock_wait_timeout                 | 31536000 |
| mysqlx_connect_timeout            | 30       |
| mysqlx_idle_worker_thread_timeout | 60       |
| mysqlx_interactive_timeout        | 28800    |
| mysqlx_port_open_timeout          | 0        |
| mysqlx_read_timeout               | 30       |
| mysqlx_wait_timeout               | 28800    |
| mysqlx_write_timeout              | 60       |
| net_read_timeout                  | 30       |
| net_write_timeout                 | 60       |
| replica_net_timeout               | 60       |
| rpl_stop_replica_timeout          | 31536000 |
| rpl_stop_slave_timeout            | 31536000 |
| slave_net_timeout                 | 60       |
| wait_timeout                      | 28800    |
+-----------------------------------+----------+

Để thay đổi các giá trị của biến, bạn có thể sử dụng truy vấn

mysql -uroot -proot --connect-timeout 120
0 như hình bên dưới

SET GLOBAL connect_timeout = 600; 

Truy vấn trên nên điều chỉnh giá trị biến

mysql -uroot -proot --connect-timeout 120
1 thành
mysql -uroot -proot --connect-timeout 120
2 giây. Bạn có thể điều chỉnh các số khi bạn thấy phù hợp

Điều chỉnh các biến thời gian chờ trong tệp cấu hình MySQL của bạn

Ngoài ra, nếu bạn đang sử dụng tệp cấu hình MySQL để kiểm soát cài đặt kết nối của mình thì bạn có thể chỉnh sửa tệp cấu hình my. cnf (Mac) hoặc của tôi. ini (Windows) được sử dụng bởi kết nối MySQL của bạn

Mở tệp cấu hình đó bằng trình soạn thảo văn bản bạn chọn và thử tìm các biến sau trong mysqld

[mysqld]
connect_timeout = 10
net_read_timeout = 30
wait_timeout = 28800
interactive_timeout = 28800

Các biến

mysql -uroot -proot --connect-timeout 120
3 và
mysql -uroot -proot --connect-timeout 120
4 không gây ra vấn đề gì vì chúng thường có giá trị mặc định là 28800 giây (hoặc 8 giờ)

Để tránh lỗi hết thời gian, bạn cần tăng giá trị biến

mysql -uroot -proot --connect-timeout 120
1 và
mysql -uroot -proot --connect-timeout 120
6. Tôi khuyên bạn nên đặt ít nhất là
mysql -uroot -proot --connect-timeout 120
2 giây (10 phút)

Điều chỉnh các biến liên quan đến thời gian chờ trong các công cụ GUI MySQL của bạn

Nếu bạn đang sử dụng các công cụ GUI MySQL như MySQL Workbench, Sequel Ace hoặc PHPMyAdmin, thì bạn cũng có thể tìm thấy các biến liên quan đến thời gian chờ được cấu hình bởi các công cụ này trong menu cài đặt hoặc tùy chọn của chúng

Ví dụ: trong MySQL Workbench cho Windows, bạn có thể tìm thấy các cài đặt liên quan đến thời gian chờ trong Edit > Preferences > SQL Editor như hình bên dưới

MySQL Workbench Windows timeout settingsMySQL Workbench Cài đặt thời gian chờ Windows

Nếu bạn đang sử dụng Mac, thì menu sẽ nằm trong MySQLWorkbench > Preferences > SQL Editor như hình bên dưới

MySQL Workbench Mac timeout settingsCài đặt thời gian chờ của MySQL Workbench Mac

Nếu bạn đang sử dụng Sequel Ace như tôi, thì bạn có thể tìm tùy chọn hết thời gian kết nối trong menu Tùy chọn > Mạng

Đây là ảnh chụp màn hình từ cài đặt Sequel Ace Network

Sequel Ace connection timeout optionTùy chọn hết thời gian chờ kết nối Sequel Ace

Đối với các công cụ GUI khác, bạn cần tự tìm tùy chọn. Bạn có thể thử tìm kiếm cụm từ

mysql -uroot -proot --connect-timeout 120
8 trên Google để tìm tùy chọn

Tại sao Truy vấn bị mất kết nối với máy chủ MySQL?

Lỗi trên thường xảy ra khi bạn chạy một truy vấn MySQL dài hoặc phức tạp kéo dài hơn vài giây . Để khắc phục lỗi, bạn có thể cần thay đổi cài đặt chung liên quan đến thời gian chờ trong máy chủ cơ sở dữ liệu MySQL của mình.

SQLAlchemy có thể kết nối với MySQL không?

SQLAlchemy hỗ trợ MySQL bắt đầu từ phiên bản 5. 0. 2 cho đến các bản phát hành hiện đại, cũng như tất cả các phiên bản hiện đại của MariaDB .

Create_engine trong SQLAlchemy là gì?

Phương thức create_engine() của thư viện sqlalchemy lấy URL kết nối và trả về một công cụ sqlalchemy tham chiếu cả Phương ngữ và Nhóm, cùng nhau diễn giải các chức năng mô-đun của DBAPI . .

URI cơ sở dữ liệu SQLAlchemy là gì?

SQLAlchemy cho biết nguồn của Công cụ dưới dạng URI kết hợp với các đối số từ khóa tùy chọn để chỉ định các tùy chọn cho Công cụ . Hình thức của URI là. phương ngữ + trình điều khiển. //tên tài khoản. mật khẩu @ máy chủ. cổng/cơ sở dữ liệu. Nhiều phần trong chuỗi là tùy chọn.