2014-09-16 20 views
11

Występuję przy tym problemie za każdym razem, gdy próbuję zsynchronizować średniej wielkości obiekt JSON z moją bazą danych, abyśmy mogli wykonać pewne raportowanie na ten temat. Od sprawdzenia, co może spowodować, natknąłem się na te linki w tej sprawie.Błąd ogólny: 1615 Przygotowana instrukcja musi być ponownie przygotowana

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

Oba wydają mi punkt w kierunku table_definition_cache. Jednak jest to spowodowane tym, że problem mysqldump dzieje się na serwerze w tym samym czasie. Mogę was zapewnić, że tak nie jest. Ponadto zmniejszyłem kwerendę, aby wstawiać tylko jeden obiekt naraz.

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(); 
} 

To jest kod, który jest uruchomiony po zgłoszeniu błędu. Który zwykle przychodzi w formie.

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)) 

Który następnie następuje ten błąd powtórzony 3 razy.

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)) 

Jeśli ktokolwiek może wskazać mi właściwy kierunek, byłbym bardzo wdzięczny. Jestem bardziej ciekawy, co tak naprawdę wywołuje błąd, a następnie znajduję przyczynę tego konkretnego problemu. Wydaje się również, że jest dość powszechne w przypadku aplikacji wielopoziomowej podczas korzystania z ORM.

+0

Mam ten sam [Błąd] (http://stackoverflow.com/questions/31957441/laravel-general-error-1615-prepared-statement-needs-to-be-re-prepared/ 31957572), aby wybrać dane z mojego mariaDB. Zauważyłem, że to wyklucza tylko podczas pracy z widokiem sql. Jedyną różnicą jest to, że błąd pokazuje się dla mnie tylko 2 razy. Odkryłeś coś nowego? Dziękuję Ci bardzo! – Tenaciousd93

Odpowiedz

3

Ten błąd występuje, gdy trwa mysqldump. Nie ma znaczenia, który zrzut DB jest w toku. Poczekaj na zakończenie zrzutu i ten błąd zniknie.

Problem polega na tym, że definicja tabeli jest zrzucana, co powoduje ten błąd.

Tak próbowałem zmienić te ustawienia mysql, ale nadal występuje kiedyś (głównie podczas wykonywania ciężkich kopii zapasowych mysql/wysypisk w nocy) ..

table_open_cache 128 => 16384

table_definition_cache 1024 => 16384

+2

To właśnie znalazłem podczas rozglądania się, ale uruchamiamy mysqldump tylko o 2:00 i ten błąd wystąpi w dowolnym momencie w ciągu dnia, kiedy proces będzie działał. – mschuett

6

Podczas gdy mysqldump jest powszechnie podawaną przyczyną tego problemu, nie jest to jedyna.

W moim przypadku wykonanie rzemieślnika: migracja w dowolnej bazie danych spowoduje również ten błąd dla różnych baz danych na tym samym serwerze.

http://bugs.mysql.com/bug.php?id=42041 Wzmianki o blokadach stołowych/flush, które będą wywoływane w mysqldump, więc warto sprawdzić, czy masz jednocześnie migracje, blokady lub opróżnienia.

W przeciwnym razie spróbuj zmienić przygotowanie do emulacji.

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