【问题标题】:General error: 1615 Prepared statement needs to be re-prepared一般错误:1615 Prepared statement需要重新准备
【发布时间】:2014-11-10 12:06:51
【问题描述】:

每次我尝试将中等大小的 JSON 对象同步到我的数据库时都会遇到这个问题,以便我们可以对其执行一些报告。通过调查可能导致它的原因,我发现了有关此事的这些链接。

http://blog.corrlabs.com/2013/04/mysql-prepared-statement-needs-to-be-re.html http://bugs.mysql.com/bug.php?id=42041

两者似乎都将我指向 table_definition_cache 的方向。然而,这是说问题是由于服务器上同时发生了 mysqldump。我可以向你保证,情况并非如此。此外,我还精简了查询,一次只插入一个对象。

public function fire($job, $data) 
{
    foreach (unserialize($data['message']) as $org) 
    {
        // Ignore ID 33421 this will time out.
        // It contains all users in the system.
        if($org->id != 33421) {
            $organization = new Organization();
            $organization->orgsync_id = $org->id;
            $organization->short_name = $org->short_name;
            $organization->long_name = $org->long_name;
            $organization->category = $org->category->name;
            $organization->save();

            $org_groups = $this->getGroupsInOrganization($org->id);
            if (!is_int($org_groups))
            {
                foreach ($org_groups as $group)
                {
                    foreach($group->account_ids as $account_id)
                    {
                        $student = Student::where('orgsync_id', '=', $account_id)->first();
                        if (is_object($student))
                        {
                            $student->organizations()->attach($organization->id, array('is_officer' => ($group->name == 'Officers')));
                        }
                    }
                }
            }
        }
    }

    $job->delete();
}

这是抛出错误时正在运行的代码。通常以以下形式出现。

SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: insert into `organization_student` (`is_officer`, `organization_id`, `student_id`) values (0, 284, 26))

然后此错误重复 3 次。

SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: insert into `organizations` (`orgsync_id`, `short_name`, `long_name`, `category`, `updated_at`, `created_at`) values (24291, SA, Society of American, Professional, 2014-09-15 16:26:01, 2014-09-15 16:26:01))

如果有人能指出我正确的方向,我将不胜感激。我对实际触发错误的原因更加好奇,然后找到了这个特定问题的原因。在使用 ORM 时,它在 laravel 应用程序中似乎也很常见。

【问题讨论】:

  • 我有同样的error 绑定从我的mariaDB 中选择数据。我注意到它仅在使用 sql 视图时才会出现异常。唯一不同的是,这个错误对我来说只显示了 2 次。你有没有发现新的东西?非常感谢!

标签: mysql laravel mariadb


【解决方案1】:

当 mysqldump 正在进行时会发生此错误。正在进行哪个数据库转储并不重要。等待转储完成,此错误将消失。

问题在于表定义被转储导致此错误。

是的,我尝试更改这些 mysql 设置,但有时仍会发生(主要是在夜间运行大量 mysql 备份/转储时)..

table_open_cache 128=>16384

table_definition_cache 1024=>16384

【讨论】:

  • 这是我环顾四周时发现的,但我们只在凌晨 2 点运行 mysqldump,而且当进程运行时,这个错误会在一天中的任何时候发生。
【解决方案2】:

虽然 mysqldump 是常见的原因,但它并不是唯一的原因。

在我的情况下,在任何数据库上运行 artisan:migrate 也会为同一服务器上的不同数据库触发此错误。

http://bugs.mysql.com/bug.php?id=42041 提到将在 mysqldump 中调用的表锁定/刷新,因此值得检查您是否同时发生任何迁移、锁定或刷新。

尝试将准备切换为模拟失败。

'options'   => [
            \PDO::ATTR_EMULATE_PREPARES => true
        ]

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。在我的情况下,问题似乎是由使用本身使用其他视图的视图引起的,最终效果可能是需要几个毫秒来处理。这特别烦人,因为有时会发生错误,有时不会。我通过在存储过程中创建临时表而不是依赖于视图来编程解决它。运行数据库的服务器报告使用 MariaDb 版本。 10.2.35

    【讨论】:

    • 失败的 OP 的 SQL 语句是 insert。这与视图有何关系?
    【解决方案4】:

    如果我在[ \PDO::ATTR_EMULATE_PREPARES => true ] 之前有一个选项怎么办

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2014-08-04
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2021-06-24
      • 2011-10-21
      • 2012-02-24
      • 2021-12-16
      相关资源
      最近更新 更多