XF Bot Guard

XF Bot Guard 1.4.1

No permission to download
RE: cleanup cron for xf_zee_botguard_event (and likely _detail/_session too, same pattern).

I started digging into this because I noticed CPU usage ticked up a bit and free disk space has been steadily declining. That led me to check table sizes, and the BotGuard tables turned out to be the main consumer — xf_zee_botguard_event alone is ~1.6 GB with 2.4M+ rows.

I checked and the oldest row was 4.3 days old despite the 24h retention setting — and this was already the case under my previous "threads plus forums" monitoring scope, before I enabled "monitor all pages" a few hours ago. So the cleanup lag seems to be a pre-existing issue, not something newly caused by the wider monitoring scope (though the extra volume from "all pages" will make it worse).

When I manually triggered the cleanup cron, it deleted about 49K rows in that one run. Any suggestions?

It also batches the maximim it will delete in a single run, seems like you are exceeding that volume in growth. I will revise this approach and provide a patch today.
 
Code:
XF Bot Guard redacted support bundle
Generated at: 2026-06-14 22:46:11 UTC
Redaction: Sensitive values are redacted before display. Review before sending.

Environment
- xenforo_version: 2.3.9
- xenforo_version_id: 2030970
- php_version: 8.5.2
- php_version_id: 80502
- xf_bot_guard_version: 1.2.9
- xf_bot_guard_version_id: 1020970

Configuration
- enabled: Yes
- observe_only: No
- scope: guests
- protected_areas: all_public
- selected_routes: forums, threads
- selected_content_types: forum, node, thread
- custom_paths: None
- excluded_paths: 22 configured
- threshold: 50
- logging: Yes
- low_value_logging: No
- low_value_allow_sample_rate: 0%
- retention_hours: {
    "events": 336,
    "visitors_fingerprints_ips": 336,
    "sessions": 336,
    "counters": 336,
    "dashboard_snapshots": 17520,
    "zero_signal_ips": 2160
}
- origin_pressure: {
    "survival_mode_enabled": "No",
    "survival_retry_after_seconds": 60,
    "db_enter_pct": 70,
    "db_exit_pct": 50,
    "minimum_active_seconds": 120,
    "load1_per_core_pct": 300,
    "cpu_busy_pct": 98,
    "io_wait_pct": 30,
    "swap_out_pages_per_second": 128,
    "cache_seconds": 5
}
- event_detail_write: {
    "mode": "automatic",
    "mode_label": "Automatic under origin pressure",
    "origin_pressure_db_enter_pct": 70,
    "origin_pressure_db_exit_pct": 50,
    "origin_pressure_min_seconds": 120,
    "buffer_enter_pct": 70,
    "buffer_exit_pct": 50,
    "buffer_min_seconds": 120,
    "buffer_grace_seconds": 120,
    "buffer_shard_count": 8,
    "flush_max_rows": 5000,
    "flush_max_seconds": 20,
    "flush_rows_per_insert": 500
}
- cloudflare_edge: {
    "enabled": "No",
    "dry_run": "No",
    "raw_ip_storage": "No",
    "minimum_score": 90,
    "forgiveness_priority_cutoff": 160
}

Health checks
- Source: Stored/local diagnostics only. Building this bundle does not run a live Cloudflare API check.
- [ok] Add-on toggle: Enabled - Bot Guard is enabled.
- [ok] JavaScript collector: Enabled - The bundled collector is configured to load.
- [ok] CAPTCHA configuration: Cloudflare Turnstile - Bot Guard inherits XenForo CAPTCHA provider: Cloudflare Turnstile.
- [ok] Secure random generator: Available - PHP random_bytes() is available for Bot Guard token generation.
- [ok] PAGE_CONTAINER template modification: Enabled - The collector include is available on public pages.
- [ok] Collector JavaScript asset: Present - js/zee/botguard/botguard.js
- [ok] Bundled FingerprintJS asset: Present - js/zee/botguard/fingerprintjs/fp.min.js
- [ok] DigitalPoint Cloudflare guest page caching: Inactive - DigitalPoint Cloudflare add-on is not active.
- [warning] Shared full-page cache probe: Not checked - No cached shared-cache probe result is available. Run the live cache probe action to test public HTML caching.
- [warning] Cloudflare Edge Enforcement: Disabled - Cloudflare Edge Enforcement is disabled.
- [ok] Cloudflare dry run: Disabled - Cloudflare sync can write managed list changes.
- [ok] Effective Cloudflare sync mode: Live writes enabled - Cloudflare sync can write managed list changes.
- [warning] Cloudflare managed setup: Incomplete - Cloudflare Edge Enforcement setup is incomplete. Detailed configuration state requires viewBotGuardSensitive.
- [ok] Active local candidate count: 0 - Local active edge candidate aggregate count.
- [ok] Pending sync backlog size: 0 - Aggregate number of local rows waiting to be added to or removed from Cloudflare.
- [ok] Failed sync row count: 0 - Aggregate local rows with recent sync failures. Detailed diagnostics require viewBotGuardSensitive.
- [warning] Last successful sync age: Never - Cloudflare sync has not completed yet.
- [ok] Audit event logging: Enabled - Security audit rows can be retained.
- [ok] Low-value audit rows: Suppressed by default - Ordinary allow/skip rows are suppressed unless sampled.
- [ok] Low-value allow sample rate: 0% - Sampled low-value rows are retained only when low-value logging is disabled and this is greater than zero.
- [ok] Request gate fail-open evidence: None recorded - No request-gate fail-open marker is currently recorded in local health state.
- [ok] Event detail write mode: Automatic under origin pressure - Supplementary event detail rows write directly unless cached shared origin pressure is active.
- [warning] Origin pressure mode: Unknown - Could not read cached origin pressure state.
- [ok] Buffer path writable: Writable - The event detail buffer path is writable: [redacted-path]
- [ok] Pending detail files: 0 / 0 B - No pending event detail buffer files.
- [ok] Processing detail files: 0 - No detail files are currently processing.
- [ok] Failed detail files: 0 / 0 B - No failed detail buffer files.
- [ok] Last detail flush: 2026-06-14 22:46:09 / 2ms - Rows inserted last flush: 0. Rows failed last flush: 0.
- [ok] Event retention: 336 hours - Raw event rows older than this are removed by the cleanup cron. Manual visitor reports are retained for their 24-hour scoring window.
- [ok] Visitor/fingerprint-IP retention: 336 hours - Inactive visitor rows and fingerprint/IP relationship rows use the same visitor retention window. Lower values reduce long-horizon relationship memory.
- [ok] Session retention: 336 hours - Inactive session rows older than this are removed by cleanup, while unexpired trusted sessions are preserved.
- [ok] Counter retention: 336 hours - Operational counter buckets are cleaned by the normal cleanup cron after the configured raw retention window.
- [ok] Dashboard snapshot retention: 17520 hours - Compact hourly dashboard report snapshots are retained independently from raw event/session/visitor/counter data.
- [ok] Raw cleanup batching: Enabled - Cleanup deletes run in bounded batches of up to 1,000 rows, with a hard 5,000-row query limit, a 50,000-row per-table run cap, and a 20-second cleanup run budget. Partial runs resume naturally on the next cron run.
- [ok] Last cleanup run: No run recorded - A cleanup summary will be shown here after the cleanup cron has completed at least once with this version.
- [ok] Zero-signal IP pruning: Enabled / 2160 hours - Only stale xf_zee_botguard_ip rows with zero risk, zero reputation, no CAPTCHA history, no fingerprint/dynamic/protected-route activity, and NULL metadata are eligible for cleanup. Reputation-bearing or challenge-history IP rows are retained.
- [ok] Physical disk reclaim: 0 B reusable reported - No Bot Guard table with data currently shows notable reusable InnoDB space in cheap metadata. Bot Guard cleanup may remove old rows, but MySQL/InnoDB may not return disk space to the operating system until affected tables are rebuilt. Run OPTIMIZE TABLE or an equivalent online rebuild during a low-traffic maintenance window only if you need to reclaim disk immediately. Run one table at a time on l
- [ok] Known crawler trust: Disabled - Known crawler trust is disabled by default.
- [ok] Origin lockdown acknowledgement: Not acknowledged - Trusted proxy-derived known crawler, country and ASN headers are ignored unless this acknowledgement is recorded.
- [ok] Verified crawler IP allowlist: Enabled - Official crawler/fetcher CIDR ranges are allowed when matched locally.
- [ok] Known crawler source table: 12 rows approx / 48 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Known crawler range table: 2,866 rows approx / 1 MB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Known crawler sources: 12 enabled sources / 12 refreshed successfully / 2,886 ranges - Official crawler/fetcher source refresh state looks healthy.
- [ok] ASN range cache table: 0 rows approx / 80 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] ASN range cache: 0 configured ASNs - No decimal ASN entries are configured in the excluded or forced challenge network lists.
- [ok] Network CIDR JSON source table: 0 rows approx / 64 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Network CIDR JSON range table: 0 rows approx / 96 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Network CIDR JSON sources: 0 configured sources - No additional excluded or forced challenge CIDR JSON sources are configured.
- [ok] Reverse DNS hosting cache table: 0 rows approx / 80 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Reverse DNS hosting scoring: Enabled / 0 cached rows / 0 confirmed hosting matches / 0 recent resolver errors / 0 stale pending - Reverse-DNS hosting/datacenter scoring is enabled and the cache state looks healthy.
- [ok] Event table: 38 rows approx / 144 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Event detail table: 38 rows approx / 64 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Counter table: 42 rows approx / 64 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Contextual canary registry table: 0 rows approx / 112 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Dashboard snapshot table: 0 rows approx / 64 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Dashboard snapshot metric table: 0 rows approx / 48 KB - Approximate metadata from information_schema; no full COUNT(*) was run.
- [ok] Dashboard snapshot cron: Active hourly at :10 - Snapshot cron is configured and active.
- [warning] Latest dashboard snapshot: None - Dashboard snapshot table exists but no trusted snapshots have been generated yet.
- [warning] Dashboard snapshot backfill: No snapshots - Dashboard snapshot table exists but no trusted snapshots have been generated yet.
- [ok] Dashboard snapshot integrity: Clean - No premature snapshots, orphan metric rows, failed snapshot rows, stale backfill current-state rows, or ok non-empty snapshots without metrics were detected.
- [ok] Dashboard snapshot pruning: 17520 hours - Snapshot pruning is configured separately from raw cleanup and deletes metric rows before snapshot header rows.
- [ok] Hash secret / globalSalt: Available - Hashing is available for privacy-preserving identifiers.

Warning/error health rows
- [warning] Shared full-page cache probe: Not checked - No cached shared-cache probe result is available. Run the live cache probe action to test public HTML caching.
- [warning] Cloudflare Edge Enforcement: Disabled - Cloudflare Edge Enforcement is disabled.
- [warning] Cloudflare managed setup: Incomplete - Cloudflare Edge Enforcement setup is incomplete. Detailed configuration state requires viewBotGuardSensitive.
- [warning] Last successful sync age: Never - Cloudflare sync has not completed yet.
- [warning] Origin pressure mode: Unknown - Could not read cached origin pressure state.
- [warning] Latest dashboard snapshot: None - Dashboard snapshot table exists but no trusted snapshots have been generated yet.
- [warning] Dashboard snapshot backfill: No snapshots - Dashboard snapshot table exists but no trusted snapshots have been generated yet.

Recent event summaries
- #38 2026-06-14 22:45:26 UTC decision=observe event_type=sensitive_route risk=0 route=api/auth/validate-sso
- #37 2026-06-14 22:45:15 UTC decision=observe event_type=error_route risk=0 route=bot-guard/collect
- #36 2026-06-14 22:45:15 UTC decision=observe event_type=collector_nonce_context_mismatch risk=0 route=bot-guard/collect
- #35 2026-06-14 22:45:14 UTC decision=observe event_type=error_route risk=0 route=bot-guard/collect
- #34 2026-06-14 22:45:14 UTC decision=observe event_type=collector_nonce_context_mismatch risk=0 route=bot-guard/collect
- #33 2026-06-14 22:45:13 UTC decision=allow event_type=verified_crawler_allow risk=0 route=whats-new/studio-pages/1308047
- #32 2026-06-14 22:45:02 UTC decision=observe event_type=collector_nonce_context_mismatch risk=0 route=bot-guard/collect
- #31 2026-06-14 22:44:59 UTC decision=observe event_type=collector_nonce_context_mismatch risk=0 route=bot-guard/collect
- #30 2026-06-14 22:44:57 UTC decision=observe event_type=collector_nonce_context_mismatch risk=0 route=bot-guard/collect
- #29 2026-06-14 22:44:56 UTC decision=observe event_type=collector_nonce_context_mismatch risk=0 route=bot-guard/collect

Current page context
- source: support_bundle
Also note, it says:

But my health page says different:

This bundle helps a lot. The key detail is that the failures are specifically collector_nonce_context_mismatch, not a generic missing/reused nonce.

That means the collector token is present and valid enough to be parsed, but the context no longer matches when /bot-guard/collect runs. In this path Bot Guard binds the bootstrap collector token to the original page key, IP hash, and user-agent hash. Since you are not using Cloudflare and /online/ shows real IPs, I’m less suspicious of Cloudflare/proxy IP handling here. The next things I’d want to check are whether the posted page_key differs from the original request URI, whether the user-agent differs between the validating page and the collect POST, or whether the request is losing the bootstrap_interstitial=1 POST flag and going through the normal controller path instead of the early bootstrap path.

The cache probe difference also makes sense: the support bundle was generated at 2026-06-14 22:46:11 UTC and did not have a cached probe result available. Your health page probe was checked later at 22:47:33 UTC and reported no shared full-page cache HIT evidence. So that does not currently point to page caching as the cause.

Could you send one more capture from a failing attempt? Feel free to DM to me as this might include additional context you don't want to share in the discussion thread here.

Open the event detail for one of the collector_nonce_context_mismatch rows, and copy the redacted event detail/support data from that specific event.

At this point I can also confirm one real issue on our side: if bootstrap collection fails and falls back to the full challenge, the fallback challenge path is not preserving the original return URL correctly. That explains why /solve can send you to the default fallback route instead of the page that triggered validation. This is not a major bug, more so symptomatic of whatever is causing the mismatch on your install for everyone - but I'll patch that anyway.
 
zeeb0t updated XF Bot Guard with a new update entry:

Minor Release: v1.3.0

XF Bot Guard 1.3.0

Release type:
minor

  • Sets the X-Robots-Tag: noindex, nofollow, noarchive header on bot-guard/ routes, making a stronger effort to ensure well-behaved bots ignore Bot Guard routes instead of attempting to crawl AJAX endpoints and challenge pages.

  • Introduces a new option, Preserve inactive XenForo CAPTCHA keys. When enabled, which is off by default, this adjusts the standard XenForo CAPTCHA options area so inactive...

Read the rest of this update entry...
 
Thanks, I can confirm that so far it looks like this resolved the infinite challenge for all visitors that I was experiencing.
 
Thanks, I can confirm that so far it looks like this resolved the infinite challenge for all visitors that I was experiencing.

Excellent news! By the way, for your case, I’d suggest applying one of the preset quick settings or recommended settings, just in case any previous troubleshooting has moved things too far away from the defaults - and assuming you want to return to a baseline of the standard set of options.
 
Now that I have this working, I see another issue. I would recommend double-checking the ?_debug=1 view for a protected page. It looks like a bunch of queries are repeating unnecessarily. You can probably do some request-level caching to reduce this significantly.

For example, I see the following query referenced 8 times:
Code:
SELECT 1
                FROM xf_zee_botguard_self_server_ip
                WHERE ip_bin = ?
                  AND allow_until > ?
                LIMIT 1
Unless I'm missing something, this appears to just be checking the same 1 IP several times.
There are a number of different queries that repeat like this.
 
Now that I have this working, I see another issue. I would recommend double-checking the ?_debug=1 view for a protected page. It looks like a bunch of queries are repeating unnecessarily. You can probably do some request-level caching to reduce this significantly.

For example, I see the following query referenced 8 times:
Code:
SELECT 1
                FROM xf_zee_botguard_self_server_ip
                WHERE ip_bin = ?
                  AND allow_until > ?
                LIMIT 1
Unless I'm missing something, this appears to just be checking the same 1 IP several times.
There are a number of different queries that repeat like this.

Thanks - will check it out!
 
Now that I have this working, I see another issue. I would recommend double-checking the ?_debug=1 view for a protected page. It looks like a bunch of queries are repeating unnecessarily. You can probably do some request-level caching to reduce this significantly.

For example, I see the following query referenced 8 times:
Code:
SELECT 1
                FROM xf_zee_botguard_self_server_ip
                WHERE ip_bin = ?
                  AND allow_until > ?
                LIMIT 1
Unless I'm missing something, this appears to just be checking the same 1 IP several times.
There are a number of different queries that repeat like this.

BTW, it is possible that some queries will be repeated, as the different checks are modular and run independently of each other. In some cases, they may reference the same tables again.

That said, I’ll look at implementing a per-request or per-page query cache to cut down on repeated queries where the data is unlikely to change during the same page load.

This is especially likely because Bot Guard runs across five different stages of XenForo’s load order during a single page request, so having a request-level cache would be useful.
 
Last edited:
There are also various queries that check the table schema. If you really need to do this, you should do some kind of persistent caching (like a datastore entry), because it's really unnecessary to query the information_schema 5 times on every request.
 
An inexpensive way to do the information_schema check is as follows:

First, reading the code comments, I see the reason for no caching is concern over existing 1.2.2 or lower installations while uploading the 1.2.3 files, but before pressing upgrade (clicking upgrade temporarily disables an add-on, mooting the concern).

I also see in Setup that part of the 1.2.3 upgrade is permanently making the schema "binary".

So we can do a really simple check. 1.2.3 and earlier do not have an in-database key that specifies the version number, but the version number can still be inferred. 1.2.3 changed XF::options()->zeeBotGuardVisitorRetentionDays to ->zeeBotGuardVisitorRetentionHours. Therefore we can just check if the zeeBotGuardVisitorRetentionHours key exists. If it does, we can assume "binary". If the key does not exist, do the previous behavior of information_schema lookups.
 
An inexpensive way to do the information_schema check is as follows:

First, reading the code comments, I see the reason for no caching is concern over existing 1.2.2 or lower installations while uploading the 1.2.3 files, but before pressing upgrade (clicking upgrade temporarily disables an add-on, mooting the concern).

I also see in Setup that part of the 1.2.3 upgrade is permanently making the schema "binary".

So we can do a really simple check. 1.2.3 and earlier do not have an in-database key that specifies the version number, but the version number can still be inferred. 1.2.3 changed XF::options()->zeeBotGuardVisitorRetentionDays to ->zeeBotGuardVisitorRetentionHours. Therefore we can just check if the zeeBotGuardVisitorRetentionHours key exists. If it does, we can assume "binary". If the key does not exist, do the previous behavior of information_schema lookups.

Good find, I had planned in 1.3.0 to drop direct upgrade jump support for pre-data-conversion versions. So that is likely to now occur in a very near upcoming release, which, as you point out, will drop a lot of queries. But still, there are other candidates which missed some intended DB static caches in the single run-time, and they will be patched.
 
@pegasus @azzurro @akok @smallwheels

The latest update should hopefully address each of your findings. Please let me know how you go :D

I did a few manual cron runs of XF Bot Guard cleanup and now it goes for a while and now it gets timed out with a 504.

i checked the rows from xenforo.xf_zee_botguard_event and don't see any decrease. I'll try again later to see if anything changed.
 
I did a few manual cron runs of XF Bot Guard cleanup and now it goes for a while and now it gets timed out with a 504.

i checked the rows from xenforo.xf_zee_botguard_event and don't see any decrease. I'll try again later to see if anything changed.

It is probably likely the cron is running and your web server gave up waiting. Are you seeing any errors in the error log?
 
It is probably likely the cron is running and your web server gave up waiting. Are you seeing any errors in the error log?

Got it, looks like it did catch up as now manual runs complete quickly. According to Claude:
Total count is now roughly flat: 2,528,724 → 2,528,747 (+23 over the whole period). That's a big improvement — previously it was growing by ~80K. This suggests pruning is now roughly matching new inflow.


But "oldest" hasn't moved at all: still 2026-06-10 21:59:48, identical to the prior check. If pruning is matching inflow but the oldest timestamp is frozen, it looks like the cleanup is deleting from the "newer end of the backlog" (or wherever its query targets) but not actually reaching the oldest rows — so the table is staying the same size rather than shrinking toward the 24h target.

The 5 oldest rows are event_type verified_crawler_allow (4 rows) and collector_nonce_expired (1 row), all from 2026-06-10 22:01:44-45. If these event types have a different retention policy than the default 24h, that would explain why pruning isn't advancing past this point — otherwise, it looks like these types might be excluded from the cleanup query.
 
I did a few manual cron runs of XF Bot Guard cleanup and now it goes for a while and now it gets timed out with a 504.

i checked the rows from xenforo.xf_zee_botguard_event and don't see any decrease. I'll try again later to see if anything changed.

A 504 here doesn’t necessarily mean XF Bot Guard hit a PHP/XenForo error. Manual cron runs execute inside the admin web request, while cleanup is intentionally allowed to work in bounded batches for up to about 60 seconds. If the database has a backlog or the server/proxy timeout is shorter than that, the browser can see a 504 even though cleanup is still doing normal work and no XF error is logged.

The raw event row count also may not drop immediately. Cleanup removes matching event detail rows and normalized reason rows before deleting the parent rows from xf_zee_botguard_event.

Could you run this read-only query and send me the results? It tells us whether there are actually cleanup-eligible parent events, how old the main rows are, and whether cleanup may be spending time clearing child/detail rows first.

SQL:
SELECT
  COUNT(*) AS total_events,
  FROM_UNIXTIME(MIN(event_date)) AS oldest_event,
  FROM_UNIXTIME(MAX(event_date)) AS newest_event
FROM xf_zee_botguard_event;

SELECT COUNT(*) AS event_reason_rows
FROM xf_zee_botguard_event_reason;

SELECT COUNT(*) AS event_detail_rows
FROM xf_zee_botguard_event_detail;
 
A 504 here doesn’t necessarily mean XF Bot Guard hit a PHP/XenForo error. Manual cron runs execute inside the admin web request, while cleanup is intentionally allowed to work in bounded batches for up to about 60 seconds. If the database has a backlog or the server/proxy timeout is shorter than that, the browser can see a 504 even though cleanup is still doing normal work and no XF error is logged.

The raw event row count also may not drop immediately. Cleanup removes matching event detail rows and normalized reason rows before deleting the parent rows from xf_zee_botguard_event.

Could you run this read-only query and send me the results? It tells us whether there are actually cleanup-eligible parent events, how old the main rows are, and whether cleanup may be spending time clearing child/detail rows first.

SQL:
SELECT
  COUNT(*) AS total_events,
  FROM_UNIXTIME(MIN(event_date)) AS oldest_event,
  FROM_UNIXTIME(MAX(event_date)) AS newest_event
FROM xf_zee_botguard_event;

SELECT COUNT(*) AS event_reason_rows
FROM xf_zee_botguard_event_reason;

SELECT COUNT(*) AS event_detail_rows
FROM xf_zee_botguard_event_detail;
Just ran those and got:

+--------------+---------------------+---------------------+
| total_events | oldest_event | newest_event |
+--------------+---------------------+---------------------+
| 2527930 | 2026-06-10 22:09:38 | 2026-06-15 06:22:26 |
+--------------+---------------------+---------------------+
+-------------------+
| event_reason_rows |
+-------------------+
| 1913065 |
+-------------------+
+-------------------+
| event_detail_rows |
+-------------------+
| 2526972 |
+-------------------+
 
So not sure it is the same issue. I temporarily moved to a different host low spec server two three days ago and was suddenly destroyed by 500 errors. I moved back and it continued for a day. And has calmed down.

I checked at all places but couldn't find any log explaining the 500 problem. There were also a lot of defaultAjaxError @ core-compiled.js issues.
 
Just ran those and got:

+--------------+---------------------+---------------------+
| total_events | oldest_event | newest_event |
+--------------+---------------------+---------------------+
| 2527930 | 2026-06-10 22:09:38 | 2026-06-15 06:22:26 |
+--------------+---------------------+---------------------+
+-------------------+
| event_reason_rows |
+-------------------+
| 1913065 |
+-------------------+
+-------------------+
| event_detail_rows |
+-------------------+
| 2526972 |
+-------------------+

Please run this again in an hour or so, and hopefully we see further reduction.
 
Back
Top Bottom