Почему не работает после простановки индексов в MySQL?

Ссылка скопирована
1 ответ

Коллеги добрый вечер. После оптимизации 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 переустанавливал..

  • Дмитрий Сериков, до тех пор пока вместо того что бы понять что происходит вы будете делать что нибудь рандомное в надежде что это как нибудь поможет - будет такая хрень.

    Вы узнали что и в какую таблицу это класс сохраняет?

  • Дмитрий, файл ActionScheduler_DBStoreMigrator.php
    <?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 ); } } }

  • Дмитрий Сериков, это здорово что вы привели мне код этого класса. Однако из него не понятно в какую таблицу лезет этот класс, потому что насколько я могу судить код сохранения хранится в save_action родительского класса. Мне кажется стоит вам посмотреть и найти название таблицы - и потом сделать у нее show create table
  • Дмитрий, записывается в wp_actionscheduler_actions, я удалил все данные в этой таблице, потом в структуре поставил AI и все заработало, спасибо за пинок в нужном направлении))
  • Дмитрий Сериков, и опять вы за свое. не разбираясь сделать что то. нельзя так работать в айти. сначала понять - потом исправлять.

    в следующий раз
    show create table wp_actionscheduler_actions;
    там посмотреть параметр чему равен AUTO_INCREMENT и сравнить с количеством записей

  • Дмитрий, localhost/serv_reutov/
    SQL-запрос успешно выполнен.

    show create table wp_actionscheduler_actions;

    wp_actionscheduler_actions CREATE TABLE `wp_actionscheduler_actions` (
     `act...

    навожу мышкой пишет Исходный размер 1170
    и все.

  • Дмитрий Сериков, ну он вам вывел только часть ответа. вам стоит посмотреть полностью. но в данный момент если вы удалили все записи - смысла это продолжать нет.
  • Дмитрий, ну да, все равно спасибо
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Дмитрий К. Ответ

    Ошибка Duplicate entry '0' for key 'PRIMARY' после ручного восстановления индексов означает, что структура таблиц всё ещё некорректна: в таблице есть строки с ID 0, неправильно настроен 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';

    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 не с «похожим сайтом», а с чистой установкой той же версии и теми же плагинами. Без бэкапа это восстановление уже рискованное; на живом сайте лучше поднять копию, восстановить структуру там и только потом переносить исправления.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно