Encontramos um atributo no objeto cursor chamado
cursor._last_executed
que contém a última string de consulta a ser executada mesmo quando ocorre uma exceção. Isso foi mais fácil e melhor para nós na produção do que usar criação de perfil o tempo todo ou log de consulta do MySQL, pois ambos têm um impacto no desempenho e envolvem mais código ou mais arquivos de log separados correlacionados, etc. Odeio responder minha própria pergunta, mas isso está funcionando melhor para nós.