没有错误但没有执行?

vatpfxk5  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(453)

最后更新
我将在mysql教程中介绍这个自动分区维护,它详细介绍了基于日期范围删除和添加mysql表分区的一般方法。
其思想是,您可以在一段时间后自动丢弃旧的表数据,并根据需要为当前数据创建新的表分区。
但是,由于我的站点可能会托管在“共享”提供程序包上,因此mysql事件可能对我不可用。
因此,我对第一个教程中描述的存储过程进行了交叉优化,使用另一种方法调用它们,该方法使用堆栈溢出答案中详细介绍的方法,并进行了一些修改:mysql分区维护脚本
在我的本地测试机器上,我想从webmin将php脚本作为cron作业运行。
当我使用mysql测试数据库从adminer(其功能与phpmyadmin类似)运行存储过程时,它们按预期执行-删除分区,整个过程需要几分钟才能完成。
然而,当我从webmin作为cron作业运行修改后的php脚本时,似乎什么也没发生。没有错误,但脚本立即返回“ok”。
类似地,当我从lamp机器的shell运行脚本时,它立即返回“ok”。
这是php脚本:


# !/usr/bin/env php

<?php
$connection = mysqli_connect('localhost', 'my_username', 'my_password', 'employees');
$result = mysqli_query($connection, "CALL perform_partition_maintenance('employees', 'titles', 3, 216, 5)") or die('Query fail: ' . mysqli_error($connection));
if ($result)
  echo "OK";
else
  echo "FAIL";
mysqli_close($connection);

如果你能给我一些建议,告诉我哪里会出错,我会非常感激的。
更新
根据尼克的建议,我添加了很多调试语句。我走了一条稍有不同的路线,因为这更容易一点——很多新的“into-outfile”语句。
但我所观察到的让我困惑。存储过程的一小部分如下:

OPEN cur1;
    read_loop: LOOP
      FETCH cur1 INTO current_partition_name;
      IF done THEN
         LEAVE read_loop;
      END IF;

      IF ! @first AND p_seconds_to_sleep > 0 THEN
        SELECT CONCAT('Sleeping for ', p_seconds_to_sleep, ' seconds');
        SELECT SLEEP(p_seconds_to_sleep);
      END IF;

      SELECT CONCAT('Dropping partition: ', current_partition_name);

      ...

      SET @first = FALSE;
    END LOOP;
  CLOSE cur1;

这些都是从geoff montee的页面上的web教程中获取的,未经修改,并且在其他上下文中完美地工作(例如,在adminer中,从sql控制台-只是不与php脚本结合使用)。然而,当我评论说:

SELECT CONCAT('Dropping partition: ', current_partition_name);

一切都很顺利,但当我把那句话放回去的时候,剧本就窒息了。我搞不懂这个。特别是在测试中,我将“current\u partition\u name”写入磁盘上循环前三次迭代的文件中,在这种情况下引用字符串不会引起任何问题。这很奇怪。
另一个(显然没有解决的)stackoverflow问题听起来有些类似。

2wnc66cl

2wnc66cl1#

后来,我意识到当一个表有外键时分区是不可用的。当我第一次将分区作为一个选项进行探索时,我不确定我是如何忽略了这个基本细节的。
这是非常不幸的,因为它使整个练习变得多余。我将不得不研究某种涉及常规表删除的解决方案,以及所有相关的头痛问题。
另外,我还不太明白为什么注解掉geoff montee存储过程中的那一行对于让函数在从php调用时成功运行是至关重要的。我很想把它归结为一个解释器错误(我在我的测试环境中运行mysql 5.5.62),但是正如前面提到的,当从adminer启动时,存储过程可以完美地执行。

相关问题