Общая ошибка: 1615 Подготовленная заявка должна быть пересмотрена

Я сталкивался с этой проблемой каждый раз, когда я пытаюсь синхронизировать объект 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))

Если кто-то может указать мне в правильном направлении, я был бы очень благодарен. Мне больше любопытно, что на самом деле вызывает ошибку, а затем выясняет причину этой конкретной проблемы. Это также, по-видимому, несколько распространено в приложении laravel при использовании ORM.

Ответ 1

В то время как mysqldump является общепринятой причиной для этого, он не единственный.

В моем случае запущенный мастеринг: миграция в любую базу данных также приведет к этой ошибке для разных баз данных на одном сервере.

http://bugs.mysql.com/bug.php?id=42041 Упоминания таблиц блокировки/флеш, которые будут вызываться в mysqldump, поэтому стоит проверить, есть ли у вас какие-либо миграции, блокировки или флеши, происходящие одновременно.

Ошибка при попытке переключения готовых к эмулированию.

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

Ответ 2

Эта ошибка возникает, когда выполняется mysqldump. Не имеет значения, какой резерв DB выполняется. Подождите, пока дамп закончится, и эта ошибка исчезнет.

Проблема заключается в том, что определение таблицы сбрасывается, что вызывает эту ошибку.

Да, я попытался изменить эти параметры mysql, но он все равно встречается где-то (в основном при запуске тяжелых резервных копий mysql/дампов в ночное время).

table_open_cache 128 = > 16384

table_definition_cache 1024 = > 16384