MySQL слишком много подготовленных заявлений

Есть ли способ увидеть, какие подготовленные операторы связаны с этой ошибкой:

(OperationalError) failed to prepare the MySQL query: 
Can't create more than max_prepared_stmt_count statements (current value: 20000)

Один из нескольких процессов может быть ответственен за эту проблему, и я пытаюсь выяснить, какой из них может быть самым простым способом, который я могу придумать, который заключается в том, чтобы увидеть текст подготовленных заявлений и отследить его до источника.

Есть ли какой-то способ увидеть, что это подготовленные заявления, чтобы я мог найти виновного?

1 ответ

  1. Чтобы посмотреть, сколько подготовленных инструкций в настоящее время открыто, можно запустить:

    SHOW GLOBAL STATUS LIKE 'com_%prepare%';
    

    Что дает вам что-то вроде:

    Variable_name      | Value
    -------------------+--------
    Com_prepare_sql    | 2
    Com_stmt_prepare   | 2
    Com_stmt_reprepare | 0
    Com_xa_prepare     | 0
    

    Чтобы прочитать фактические инструкции, вам нужно будет некоторое время смотреть в общем журнале запросов, а затем читать из него.
    Мне нравится использовать таблицу для общего журнала:

    -- set up
    TRUNCATE TABLE mysql.general_log;
    SET GLOBAL log_output = 'TABLE';
    SET GLOBAL general_log = 'ON';
    
    -- wait for some time
    SET GLOBAL general_log = 'OFF';
    
    -- read results
    SELECT * FROM mysql.general_log WHERE argument LIKE 'prepare%' OR argument LIKE 'execute%';
    

    Можно просмотреть подготавливаемые и выполняемые инструкции:

    command_type | argument
    -------------+--------------------------------------------------------
    Query        | prepare st from "select * from people where name = ?"
    Query        | execute st Using @name