我有MySQL存儲過程,將使用FEDERATED表從遠程服務器創建臨時表。然後程序使用這些臨時表來做一些工作。如何解決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;
第二個問題,有沒有更好的方法解決這個問題?這個程序一直運行非常重要。