2017-05-15 52 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)