it-swarm.asia

انتهت مهلة العميل ، بينما يظل استعلام MySQL قيد التشغيل؟

لقد واجهنا مشكلة حيث يكون استعلام للقراءة فقط ، يعمل من خلال منضدة MySQL ، مهلة من منظور واجهة مستخدم المستخدم وظل يعمل على الخادم (ويستهلك على ما يبدو المزيد والمزيد من الموارد) حتى يكون لدينا انقطاع.

الأسئلة

  • هل هناك طريقة قياسية للتعامل مع هذا النوع من المشاكل في MySQL؟
  • هل هناك سبب أساسي علينا تجنبه؟
9
asthasr

تحتاج إلى إلقاء نظرة على القيم الافتراضية الموجودة للمهلة:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

عادة ، أشاهد لعدة متغيرات المهلة. يعد هذا أمرًا ضروريًا للغاية إذا كنت تستخدم MySQL عن بُعد من MySQL Workbench أو عميل mysql أو PHP على خادم تطبيق يتصل بـ MySQL على خادم DB.

إليك ما تقوله وثائق MySQL عن أحد هذه الإعدادات:

  • wait_timeout (افتراضي 28800 [8 ساعات]): عدد الثواني التي ينتظرها الخادم للنشاط على اتصال غير تفاعلي قبل إغلاقه. تنطبق هذه المهلة فقط على اتصالات ملف مأخذ التوصيل TCP/IP و Unix ، وليس على الاتصالات التي تم إجراؤها باستخدام أنابيب الاتصال المسماة أو الذاكرة المشتركة. عند بدء تشغيل مؤشر الترابط ، تتم تهيئة قيمة wait_timeout للجلسة من قيمة wait_timeout العالمية أو من قيمة time_timeout العالمية ، اعتمادًا على نوع العميل (كما هو محدد بواسطة خيار الاتصال CLIENT_INTERACTIVE إلى mysql_real_connect ()). انظر أيضا المهلة التفاعلية.
  • Interactive_timeout (افتراضي 28800 [8 ساعات]): عدد الثواني التي ينتظرها الخادم للنشاط على اتصال تفاعلي قبل إغلاقه. يتم تعريف العميل التفاعلي كعميل يستخدم خيار CLIENT_INTERACTIVE إلى mysql_real_connect (). أنظر أيضا مهلة الانتظار.
  • net_read_timeout (افتراضي 30): عدد الثواني التي تنتظر المزيد من البيانات من اتصال قبل إحباط القراءة. عند قراءة الخادم من العميل ، net_read_timeout هي قيمة المهلة التي تتحكم في وقت إحباطها. عندما يكتب الخادم للعميل ، net_write_timeout هي قيمة المهلة التي تتحكم في وقت الإحباط. أنظر أيضا slave_net_timeout.
  • net_write_timeout (افتراضي 60): عدد الثواني التي تنتظر حتى تتم كتابة كتلة إلى اتصال قبل إحباط الكتابة. أنظر أيضا net_read_timeout.

يُرجى التأكد من تعيين هذه المهلات عالية بما يكفي لاستيعاب الاستعلامات التي قد يتم تشغيلها لفترة طويلة جدًا ، والتي قد تشمل:

  • الكتلة UPDATEs
  • الكتلة DELETEs
  • ENABLE KEYS على MyISAM كبير

للتعامل مع الاستفسارات التي تستمر في العمل بعد أن تفقد الاتصال بها ، عليك تشغيل [~ # ~] قتل [~ # ~] مقابل معرف العملية لاستعلام طويل المدى. حتى مع الأمر KILL ، سيتعين عليك انتظار أي استعلام يقع في منتصف خطوات القرص المكثف أو أن يكون هناك كائنات داخلية قيد التقدم.

11
RolandoMySQLDBA