Почему не работает после простановки индексов в MySQL?
Коллеги добрый вечер. После оптимизации WP Optimize в БД пропали уникальные ключи и индексы почти во всех таблицах. Бекапов нет. Проставил auto_increament, проставил первичный ключ и индексы по аналогии с другого сайта, но не запускаются плагины и сайт. Подскажите что еще может быть?
Fatal error: Uncaught RuntimeException: Error saving action: Error saving action: Duplicate entry '0' for key 'PRIMARY' in /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php:44 Stack trace: #0 /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php(242): ActionScheduler_DBStoreMigrator->save_action() #1 /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php(177): ActionScheduler_HybridStore->save_action() #2 /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php(84): ActionScheduler_ActionFactory->store() #3 /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/functions.php(36): ActionScheduler_ in /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php on line 44 |
Fatal error: Uncaught RuntimeException: Error saving action: Error saving action: Duplicate entry '0' for key 'PRIMARY' in /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php:44 Stack trace: #0 /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php(242): ActionScheduler_DBStoreMigrator->save_action() #1 /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php(177): ActionScheduler_HybridStore->save_action() #2 /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/ActionScheduler_ActionFactory.php(84): ActionScheduler_ActionFactory->store() #3 /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/functions.php(36): ActionScheduler_ in /home/service-reutov.ru/public_html/wp-content/plugins/wp-defender/vendor/woocommerce/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php on line 44
Дополнительно:
Наверное стоит посмотреть что собирается сохранить этот класс, в какую таблицу он собирается это делать, после чего посмотреть что творится в этой таблице, и как минимум show create table имя_таблицы привести
Fatal error: Uncaught RuntimeException: Ошибка при сохранении действия: Ошибка при сохранении действия: Duplicate entry '0' for key 'PRIMARY' in /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php:44 Stack trace: #0 /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php(242): ActionScheduler_DBStoreMigrator->save_action() #1 /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/ActionScheduler_ActionFactory.php(244): ActionScheduler_HybridStore->save_action() #2 /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/ActionScheduler_ActionFactory.php(114): ActionScheduler_ActionFactory->store() #3 /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/functions.php(81): ActionSch in /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php on line 44 |
Fatal error: Uncaught RuntimeException: Ошибка при сохранении действия: Ошибка при сохранении действия: Duplicate entry '0' for key 'PRIMARY' in /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php:44 Stack trace: #0 /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php(242): ActionScheduler_DBStoreMigrator->save_action() #1 /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/ActionScheduler_ActionFactory.php(244): ActionScheduler_HybridStore->save_action() #2 /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/ActionScheduler_ActionFactory.php(114): ActionScheduler_ActionFactory->store() #3 /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/functions.php(81): ActionSch in /home/art-buket.com/public_html/wp-content/plugins/woocommerce/packages/action-scheduler/classes/migration/ActionScheduler_DBStoreMigrator.php on line 44
другой сайт, таже проблема, только с другим плагином. Прям напасть какая-то.. 2 разных сайта с одной проблемой.. Стандартно там все, даже WORDPRESS переустанавливал..
Вы узнали что и в какую таблицу это класс сохраняет?
<?php /** * Class ActionScheduler_DBStoreMigrator * * A class for direct saving of actions to the table data store during migration. * * @since 3.0.0 */ class ActionScheduler_DBStoreMigrator extends ActionScheduler_DBStore { /** * Save an action with optional last attempt date. * * Normally, saving an action sets its attempted date to 0000-00-00 00:00:00 because when an action is first saved, * it can't have been attempted yet, but migrated completed actions will have an attempted date, so we need to save * that when first saving the action. * * @param ActionScheduler_Action $action * @param DateTime $scheduled_date Optional date of the first instance to store. * @param DateTime $last_attempt_date Optional date the action was last attempted. * * @return string The action ID * @throws RuntimeException When the action is not saved. */ public function save_action( ActionScheduler_Action $action, DateTime $scheduled_date = null, DateTime $last_attempt_date = null ){ try { /** @var wpdb $wpdb */ global $wpdb; $action_id = parent::save_action( $action, $scheduled_date ); if ( null !== $last_attempt_date ) { $data = [ 'last_attempt_gmt' => $this->get_scheduled_date_string( $action, $last_attempt_date ), 'last_attempt_local' => $this->get_scheduled_date_string_local( $action, $last_attempt_date ), ]; $wpdb->update( $wpdb->actionscheduler_actions, $data, array( 'action_id' => $action_id ), array( '%s', '%s' ), array( '%d' ) ); } return $action_id; } catch ( Exception $e ) { 44 строка throw new RuntimeException( sprintf( __( 'Error saving action: %s', 'action-scheduler' ), $e->getMessage() ), 0 ); } } } |
<?php /** * Class ActionScheduler_DBStoreMigrator * * A class for direct saving of actions to the table data store during migration. * * @since 3.0.0 */ class ActionScheduler_DBStoreMigrator extends ActionScheduler_DBStore { /** * Save an action with optional last attempt date. * * Normally, saving an action sets its attempted date to 0000-00-00 00:00:00 because when an action is first saved, * it can't have been attempted yet, but migrated completed actions will have an attempted date, so we need to save * that when first saving the action. * * @param ActionScheduler_Action $action * @param DateTime $scheduled_date Optional date of the first instance to store. * @param DateTime $last_attempt_date Optional date the action was last attempted. * * @return string The action ID * @throws RuntimeException When the action is not saved. */ public function save_action( ActionScheduler_Action $action, DateTime $scheduled_date = null, DateTime $last_attempt_date = null ){ try { /** @var wpdb $wpdb */ global $wpdb; $action_id = parent::save_action( $action, $scheduled_date ); if ( null !== $last_attempt_date ) { $data = [ 'last_attempt_gmt' => $this->get_scheduled_date_string( $action, $last_attempt_date ), 'last_attempt_local' => $this->get_scheduled_date_string_local( $action, $last_attempt_date ), ]; $wpdb->update( $wpdb->actionscheduler_actions, $data, array( 'action_id' => $action_id ), array( '%s', '%s' ), array( '%d' ) ); } return $action_id; } catch ( Exception $e ) { 44 строка throw new RuntimeException( sprintf( __( 'Error saving action: %s', 'action-scheduler' ), $e->getMessage() ), 0 ); } } }
в следующий раз
show create table wp_actionscheduler_actions;
там посмотреть параметр чему равен AUTO_INCREMENT и сравнить с количеством записей
SQL-запрос успешно выполнен.
show create table wp_actionscheduler_actions;
wp_actionscheduler_actions CREATE TABLE `wp_actionscheduler_actions` (
`act...
навожу мышкой пишет Исходный размер 1170
и все.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Ошибка
Duplicate entry '0' for key 'PRIMARY'после ручного восстановления индексов означает, что структура таблиц всё ещё некорректна: в таблице есть строки с ID0, неправильно настроенAUTO_INCREMENT, не тот первичный ключ или повреждены таблицы Action Scheduler. Простое «поставил индексы как на другом сайте» не гарантирует совпадение структуры, потому что версии WordPress, WooCommerce, Defender и Action Scheduler могут отличаться.Сначала сделайте дамп текущей БД, даже если она уже сломана. Потом проверьте конкретные таблицы Action Scheduler:
SHOW CREATE TABLE wp_actionscheduler_actions; SELECT action_id, COUNT(*) FROM wp_actionscheduler_actions GROUP BY action_id HAVING COUNT(*) > 1 OR action_id = 0; SHOW TABLE STATUS LIKE 'wp_actionscheduler_actions';
Для таблицы действий первичный ключ должен быть на ID действия, а поле должно быть автоинкрементным. Если в таблице есть записи с
action_id = 0, мигратор не сможет сохранять новые действия. Иногда проще аккуратно пересоздать таблицы Action Scheduler штатным способом плагина, но это зависит от того, есть ли там важные запланированные задачи.Проверьте также все стандартные таблицы WordPress через
wp db checkи сравнитеSHOW CREATE TABLEне с «похожим сайтом», а с чистой установкой той же версии и теми же плагинами. Без бэкапа это восстановление уже рискованное; на живом сайте лучше поднять копию, восстановить структуру там и только потом переносить исправления.