Summary
Your Magento 2 admin shows an indexer stuck on Processing, a Reindex required or Suspended status, or the storefront shows stale prices, missing products and empty category pages after an import or upgrade. On the command line, bin/magento indexer:status keeps reporting a state that never returns to Ready.
This guide gives you the fast isolation steps first. If you would rather hand it over, SazM fixes a stuck Magento 2 indexer for an affordable fixed price of $99, delivered within 48 hours, entirely in writing: no calls, no project manager, one senior developer.
Where the Error Usually Lives
Start by reading the indexer state and the logs before resetting anything:
bin/magento indexer:status
bin/magento indexer:show-mode
tail -n 200 var/log/system.log
tail -n 200 var/log/exception.log
tail -n 100 /var/log/php8.3-fpm.log
Typical lines and what they point to:
PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 20480 bytes)
-> the reindex process was killed mid-run, so the indexer stays in "working"
SQLSTATE[HY000]: General error: 1114 The table '/tmp/#sql...' is full
-> MySQL ran out of temporary table space during a large reindex
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock
-> cron-driven reindexing collided with an import or another indexer
Cannot initialize shutdown handler / process killed (OOM)
-> the OS killed PHP; check dmesg for "Out of memory"
A reindex that is killed never gets to write its final status, which is why the indexer looks stuck even though nothing is running.
Quick Fix Breakdown (DIY)
- Confirm nothing is still running. A genuinely running reindex must not be interrupted:
ps aux | grep -E "indexer|magento" | grep -v grep
bin/magento cron:status 2>/dev/null || true
- Check the stored state. A row stuck in
workingconfirms a killed process:
bin/magento indexer:status
mysql -e "SELECT indexer_id, status, updated FROM indexer_state;"
- Reset only the stuck indexer, then rebuild it:
bin/magento indexer:reset catalog_product_price
bin/magento indexer:reindex catalog_product_price
- Run the reindex with enough PHP memory from the CLI, instead of the web or cron default:
php -d memory_limit=4G bin/magento indexer:reindex
- Keep indexers on schedule, not on save, for large catalogs:
bin/magento indexer:set-mode schedule
In schedule mode, changes are processed by cron. Confirm cron really runs, otherwise "Reindex required" never clears.
- Check the changelog backlog for schedule-mode indexers. Large
*_cltables mean cron is not keeping up:
mysql -e "SELECT COUNT(*) FROM catalog_product_price_cl;"
- Look at the search engine (OpenSearch or Elasticsearch). If it is down or out of disk, the catalogsearch indexer fails and stays invalid:
curl -s localhost:9200/_cluster/health?pretty
- Do not rebuild everything during trading hours on a large catalog. A full
indexer:reindexcan lock tables and slow checkout.
If none of these isolates it within an hour, stop. Repeated resets without finding the cause usually make the backlog worse.
Hand It Over: $99 Fixed, Within 48 Hours
Most stuck indexers are not hard. They persist because the host, the extension vendor and the search service each point at someone else. One developer who reads the logs, finds what kills the reindex and fixes that root cause ends the loop.
What you get for $99:
- A fixed price agreed before work starts. One indexer issue, one flat fee, no hourly meter.
- Delivery within 48 hours of access, verified on staging before anything touches your live store.
- Fully written, fully async. You send the store URL, the Magento version and the output of
bin/magento indexer:status. You get questions, progress and proof in writing. There are no calls, meetings or project managers, so your time zone does not matter. - Written proof it works: the root cause in plain language, what changed, the indexer status showing Ready, and a rollback note.
- Money-back guarantee if the agreed root cause cannot be resolved.
- Safe access only: a separate admin account, staging first. Never send
app/etc/env.php, customer data or passwords through the inquiry form.
Behind it: 20+ years in production (since Oct 2006) and 100+ projects in the portfolio, including Magento 2 stores. Larger rebuilds or migrations are scoped separately by written fixed quote.
Get your Magento 2 store fixed for $99 → · Queue an urgent fix · See past projects
If the store is also slow after reindexing, the $199 Core Web Vitals fix can be done in the same window.
See also: Magento 2 checkout not working fix if checkout fails rather than catalog data.
Frequently Asked Questions
Why is my Magento 2 indexer stuck on Processing?
The reindex process was almost certainly killed (memory limit, OOM killer or a database error) before it could write its final status. Check var/log/system.log and dmesg, then reset only that indexer with bin/magento indexer:reset <indexer_code> and reindex it.
How do I fix "Reindex required" in Magento 2 admin?
Run bin/magento indexer:reindex for the affected indexer and make sure cron is running. In schedule mode, the status clears only after cron processes the changelog.
Is it safe to run indexer:reset?
It is safe once you have confirmed no reindex is actually running. It marks the indexer invalid so the next reindex rebuilds it from scratch, which can take a while on a large catalog.
How much does it cost to fix a stuck Magento 2 indexer?
SazM fixes one issue for an affordable fixed $99, delivered within 48 hours, with a money-back guarantee if the agreed root cause cannot be resolved. Typical agency hourly rates are higher and open-ended, while very low marketplace gig prices rarely include root-cause diagnosis, staging tests or a guarantee.
Do I need a call to explain the problem?
No. Send the store URL, the Magento version and the indexer status output. A written report is more precise than a call and becomes the test that proves the fix.