Máy chủ mysql sqlalchemy đã biến mất

Micheal Bayer

2010-10-23 13. 22. 59 UTC

liên kết cố định

tái chế nhóm có nghĩa là kết nối cũ 3600 giây sẽ bị loại bỏ. không giúp kết nối lại.

Khi phát hiện thấy lỗi "máy chủ biến mất", toàn bộ nhóm kết nối sẽ bị loại bỏ và được xây dựng lại. Vì vậy, giả sử một công cụ, bạn sẽ gặp lỗi này một lần cho mỗi kết nối vẫn được kiểm tra và thử một thao tác mới. Các giao dịch tiếp theo sẽ được tiến hành kể từ khi pool được xây dựng lại.

Cũng đã sửa lỗi kết nối lại Mysql trong 0. 6. 3 nơi các phiên bản trước có thể đã ảnh hưởng đến điều này.

Bài đăng của Chris Withers
Xin chào các bạn,
Một trong những máy chủ MySQL của chúng tôi đã gặp sự cố ngày hôm qua. Sau khi chúng tôi khôi phục nó, một ứng dụng nhỏ dựa trên SQLAlchemy mà chúng tôi đang chạy chống lại nó liên tục ném 'Máy chủ MySQL đã biến mất' mặc dù chúng tôi đã đặt pool_recycle thành 3600.
Bạn có biết tại sao lại như vậy không?
Tò mò về lý do tại sao SA không thử và kết nối lại khi có ngoại lệ này?
cheers,
Chris
--
Simplistix - Content Management, Batch Processing & Python Consulting
- http://www.simplistix.co.uk
--
Bạn nhận được thư này vì bạn đã đăng ký vào nhóm Google Groups "sqlalchemy".
Để có thêm tùy chọn, hãy truy cập nhóm này tại http. //các nhóm. Google. com/group/sqlalchemy?hl=vi.

--
Bạn nhận được thư này vì bạn đã đăng ký vào nhóm Google Groups "sqlalchemy".
Để đăng lên nhóm này, hãy gửi email tới ***@googlegroups. com.
Để hủy đăng ký khỏi nhóm này, hãy gửi email tới sqlalchemy+***@googlegroups. com.
Để có thêm tùy chọn, hãy truy cập nhóm này tại http. //các nhóm. Google. com/group/sqlalchemy?hl=vi.

Tôi có một máy chủ Python/Flask được truy cập không thường xuyên sử dụng SQLAlchemy. Nó được truy cập vài ngày một lần và trong lần truy cập đầu tiên, nó thường đưa ra lỗi "Máy chủ MySQL đã biến mất". Các lần xem trang tiếp theo vẫn ổn, nhưng có vẻ không chuyên nghiệp khi có lỗi ban đầu này

Tôi muốn biết cách chính xác để giải quyết vấn đề này – lời khuyên như "hãy nghỉ thật lâu", trong trường hợp này là khoảng 4 ngày, có vẻ không chính xác. Làm cách nào tôi có thể kiểm tra việc thiếu kết nối cơ sở dữ liệu và tạo một kết nối nếu cần?

Giải pháp tốt nhất

Tôi đã gặp sự cố với vấn đề này trước đây và nhận thấy rằng cách giải quyết vấn đề này là không giữ các phiên xung quanh. Vấn đề là bạn đang cố giữ kết nối mở quá lâu. Thay vào đó, hãy sử dụng phiên có phạm vi cục bộ của luồng như vậy trong

session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
0 hoặc trong gói tiện ích mà bạn nhập ở mọi nơi

from sqlalchemy.orm import scoped_session, sessionmaker
Session = scoped_session( sessionmaker() )

Sau đó thiết lập công cụ và siêu dữ liệu của bạn một lần. Điều này cho phép bạn bỏ qua cơ chế cấu hình mỗi khi bạn kết nối/ngắt kết nối. Sau đó, bạn có thể thực hiện công việc db của mình như thế này

session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()

Nếu bạn muốn giữ các đối tượng cũ và không muốn để phiên của mình mở, thì bạn có thể sử dụng mẫu trên và sử dụng lại các đối tượng cũ như thế này

session = Session()
someObject = session.merge( someObject )
# more db stuff
session.close()

Vấn đề là, bạn muốn mở phiên của mình, thực hiện công việc của mình, sau đó đóng phiên của bạn. Điều này tránh thời gian chờ rất tốt. Có rất nhiều lựa chọn cho. hợp nhất và. thêm cho phép bạn bao gồm các thay đổi bạn đã thực hiện đối với các đối tượng tách rời hoặc tải dữ liệu mới từ db. Các tài liệu rất dài dòng, nhưng một khi bạn biết những gì bạn đang tìm kiếm thì có thể dễ dàng tìm thấy hơn một chút

Để thực sự đi đến đó và ngăn MySQL "biến mất", bạn cần giải quyết vấn đề nhóm kết nối của bạn giữ cho các kết nối mở quá lâu và kiểm tra một kết nối cũ cho bạn

Để có kết nối mới, bạn có thể đặt tùy chọn

session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
1 trong cuộc gọi
session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
2 của mình. Đặt
session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
1 này thành số giây trong nhóm kết nối giữa các lần kiểm tra mà bạn muốn tạo kết nối mới thay vì kết nối hiện có được trả lại

Giải pháp liên quan

Lỗi MySQL 2006. máy chủ thesql đã biến mất

Tôi đã gặp trường hợp này nhiều lần và tôi thường thấy câu trả lời là cài đặt mặc định rất thấp của

session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
4

Tăng nó trong

session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
0 (dưới
session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
1) lên 8 hoặc 16 triệu thường sửa nó. (Mặc định trong MySql 5. 7 là
session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
2, tức là 4MB. )

[mysqld]
max_allowed_packet=16M

Ghi chú. Chỉ cần tạo dòng nếu nó không tồn tại

Ghi chú. Điều này có thể được đặt trên máy chủ của bạn khi nó đang chạy

Sử dụng

session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
3. Điều này đặt nó thành 100MB

Mysql – LỖI 2006 (HY000). Máy chủ MySQL đã biến mất

________số 8

Thêm dòng này vào tệp

session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
4 sẽ giải quyết được sự cố của tôi

Điều này hữu ích khi các cột có giá trị lớn, gây ra sự cố, bạn có thể tìm thấy lời giải thích tại đây

Tại sao máy chủ MySQL đã biến mất?

Lý do phổ biến nhất dẫn đến 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 . Trong trường hợp này, bạn thường nhận được một trong các mã lỗi sau (mã lỗi bạn nhận được phụ thuộc vào hệ điều hành). Khách hàng không thể gửi câu hỏi đến máy chủ.

Làm cách nào để kết nối SQLAlchemy với MySQL?

Cuối cùng, bạn có tên máy chủ hoặc địa chỉ IP của cơ sở dữ liệu và tên cơ sở dữ liệu. Những dữ liệu này là tất cả những gì bạn cần để thiết lập kết nối. Cổng là tùy chọn, nhưng SQLAlchemy đủ thông minh để biết cơ sở dữ liệu MySQL nằm ở cổng 3306. Cuối cùng, bạn tạo đối tượng kết nối và gọi phương thức kết nối .

MySQL có được hỗ trợ bởi SQLAlchemy 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 . Xem tài liệu MySQL chính thức để biết thông tin chi tiết về các tính năng được hỗ trợ trong bất kỳ bản phát hành máy chủ cụ thể nào.

Tôi có thể sử dụng cái gì thay cho SQLAlchemy?

Django, Pandas, Entity Framework, peewee và MySQL là những giải pháp thay thế phổ biến nhất và là đối thủ cạnh tranh của SQLAlchemy.