中サイズのJSONオブジェクトをデータベースに同期しようとするたびにこの問題が発生し、レポートを実行できるようになりました。何が原因であるかを調べることから、私はこの問題に関するこれらのリンクに出くわしました。
http://blog.corrlabs.com/2013/04/mysql-prepared-statement-needs-to-be-re.htmlhttp://bugs.mysql.com/ bug.php?id = 42041
どちらも私をtable_definition_cacheの方向に向けているようです。ただし、これは、問題がサーバーで同時に発生するmysqldumpが原因であると言っています。私はあなたにこれが事実ではないことを保証することができます。さらに、クエリをスリム化して、一度に1つのオブジェクトのみを挿入しました。
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アプリケーションでもある程度一般的であるようです。
Mysqldumpがこれについて一般的に報告されている原因ですが、それだけではありません。
私の場合、任意のデータベースでartisan:migrateを実行すると、同じサーバー上の異なるデータベースでもこのエラーが発生します。
http://bugs.mysql.com/bug.php?id=42041 mysqldumpで呼び出されるテーブルlocks/flushについて言及しているため、移行、ロック、またはフラッシュが同時に発生していないかどうかを確認する価値があります。 。
エミュレートする準備を切り替えてみてください。
'options' => [
\PDO::ATTR_EMULATE_PREPARES => true
]
このエラーは、mysqldumpの進行中に発生します。どのDBダンプが進行中であるかは関係ありません。ダンプが終了するのを待つと、このエラーは消えます。
問題は、このエラーの原因となるテーブル定義のダンプにあります。
ええ、私はこれらのmysql設定を変更しようとしましたが、それでもいつか発生します(ほとんどの場合、夜間に大量のmysqlバックアップ/ダンプを実行しているとき)。
table_open_cache 128 => 16384
table_definition_cache 1024 => 16384