如何对MySQL过程进行故障排除-为什么循环达到最大运行次数?

如何对MySQL过程进行故障排除-为什么循环达到最大运行次数?,mysql,sql,stored-procedures,procedure,procedures,Mysql,Sql,Stored Procedures,Procedure,Procedures,我有一个MySQL存储过程,它将使用联邦表从远程服务器创建临时表。然后程序使用这些临时表来做一些工作 我看到了一些问题,我得到了一个错误,比如 Unable to connect to foreign data source Got timeout reading communication packets Unable to connect to foreign data source Got error 1430 from storage engine 这里的问题是,如果这些临时表未能创建

我有一个MySQL存储过程,它将使用联邦表从远程服务器创建临时表。然后程序使用这些临时表来做一些工作

我看到了一些问题,我得到了一个错误,比如

Unable to connect to foreign data source
Got timeout reading communication packets
Unable to connect to foreign data source
Got error 1430 from storage engine
这里的问题是,如果这些临时表未能创建,则整个过程将失败,因为这些表不存在

所以我想我可以在尝试创建临时表之后进行一些检查,如果尝试返回错误,那么我将返回并重试。为了停止无限循环,我在10次尝试后添加了一个条件

我遇到的问题是脚本退出,并且它不会一直运行到最后

这是程序的一部分,程序正在退出,但不确定原因

DELIMITER $$

CREATE DEFINER=`root`@`10.%` PROCEDURE `act`()
MAIN: 
BEGIN

DECLARE current_procedure_name CHAR(60) DEFAULT 'activities';
DECLARE last_run_time DATETIME DEFAULT NULL;
DECLARE current_run_time_start DATETIME DEFAULT NOW();

    -- set the SQL mode to ''
    SET SQL_MODE = '';

    -- set MySQL Safe mode OFF on update
    SET SQL_SAFE_UPDATES = 0;

SET @trys = 0;

loop_label:  LOOP

    SET  @trys :=  @trys+1;
    -- db.view_users is a federated table
    DROP TEMPORARY TABLE IF EXISTS view_users1, view_users2, view_users3;
    CREATE TEMPORARY TABLE view_users1 (KEY(user_id)) ENGINE=MEMORY AS 
    SELECT user_id, fullname
    FROM db.view_users;

    IF(@@error_count > 0 OR @trys > 10) THEN

        -- if there are too many tries to create the temporary table and it keeps failing Quit!!
        IF( @trys > 10) THEN
             LEAVE MAIN;
        ELSE 
            -- sleep for 10 seconds and go back to create the table again
            SELECT SLEEP(10);
            ITERATE  loop_label;
        END IF;


    END IF;

    CREATE TEMPORARY TABLE view_users2 (KEY(user_id)) ENGINE=MEMORY AS 
    SELECT * FROM view_users1;

    IF(@@error_count > 0) THEN
        ITERATE  loop_label;
    END IF;

    CREATE TEMPORARY TABLE view_users3 (KEY(user_id)) ENGINE=MEMORY AS 
    SELECT * FROM view_users1;

    IF(@@error_count > 0) THEN
        ITERATE  loop_label;
    END IF;

END LOOP;


-- set MySQL Safe mode back ON on update
    SET SQL_SAFE_UPDATES = 1;
END
我怎样才能知道它为什么要辞职?看起来@trys已经达到11岁了,但我不明白为什么会这样

我尝试在过程之外运行此代码,第二行返回0错误

DROP TEMPORARY TABLE IF EXISTS view_users1, view_users2, view_users3;
CREATE TEMPORARY TABLE view_users1 (KEY(user_id)) ENGINE=MEMORY AS 
SELECT user_id, fullname
FROM db.view_users;
SELECT @@error_count;

第二个问题,有没有更好的方法解决这个问题?重要的是,此过程始终运行。

我终于找到了问题的原因

从手册

循环中的语句将重复,直到循环结束 结束。通常,这是通过请假声明来完成的。 在存储函数中,还可以使用RETURN,它退出 完全起作用

在循环结束之前的末端;我需要添加LEAVE loop_标签来结束循环,否则它将继续,直到@trys达到11