Buildmerce

Magento 2 · Troubleshooting · Field guide 03

Magento 2 indexer stuck?
Diagnose the cause before resetting.

A “working” status can mean active processing—or an interrupted run. Compare progress, check the worker and trace the failure before changing state.

01 / ObserveState, mode and progress
02 / IsolateWorker, backlog or dependency
03 / RecoverTarget the cause, verify the result

The short answer: do not reset a status you have not explained

When a Magento 2 indexer appears stuck, identify its ID and mode, compare timestamped observations, then establish whether the worker is still active. Inspect the correlated error and downstream dependency before planning a targeted reset or reindex.

Resetting an indexer changes its recorded state; it does not fix a failing query, unavailable search service or insufficient memory. If a worker is still processing, a second intervention can create competing work. If the displayed data is stale despite a ready index, the next investigation may be cache or shopper context.

This guide focuses on indexing. For the surrounding systems, use the Magento 2 health checklist and our cron troubleshooting guide.

Scope and version differences

Examples target conventional Linux-hosted Magento Open Source and Adobe Commerce 2.4.x. They are documentation-reviewed, not a claim that this workflow has been executed on every patch release.

  • Run Magento CLI commands as the filesystem owner from the active release directory. Replace php with the configured CLI PHP binary.
  • Inspect state first; Magento bootstrap may still write operational files. SQL below uses SELECT only; run it through approved read-only access against the primary application database and apply your table prefix.
  • Process lists and logs can contain sensitive information. Inspect locally and share only sanitized evidence.
  • Cloud, containers, multi-node installations and SaaS search/catalog services need their own worker and service checks. A single host’s process list cannot establish global inactivity.
Check the exact release before applying a runbook
FeatureVersion note
Customer Grid modeBefore 2.4.8, Customer Grid supports Update on Save only; 2.4.8 onward also supports scheduled mode
Suspended status commandAdobe documents indexer:set-status from 2.4.7; check available commands and any planned suspension
Application lock modeAvailable from 2.4.3; configuration affects the reliability of observed status after a failure

Older tutorials can describe different behavior. Compare the installed version and hosting model with the current CLI reference.

Observe / Baseline

1. Identify the affected indexer and business symptom

Read-only inspection · application root
date -u
php bin/magento --version
php bin/magento indexer:info
php bin/magento indexer:status
php bin/magento indexer:show-mode

Record the exact ID, status, mode and observation time. Confirm that the Admin and shell point at the same environment. Begin with a known product or action rather than treating every indexer as suspect.

Starting points—not a complete dependency map
SymptomPossible indexerContext to record
Old product pricecatalog_product_priceSKU, website, customer group, currency and active rules
Wrong category membershipcatalog_category_product / catalog_product_categoryProduct assignment, category and store view
Missing storefront search resultcatalogsearch_fulltextEngine/service, visibility, stock and store view
Stock visibility inconsistencyinventory / cataloginventory_stockInventory configuration, stock/source assignment and salability rules

These symptoms can have non-indexing causes. For example, a price rule or customer-group difference can explain a displayed price without any stuck process. Verify the expected result before deciding which index needs recovery.

2. Separate indexer state, scheduled progress and shopper outcome

Treat these as three observations. The overall indexer status does not replace evidence of incremental progress, and neither observation alone proves the shopper sees the correct result.

Use the observation to choose an investigation
ObservationWhat to check nextWhat not to assume
Working / processingWorker activity, elapsed time and progress across snapshotsThat the process is necessarily stuck or alive
Reindex required / invalidCause of invalidation and whether scheduled work completesThat every invalid state requires an immediate full reindex
SuspendedPlanned import, maintenance owner and intended resume procedureThat a deliberate pause is an incident
Ready with growing scheduled backlogIncremental processing, incoming change rate and cronThat a ready label means no pending changes
Ready, no pending work, wrong storefrontStore scope, indexed result, rendering and cacheThat resetting the index is the next justified action

The Admin’s System → Tools → Index Management screen is a useful overview. Compare it with CLI evidence and the actual shopper context, especially if the screen has not been refreshed.

Observe / Two snapshots

3. Check whether processing is advancing

Take an initial snapshot, then repeat after a meaningful interval for this workload. Record normal import volume and expected processing time. A busy catalog can add changes faster than a healthy worker consumes them.

Read-only SQL · example price indexer, add table prefix
SELECT indexer_id, status, updated
FROM indexer_state
WHERE indexer_id = 'catalog_product_price';

SELECT view_id, mode, status, updated, version_id
FROM mview_state
WHERE view_id = 'catalog_product_price';

The indexer and materialized-view IDs can differ for custom implementations. Confirm the mapping in that module’s configuration; do not infer it from similar names. The updated column is not a guaranteed worker heartbeat. Raw state tables are supporting evidence, particularly when application locking is configured.

For a confirmed scheduled price view, inspect the newest changelog entry without counting the whole table:

Read-only SQL · only if this scheduled changelog exists
SELECT version_id AS newest_change_version
FROM catalog_product_price_cl
ORDER BY version_id DESC
LIMIT 1;

Compare the view’s processed checkpoint with successive observations. If it advances, work is being recorded as processed. If the newest change ID keeps advancing faster, incoming work may be outpacing processing. A static checkpoint during an idle period is not a failure.

Do not treat an ID difference as an exact product backlog. IDs can have gaps; changes can reference the same entity; cleanup and concurrent writes affect the snapshot. An empty or missing changelog also needs context: confirm the view, mode, prefix and cleanup behavior.

Do not “catch up” by manually advancing mview_state.version_id or truncating changelog tables. That can discard unprocessed evidence and leave derived data inconsistent.

4. Correlate workers, errors and dependencies

Read-only inspection · application root
# Linux example; rg requires ripgrep.
ps -eo pid,ppid,user,etime,args | rg "[b]in/magento (indexer:reindex|cron:run)"
tail -n 100 var/log/exception.log
tail -n 100 var/log/cron.log
df -h .
df -i .

Use the host’s process viewer if ripgrep is unavailable. Look at the actual process tree and hosting supervisor; scheduled jobs can run in child processes. In a cluster, check other nodes and any dedicated worker host. Absence from one filtered list does not establish that no worker exists.

Then correlate the affected indexer and time window with resource or dependency evidence:

  • Database: ask the operator to inspect active waits, long transactions and deadlocks. A waiting query can look like idle PHP.
  • PHP and host: check process termination, out-of-memory events, container limits and exhausted disk or inodes. CLI limits can differ from web PHP.
  • Search: for search indexing failures, inspect engine connectivity, authentication and service health. Do not expose private endpoints or credentials.
  • Deployment and extensions: match the first failure with release changes, missing classes or a custom indexer exception.

Capture a sanitized error signature and observation time. A working row left after termination and a genuinely active worker require different recovery plans. Do not kill every PHP process to make the status change.

5. Confirm the scheduled processing path

A full manual reindex may restore current output while the background path stays broken. For scheduled indexes, inspect the relevant cron jobs and recurring errors. Our bounded cron queries show how to compare due work with completed executions.

For advanced investigation, check the confirmed view subscription, trigger creation and module configuration. Use the Mview documentation and source matching the installed release. Do not run a generic “repair every trigger” recipe on an unknown schema.

Update on Save and Update by Schedule have different processing paths. A mode change is a maintenance operation, not an observational check. Adobe requires maintenance mode and disabled cron before switching indexer modes; plan restoration of both and verify normal processing afterward.

Before changing state

Record your recovery prerequisites

This checklist runs only in this page. It cannot inspect Magento, detect workers or certify that a reset is safe. Entries clear on reload.

4 prerequisites still unconfirmed

Continue the investigation before resetting or reindexing. An unknown worker state is an unresolved prerequisite.

Review worker and dependency evidence →

Recover / Smallest necessary intervention

6. Recover only after identifying the cause

Record the evidence, confirm worker state across the deployment, address the failure and agree a recovery window. Coordinate imports and scheduled work through the operator’s runbook so a manual command does not race another worker.

If an interrupted worker left a stale working state

Only after establishing that the relevant worker is no longer active, a targeted reset can invalidate its state. The following uses Product Price as an example; substitute the confirmed indexer ID:

State-changing example · not a diagnostic command
php bin/magento indexer:reset catalog_product_price

This does not rebuild data. It is not needed merely because a scheduled index has pending work, and it cannot repair the cause of a failure.

If a full rebuild is justified

After the operator confirms capacity and excludes conflicting work, run the affected indexer and retain its output:

Executes a rebuild · coordinate production workload first
php bin/magento indexer:reindex catalog_product_price

If it fails, investigate that error instead of repeatedly resetting and retrying. A successful full rebuild is one recovery observation; it does not establish that the next scheduled change will process.

If the indexer was intentionally suspended

Confirm who paused it and why, then follow the version-specific resume plan. Do not manually mark data valid to clear the warning. A label change is not evidence that all changes were indexed.

Avoid unscoped reset/reindex commands, database status edits, changelog deletion and simultaneous rebuilds. Omitted indexer IDs expand the operation to every indexer, increasing work beyond the symptom you are investigating.

Illustrative evidence

Worked example: the backlog grows while the worker progresses

This simulated timeline describes a scheduled view, not a real customer incident. The numbers are illustrative checkpoints, not counts of products.

Simulated snapshots · normalized to UTC
Time    Processed checkpoint    Newest change version
14:00   12000                   12600
14:05   12300                   13200
14:10   12800                   13500

Evidence: the processed checkpoint advances at every observation. The incoming change position advances too. The widening difference in the first interval does not by itself prove a dead worker.

Next investigation: compare import throughput, database waits and the business result. If ingestion slows but the checkpoint still advances and expected catalog changes arrive, investigate capacity rather than assuming interrupted execution.

Different branch: if the checkpoint stays fixed during sustained due work, correlate worker state and errors. A terminated worker with a stale status calls for a different runbook from a live process waiting on a database transaction.

Prove recovery through the next catalog change

  1. Capture the post-recovery status, mode and checkpoint using the same observations.
  2. Confirm the affected error stops recurring over an appropriate workload window.
  3. Observe a planned catalog update through the normal save/import path, preferably on staging first.
  4. Confirm scheduled processing advances without repeated manual intervention.
  5. Check the intended shopper outcome in the same website, store view, currency and customer context.
  6. Record the operator, cause, fix and next review in the store-health handoff checklist.

If the indexed result is correct but an anonymous product page is still old, investigate application rendering, full-page cache and the CDN. Broad cache flushing is not proof of an indexer fix.

Monitor progress, not just the status label

Watch processing age, recurring failures, import rate and expected catalog freshness. Define what “too long” means for this store rather than using a universal timeout. Check after PHP upgrades, release switches and import changes.

Review application-lock configuration with the operator against the installed release; Adobe documents its role in reporting failed runs more accurately. Do not publish the complete app/etc/env.php file when discussing that setting.

Buildmerce Health Guard includes indexer status monitoring, with scheduled monitoring and alerts described for Pro. Verify current edition and configuration. Do not assume status monitoring independently proves throughput, search correctness or the shopper’s price.

Common questions

Does indexer:reset reindex products?

No. It invalidates the recorded indexer state. A rebuild or normal scheduled processing is separate.

How long should an indexer stay working?

There is no universal safe duration. Compare workload, historical runtime, process activity and progress. A large rebuild and a stalled worker can display similar labels.

Why does reindexing fix it temporarily?

The manual rebuild may repair current derived data while cron, incremental processing or a recurring dependency failure remains unresolved. Verify the next normal update.

Can a ready indexer still be associated with stale prices?

Yes. Inspect scheduled progress and verify the same website, customer group, currency, rules and cache context before deciding the indexer is responsible.

Sources & revision notes

October 29, 2026 · First edition. Added diagnostic snapshots, worker checks, scoped recovery examples and an interactive prerequisite checklist. Examples are illustrative; commands have not been runtime-tested across every supported release.

Continue with cron troubleshooting, the full Magento health check, or all Magento guides. Send a correction if a release-specific behavior needs clarification.