2017-05-15 50 views
1

我必須在某個小時(可以說是00:00:00)每天在我的數據庫中清空我的一個表。我有這樣的過程:每1天執行一次存儲過程MySQL

CREATE DEFINER=`root`@`%` PROCEDURE `delete_day`() 
    BEGIN 
     TRUNCATE TABLE qmsos.module_queuemanagement_queue; 
    END 

我試圖使調用,每天重複這個像這樣的事件:

CREATE 
    EVENT `delete_queue_daily` 
    ON SCHEDULE EVERY 1 DAY STARTS '2017-05-12 00:00:00' 
    ON COMPLETION PRESERVE 
    DO CALL delete_day(); 

但它不工作。我試圖在一個特定的時間執行它只有一次,它的工作,但不是如果我想每天運行它。

+0

什麼是顯示事件的輸出; – lloiacono

+1

'qmsos','delete_queue_daily','root @%','SYSTEM','RECURRING',NULL,'1','DAY','2017-05-12 15:29:00',NULL,'ENABLED ','1','utf8','utf8_general_ci','latin1_swedish_ci' – Cecilia

回答

1

您的事件定義看起來沒問題。請驗證event_scheduler啓用通過執行:

SHOW VARIABLES LIKE 'event_scheduler'; 

如果它的關閉,然後:

SET GLOBAL event_scheduler = ON; 

全球event_scheduler系統變量確定事件計劃是否已啓用並在服務器上運行。它具有以下3個值中的一個,這會影響事件調度,如下所述:

  • OFF:Event Scheduler停止。事件調度程序線程 未運行,在SHOW PROCESSLIST的輸出中未顯示,並且沒有執行任何 預定事件。 OFF是 event_scheduler的默認值。

    當Event Scheduler停止時(event_scheduler爲OFF),可以通過將event_scheduler的值設置爲ON來啓動 。 (參見下一個 項目。)

  • ON:事件計劃程序已啓動;事件調度程序線程運行並執行所有預定的事件。該值使得該事件調度器不可操作:

    當事件調度爲ON時,事件調度器的線程在SHOW PROCESSLIST的輸出作爲守護進程

  • DISABLED列出 。當事件調度程序處於DISABLED狀態時,事件調度程序線程不會運行(因此不會顯示在SHOW PROCESSLIST的輸出中)。另外,Event Scheduler狀態不能在運行時更改。

UPDATE

要調試儘量簡化你的表達,並檢查通過執行調度線程運行:

SHOW FULL PROCESSLIST; 

對於即:

CREATE 
EVENT `delete_queue_daily_debug` 
ON SCHEDULE EVERY 1 DAY 
STARTS TIMESTAMP(NOW() + INTERVAL 1 MINUTE) 
DO CALL delete_day(); 
+0

值爲ON ...我不允許使用cron:/ – Cecilia

+0

使用cron的方式是一個巨大的安全漏洞。千萬不要在明文中寫明確的mySql密碼 – baao

+0

@ user32037:如果您至少使用cron,請使用[5.6.6 mysql_config_editor - MySQL配置實用程序](https://dev.mysql.com/doc/refman/ 5.7/EN/MySQL的 - 配置 - editor.html)。 – wchiquito

1

我無法重現這個問題。

在基本測試的存儲過程是每10秒執行:

mysql> SELECT VERSION(); 
+-----------+ 
| VERSION() | 
+-----------+ 
| 5.7.18 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> SET @@GLOBAL.event_scheduler = ON; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SHOW VARIABLES LIKE 'event_scheduler'; 
+-----------------+-------+ 
| Variable_name | Value | 
+-----------------+-------+ 
| event_scheduler | ON | 
+-----------------+-------+ 
1 row in set (0.00 sec) 

mysql> USE `qmsos`; 
Database changed 

mysql> DROP EVENT IF EXISTS `delete_queue_daily`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DROP PROCEDURE IF EXISTS `delete_day`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DROP TABLE IF EXISTS `module_queuemanagement_queue`, 
    ->      `audit_log`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `module_queuemanagement_queue` (
    -> `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY 
    ->); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO `module_queuemanagement_queue` 
    -> (`id`) 
    -> VALUES 
    -> (NULL), (NULL), (NULL), (NULL), (NULL); 
Query OK, 5 rows affected (0.00 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> CREATE TABLE IF NOT EXISTS `audit_log` (
    -> `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    -> `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE EVENT `delete_queue_daily` 
    -> ON SCHEDULE EVERY 10 SECOND STARTS '2017-05-12 00:00:00' 
    -> ON COMPLETION PRESERVE 
    -> DO CALL `delete_day`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `delete_day`() 
    -> BEGIN 
    -> INSERT INTO `audit_log` (`id`) VALUES (NULL); 
    -> TRUNCATE TABLE `module_queuemanagement_queue`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> SHOW EVENTS\G 
*************************** 1. row *************************** 
        Db: qmsos 
       Name: delete_queue_daily 
      Definer: [email protected] 
      Time zone: SYSTEM 
       Type: RECURRING 
      Execute at: NULL 
     Interval value: 10 
     Interval field: SECOND 
       Starts: 2017-05-12 00:00:00 
       Ends: NULL 
       Status: ENABLED 
      Originator: 0 
character_set_client: utf8mb4 
collation_connection: utf8mb4_general_ci 
    Database Collation: utf8mb4_general_ci 
1 row in set (0.00 sec) 

mysql> SELECT `id`, `created_at` 
    -> FROM `audit_log`; 
Empty set (0.00 sec) 

mysql> SELECT `id` 
    -> FROM `module_queuemanagement_queue`; 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
+----+ 
5 rows in set (0.00 sec) 

mysql> SELECT `id`, `created_at` FROM `audit_log`; 
+----+---------------------+ 
| id | created_at   | 
+----+---------------------+ 
| 1 | 2017-05-12 00:00:10 | 
+----+---------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT `id` FROM `module_queuemanagement_queue`; 
Empty set (0.00 sec)