<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abhishek Singh</title>
    <description>The latest articles on DEV Community by Abhishek Singh (@abby3103).</description>
    <link>https://dev.to/abby3103</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3728253%2F4f8e440e-bb67-4c24-b188-ec2e37b2e487.jpg</url>
      <title>DEV Community: Abhishek Singh</title>
      <link>https://dev.to/abby3103</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abby3103"/>
    <language>en</language>
    <item>
      <title>Your Disaster Recovery Runbook Is Wrong, and the Auditor Knows It</title>
      <dc:creator>Abhishek Singh</dc:creator>
      <pubDate>Wed, 30 Sep 2026 14:23:01 +0000</pubDate>
      <link>https://dev.to/abby3103/your-disaster-recovery-runbook-is-wrong-and-the-auditor-knows-it-eli</link>
      <guid>https://dev.to/abby3103/your-disaster-recovery-runbook-is-wrong-and-the-auditor-knows-it-eli</guid>
      <description>&lt;p&gt;Every enterprise I have worked with has a disaster recovery runbook. Almost none of them have one that would work at 3 a.m.&lt;/p&gt;

&lt;p&gt;I know because I have been on the bridge when a real outage hit a site whose runbook was reviewed and approved eleven months earlier. The IP addresses were wrong. The database had been migrated to a new cluster. The vendor contact had left. The restore order listed a system that had been decommissioned and omitted the identity provider that everything else now depended on. We recovered, but we recovered from memory and from Slack, and the runbook was open on someone's second monitor as a formality.&lt;/p&gt;

&lt;p&gt;Then, two months later, the auditor asked for evidence that the DR plan had been tested, and the evidence pack was a folder of screenshots with no timestamps.&lt;/p&gt;

&lt;p&gt;This article is about the gap between a runbook that satisfies a review and a runbook that recovers a hospital, and the small set of practices that close it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why runbooks rot
&lt;/h2&gt;

&lt;p&gt;A DR runbook is a snapshot of an environment on the day it was written. The environment changes every week: new VMs, a migrated database, a changed replication target, a new dependency introduced by an application upgrade. Nobody updates the runbook for each change because the runbook lives in a Word document on SharePoint and the change lives in a ticket.&lt;/p&gt;

&lt;p&gt;The result is that a runbook is most accurate on the day it is approved and steadily less accurate every day after. By the yearly test it is wrong in ways that only show up during the test, and by the real disaster it is wrong in ways that show up at the worst possible moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a runbook actually has to contain
&lt;/h2&gt;

&lt;p&gt;Strip away the boilerplate and a working DR runbook has six parts. If any is missing, the document is a policy, not a runbook.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Declaration criteria and authority.&lt;/strong&gt; Who decides this is a disaster, on what evidence, and who they call first. Name the role and the person, with a phone number that was verified in the last ninety days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The dependency order.&lt;/strong&gt; Identity and network first, then data, then application, then edge. Written as a list that a tired engineer can follow, not a diagram they have to interpret. Every system has a tier, and no tier starts until the previous one is verified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-system restore steps&lt;/strong&gt; with the exact commands, console paths or recovery-plan names, the expected duration, the owner role, and the verification check that proves it worked. "Fail over the database" is not a step. "Run ASR recovery plan HIS-DB-DR; confirm SQL listener answers on 10.x.x.x; run the smoke query" is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contacts&lt;/strong&gt; — internal, vendor, client — with an escalation path. Verified, dated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication templates.&lt;/strong&gt; What the client's leadership is told at declaration, hourly, and at resolution. Written in advance because nobody writes well at 3 a.m.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failback.&lt;/strong&gt; How you get back to the primary site, which is the half of DR that nobody tests and everyone needs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The practices that keep it alive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Generate the dependency order from the inventory, not from memory
&lt;/h3&gt;

&lt;p&gt;The single biggest source of runbook error is the restore order being wrong because dependencies changed. The fix is to stop writing the order by hand. Pull the inventory from the source of truth — the cloud provider's resource graph, the CMDB, a maintained CSV for on-prem — and derive the order from the dependency edges. When a new database appears, it appears in the order; when a system is decommissioned, it drops out.&lt;/p&gt;

&lt;p&gt;This is not exotic. A spreadsheet with two columns, &lt;em&gt;system&lt;/em&gt; and &lt;em&gt;depends on&lt;/em&gt;, and a sort is enough for a small site. For a large one it is a query against the CMDB. Either way the order is regenerated, not remembered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diff the runbook against reality every week
&lt;/h3&gt;

&lt;p&gt;Once the inventory drives the runbook, checking for drift is cheap: compare this week's inventory to the one the approved runbook was built from. New systems, removed systems, changed replication status. Anything that differs is a flag on the runbook, and the runbook is not "current" until someone has looked at the flag.&lt;/p&gt;

&lt;p&gt;In practice this turns the yearly panic into a ten-minute weekly task, and it means the runbook the team opens during a real incident was last reconciled days ago, not months.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make the test produce evidence as a by-product
&lt;/h3&gt;

&lt;p&gt;The auditor's question is not "did you test DR?" It is "show me". Show the steps that were run, by whom, when, with what result, mapped to the control that requires it — HIPAA §164.308(a)(7)(ii)(D) for testing and revision, ISO 27001 A.17.1.3 for verifying continuity.&lt;/p&gt;

&lt;p&gt;The way to have that evidence is to not collect it afterwards. Run the drill from a checklist where each step records the operator, the start and end time, the pass or fail, and a screenshot or log excerpt at the moment of execution. When the drill ends, the evidence pack exists. Nobody spends the following week hunting screenshots.&lt;/p&gt;

&lt;p&gt;Two details make the pack audit-proof. Timestamps come from the system, not typed. And the finished pack is hashed — a SHA-256 printed on the cover — so that the auditor, or anyone, can confirm it was not edited after the fact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run tabletops between the real tests
&lt;/h3&gt;

&lt;p&gt;A full failover test once a year is expensive and disruptive, which is why it happens once a year. A tabletop — walking the runbook step by step against the current inventory, with the on-call team, without touching anything — takes ninety minutes and can happen quarterly. It finds the wrong IP and the departed vendor contact in a conference room instead of on a bridge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Close the findings before the next test
&lt;/h3&gt;

&lt;p&gt;Every test produces findings: a step that took twice as long as expected, a system that would not fail over cleanly, an RTO missed. The runbook is only as good as the fixes. Put each finding into the ticketing system with an owner and a due date, and make "open DR findings" a number that appears in the client's quarterly review. Findings with no owner are still open a year later; findings in a review deck get closed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the client sees
&lt;/h2&gt;

&lt;p&gt;When this works, the client-side experience changes in three ways. The IT director sees a readiness status that is green, amber or red &lt;em&gt;today&lt;/em&gt;, not a PDF dated last spring. The auditor receives a pack that answers the question without a follow-up. And the on-call engineer, at 3 a.m., opens a runbook that was reconciled last Tuesday and follows it.&lt;/p&gt;

&lt;p&gt;That last one is the point. Everything else is how you get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Every contact in the runbook verified in the last 90 days&lt;/li&gt;
&lt;li&gt;[ ] Restore order generated from the inventory, not written by hand&lt;/li&gt;
&lt;li&gt;[ ] Weekly drift check between inventory and approved runbook&lt;/li&gt;
&lt;li&gt;[ ] Every step has command, owner role, expected duration, verification check&lt;/li&gt;
&lt;li&gt;[ ] Drill run from a checklist that captures operator, timestamps, result, evidence&lt;/li&gt;
&lt;li&gt;[ ] Evidence pack mapped to controls and hashed&lt;/li&gt;
&lt;li&gt;[ ] Quarterly tabletop, annual full test&lt;/li&gt;
&lt;li&gt;[ ] Findings tracked with owners and reviewed with the client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If four or more are unticked, the runbook will fail when it is needed. Fix the order and the drift check first; they remove most of the risk for the least effort.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Abhishek Singh leads incident management and monitoring for enterprise healthcare clients on Azure, with seven years in enterprise IT operations including five at Acquia as a Senior Support Engineer.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>disasterrecovery</category>
      <category>azure</category>
      <category>security</category>
    </item>
    <item>
      <title>The RCA Nobody Reads: How to Write a Root Cause Analysis That Changes Something</title>
      <dc:creator>Abhishek Singh</dc:creator>
      <pubDate>Wed, 30 Sep 2026 10:37:28 +0000</pubDate>
      <link>https://dev.to/abby3103/the-rca-nobody-reads-how-to-write-a-root-cause-analysis-that-changes-something-529o</link>
      <guid>https://dev.to/abby3103/the-rca-nobody-reads-how-to-write-a-root-cause-analysis-that-changes-something-529o</guid>
      <description>&lt;p&gt;I have written a great many root cause analyses for enterprise healthcare clients. For the first year, almost none of them changed anything. The document went to the client, the client filed it, and three months later the same class of incident happened again.&lt;/p&gt;

&lt;p&gt;The problem was not the analysis. The problem was that I was writing the RCA for the wrong reader, in the wrong order, with the wrong ending. This is what I changed, and the structure I now use for every major incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who actually reads an RCA
&lt;/h2&gt;

&lt;p&gt;Four people read a root cause analysis, and they want different things.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;client's IT director&lt;/strong&gt; wants to know two things in the first thirty seconds: is it fixed, and will it happen again. They will not read past the first paragraph if the first paragraph does not answer both.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;on-call engineer&lt;/strong&gt; who will face the next similar incident wants the timeline and the detection gap: how long between the fault and the first alert, and what would have caught it sooner.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;change manager&lt;/strong&gt; wants to know whether a change caused it and whether the change process failed.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;auditor&lt;/strong&gt;, months later, wants evidence that an incident was investigated, actions were assigned, and actions were closed.&lt;/p&gt;

&lt;p&gt;Most RCAs are written for none of them. They are written for the engineer who did the investigation, in the order the investigation happened, ending with a list of everything that could conceivably be improved. That document serves the writer and no one else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structure that works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Two-sentence summary, up top
&lt;/h3&gt;

&lt;p&gt;Before the title if you can get away with it. Sentence one: what broke, for whom, for how long. Sentence two: the root cause and whether the permanent fix is in place.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Between 02:14 and 04:51 IST on a weeknight, the interface engine at a hospital site stopped delivering lab results to the EHR, affecting several departments. Root cause was a transaction log that filled the disk after a backup job failed silently; the log has been moved to a monitored volume and the backup job now alerts on failure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The IT director stops here, satisfied. Everyone else keeps reading.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Impact in the client's terms, not yours
&lt;/h3&gt;

&lt;p&gt;"Service degraded for 157 minutes" means nothing to a hospital. "Lab results for the emergency department were delayed by up to two and a half hours; no results were lost; a small number were re-sent manually by the lab" is what they need. Say what happened to the people who use the system. If you do not know, ask the client before you write the RCA, not after.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Timeline: fault, detection, response, resolution
&lt;/h3&gt;

&lt;p&gt;A table, not prose. Four columns: time, what happened, who or what noticed, what was done. Every row sourced from a log, a ticket or a chat timestamp, never from memory.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Detected by&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;01:40&lt;/td&gt;
&lt;td&gt;Nightly backup job fails; exits without error code&lt;/td&gt;
&lt;td&gt;Nobody&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;02:14&lt;/td&gt;
&lt;td&gt;Transaction log fills disk; interface engine stops writing&lt;/td&gt;
&lt;td&gt;Nobody&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;02:51&lt;/td&gt;
&lt;td&gt;Lab calls the help desk: results not appearing&lt;/td&gt;
&lt;td&gt;Human, 37 min later&lt;/td&gt;
&lt;td&gt;P1 raised&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;03:05&lt;/td&gt;
&lt;td&gt;On-call engineer joins bridge&lt;/td&gt;
&lt;td&gt;Ticket&lt;/td&gt;
&lt;td&gt;Investigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;03:40&lt;/td&gt;
&lt;td&gt;Disk identified as full; log truncated&lt;/td&gt;
&lt;td&gt;Engineer&lt;/td&gt;
&lt;td&gt;Service restored 03:52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;04:51&lt;/td&gt;
&lt;td&gt;Queued messages fully replayed&lt;/td&gt;
&lt;td&gt;Engineer&lt;/td&gt;
&lt;td&gt;Incident closed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The timeline is where the real findings hide. In this one, the fault happened at 01:40 and the first human knew at 02:51. That seventy-one-minute detection gap is a bigger finding than the disk being full.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Root cause: one sentence, then the chain
&lt;/h3&gt;

&lt;p&gt;State the root cause in one sentence a non-engineer can repeat. Then show the chain of contributing causes, because there is always a chain.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Root cause: the backup job failed without raising an alert, so the transaction log grew unchecked until the disk was full.&lt;/p&gt;

&lt;p&gt;Contributing causes: (a) the backup job's exit code was not monitored; (b) the disk hosting the transaction log had no growth-rate alert, only a static 90% threshold that fired at 02:11 into an unmonitored mailbox; (c) the interface engine does not raise its own alert when it stops writing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Use "five whys" if it helps you find the chain, but do not put "Why 1, Why 2, Why 3" in the document. The client does not care about your method.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. What we did, and what we will do
&lt;/h3&gt;

&lt;p&gt;Two lists, clearly separated. &lt;strong&gt;Immediate actions&lt;/strong&gt; are done and dated. &lt;strong&gt;Preventive actions&lt;/strong&gt; each have an owner, a due date and a way to verify closure. An action without an owner and a date is a wish.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Due&lt;/th&gt;
&lt;th&gt;Verified by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Transaction log moved to dedicated 200 GB volume&lt;/td&gt;
&lt;td&gt;Immediate&lt;/td&gt;
&lt;td&gt;DBA lead&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;td&gt;Change record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup job wrapped to alert on non-zero exit&lt;/td&gt;
&lt;td&gt;Preventive&lt;/td&gt;
&lt;td&gt;Backup owner&lt;/td&gt;
&lt;td&gt;Two weeks&lt;/td&gt;
&lt;td&gt;Test failure raises P2 in ServiceNow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk growth-rate alert added to all DB volumes at the site&lt;/td&gt;
&lt;td&gt;Preventive&lt;/td&gt;
&lt;td&gt;Monitoring lead&lt;/td&gt;
&lt;td&gt;Two weeks&lt;/td&gt;
&lt;td&gt;Alert definition attached&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface engine "no writes for 5 min" alert added&lt;/td&gt;
&lt;td&gt;Preventive&lt;/td&gt;
&lt;td&gt;Monitoring lead&lt;/td&gt;
&lt;td&gt;Two weeks&lt;/td&gt;
&lt;td&gt;Alert definition attached&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three to five actions. If you have twelve, you have not decided what matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Detection gap, called out on its own
&lt;/h3&gt;

&lt;p&gt;I now give this its own heading because it is the finding clients act on most. "The fault was detectable at 01:40 and was detected by a human at 02:51. With the two alerts above in place, detection would have been at 01:41." A number like that gets budget approved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things to stop doing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stop writing it chronologically.&lt;/strong&gt; The investigation went: symptom, hypothesis, dead end, second hypothesis, cause. The RCA goes: cause, impact, timeline, actions. Nobody needs your dead ends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop blaming, and stop hiding.&lt;/strong&gt; "Engineer X truncated the log without approval" belongs in the timeline as a fact, if it happened, with no adjective attached. But "human error" is never a root cause; it is a symptom of a missing control. Ask what would have made the error impossible or harmless, and write that as the action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop sending it a week later.&lt;/strong&gt; A draft RCA within 24 hours, with "under investigation" where needed, beats a perfect one after seven days. The client's leadership is being asked what happened today, not next Thursday.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test
&lt;/h2&gt;

&lt;p&gt;Before you send an RCA, read only the first paragraph and the actions table. If a reader who saw nothing else would know what happened, why, and what will stop it recurring, the document works. If they would need to read the middle to find that out, rewrite the top.&lt;/p&gt;

&lt;p&gt;A root cause analysis is not a record of your investigation. It is the instrument that makes the next incident not happen. Write it that way and people will read it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Abhishek Singh leads incident management and monitoring for enterprise healthcare clients on Azure, with seven years in enterprise IT operations including five at Acquia as a Senior Support Engineer.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>incidentresponse</category>
      <category>sre</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Cutting Alert Noise in Healthcare Operations: How We Took the Pager From Hundreds a Week to Dozens</title>
      <dc:creator>Abhishek Singh</dc:creator>
      <pubDate>Wed, 30 Sep 2026 10:35:02 +0000</pubDate>
      <link>https://dev.to/abby3103/cutting-alert-noise-in-healthcare-operations-how-we-took-the-pager-from-hundreds-a-week-to-dozens-100c</link>
      <guid>https://dev.to/abby3103/cutting-alert-noise-in-healthcare-operations-how-we-took-the-pager-from-hundreds-a-week-to-dozens-100c</guid>
      <description>&lt;p&gt;Every on-call engineer in healthcare IT knows the 3 a.m. page that turns out to be nothing. A disk at 81% on a server that has sat at 81% for six months. A CPU spike on a batch job that spikes every night by design. A "service down" alert for an endpoint that was down for forty seconds during a scheduled restart.&lt;/p&gt;

&lt;p&gt;None of these are incidents. All of them wake someone up. And in a hospital environment, where the same team is also carrying pages that matter — an interface engine backing up lab results, a clinical application server refusing logins at shift change — the noise does something worse than cost sleep. It teaches people to ignore alerts. The team that has been paged 400 times in a week for nothing is slower on the one page that is a patient-safety issue.&lt;/p&gt;

&lt;p&gt;This is a write-up of how our operations team took a fleet of enterprise healthcare clients from several hundred alerts a week to a few dozen, without turning off a single monitor that mattered. The tools were AppDynamics and LogicMonitor feeding ServiceNow. The principles apply to any stack — OpenTelemetry, Prometheus, Datadog, SigNoz — because the problem was never the tool. It was the rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Count before you tune
&lt;/h2&gt;

&lt;p&gt;The first thing we did was not touch a threshold. We exported four weeks of alerts from ServiceNow and grouped them three ways: by rule, by configuration item, and by outcome (did a human take an action, or close it as noise?).&lt;/p&gt;

&lt;p&gt;The result was uncomfortable and clarifying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;About a dozen rules produced the large majority of all alerts.&lt;/li&gt;
&lt;li&gt;Several rules had never once resulted in a human action.&lt;/li&gt;
&lt;li&gt;One "disk space warning" rule alone fired more than a thousand times a month across the estate.&lt;/li&gt;
&lt;li&gt;The alerts that &lt;em&gt;did&lt;/em&gt; lead to real incidents — interface queue depth, database log growth, application login failures — were a small fraction of the total and were buried in the rest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you take one thing from this article: do the count. Every ops team believes it knows which alerts are noisy. The export always disagrees with the belief.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Every alert must name an action
&lt;/h2&gt;

&lt;p&gt;We adopted one rule for the whole estate: an alert is allowed to exist only if it names the action a human should take when it fires. Not "disk at 80%". Instead: "disk at 80% and growing more than 2% per hour — extend the volume or purge the log directory."&lt;/p&gt;

&lt;p&gt;That single test killed a third of the rules outright. Static thresholds on metrics that never change had no action. Informational alerts that duplicated a dashboard had no action. Alerts on components with a healthy redundant pair had no action, because the failover already handled it.&lt;/p&gt;

&lt;p&gt;For the alerts that survived, writing the action down did two things. It forced us to set the threshold at the point where the action is actually needed, and it gave us the first line of the runbook for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Replace static thresholds with rate and duration
&lt;/h2&gt;

&lt;p&gt;Most of the remaining noise came from alerts that fired on a single sample. A server at 95% CPU for five seconds is not a problem; a server at 95% for fifteen minutes usually is.&lt;/p&gt;

&lt;p&gt;We changed the rule shape in LogicMonitor from "value above X" to "value above X for N consecutive polls", and where the metric had a natural rate — disk growth, queue depth, error count — we alerted on the rate rather than the level. In AppDynamics the equivalent was moving from static baselines to dynamic baselines with a minimum deviation window, so that the nightly batch job's spike was learned as normal rather than paged as abnormal.&lt;/p&gt;

&lt;p&gt;Two rules where this mattered most in a hospital context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interface engine queue depth.&lt;/strong&gt; A queue of 200 messages is normal at 7 a.m. and alarming at 2 a.m. We alerted on queue growth over ten minutes, not on the count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database transaction log growth.&lt;/strong&gt; A log at 60% is fine; a log that has gone from 40% to 60% in an hour will be full before anyone finishes their coffee. Rate, not level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step took the estate down by roughly two-thirds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Maintenance windows are not optional
&lt;/h2&gt;

&lt;p&gt;A surprising share of the remaining alerts were self-inflicted: patching windows, planned restarts, backup jobs. Every one of these was known in advance and every one of them paged someone.&lt;/p&gt;

&lt;p&gt;We made maintenance windows a hard part of the change process. A change request in ServiceNow that touched a monitored configuration item automatically created a suppression window in the monitoring tool for the change's duration, via a small integration. No window, no change approval.&lt;/p&gt;

&lt;p&gt;This is boring engineering and it removed a further meaningful slice of the weekly volume. It also stopped the worst habit on the team, which was manually silencing a whole host "for the patch" and forgetting to turn it back on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Correlate before you page
&lt;/h2&gt;

&lt;p&gt;By this point the remaining alerts were mostly real, but they still arrived one at a time. A network switch failing produced twelve alerts from twelve downstream servers, each opening its own ServiceNow incident, each paging.&lt;/p&gt;

&lt;p&gt;We used the event management layer to correlate on topology: if a parent configuration item is down, child alerts are attached to the parent incident rather than opening their own. Where topology was not modelled, we correlated on time and host group — five alerts from the same cluster within two minutes become one incident with five child events.&lt;/p&gt;

&lt;p&gt;The on-call engineer now got one page that said "switch X down, 12 services affected" instead of twelve pages that each said "service Y unreachable". Same information, one interruption, and the root cause is in the title.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Review the survivors monthly
&lt;/h2&gt;

&lt;p&gt;Alert rules rot. Applications change, capacity gets added, a threshold that was right in March is wrong in September. We put a thirty-minute monthly review on the calendar with one agenda: the ten noisiest rules from the last month, and the question "did any of these lead to an action?"&lt;/p&gt;

&lt;p&gt;Rules that did not are tuned or deleted. Rules that did are left alone. The review has caught rules that would otherwise have crept back to the old volume within a quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed for the people
&lt;/h2&gt;

&lt;p&gt;The numbers are the easy part: several hundred alerts a week to a few dozen, and the mean time to acknowledge a real incident dropped from over twenty minutes to a handful. The harder-to-measure change is that the on-call engineer now trusts the pager. When it goes off, something is wrong, and they move.&lt;/p&gt;

&lt;p&gt;In a hospital that is the outcome that matters. The interface engine backing up at 2 a.m. gets a human on it in minutes instead of being the fourteenth alert in a queue of noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist you can run this week
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Export four weeks of alerts. Group by rule and by outcome.&lt;/li&gt;
&lt;li&gt;Delete every rule that has never led to a human action.&lt;/li&gt;
&lt;li&gt;For every rule that survives, write the action in the alert text.&lt;/li&gt;
&lt;li&gt;Convert static thresholds to rate-or-duration conditions.&lt;/li&gt;
&lt;li&gt;Tie maintenance windows to your change process, not to memory.&lt;/li&gt;
&lt;li&gt;Correlate on topology or host group so one cause is one page.&lt;/li&gt;
&lt;li&gt;Put a monthly thirty-minute noise review on the calendar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this needs a new tool. It needs someone to do the count and be willing to delete rules that feel safe and are not.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Abhishek Singh leads incident management and monitoring for enterprise healthcare clients on Azure, with seven years in enterprise IT operations including five at Acquia as a Senior Support Engineer.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>monitoring</category>
      <category>sre</category>
      <category>healthcare</category>
    </item>
    <item>
      <title>Stop buying courses. Here is the 2026 DevOps Roadmap (Free Resources).</title>
      <dc:creator>Abhishek Singh</dc:creator>
      <pubDate>Tue, 03 Feb 2026 13:14:46 +0000</pubDate>
      <link>https://dev.to/abby3103/stop-buying-courses-here-is-the-2026-devops-roadmap-free-resources-43kp</link>
      <guid>https://dev.to/abby3103/stop-buying-courses-here-is-the-2026-devops-roadmap-free-resources-43kp</guid>
      <description>&lt;h2&gt;
  
  
  Get the Complete 2026 DevOps Roadmap &amp;amp; Interview Cheat Sheet here
&lt;/h2&gt;

&lt;p&gt;:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://abhishekairforce.gumroad.com/l/headhunter-database" rel="noopener noreferrer"&gt;Download The Headhunter's Database Here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used to think I needed to pay $5,000 for a bootcamp to get a remote job in DevOps. I was wrong.&lt;/p&gt;

&lt;p&gt;The best resources from Harvard, Google, and IBM are actually free—they are just hard to find.&lt;/p&gt;

&lt;p&gt;I spent the last 3 months curating verified resources to build my own "Personal Degree." I wanted to share the best ones here so you can save money.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Part 1: The AI &amp;amp; Data Science Roadmap
&lt;/h2&gt;

&lt;p&gt;These are the courses used by top engineers at FAANG companies.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Resource Name&lt;/th&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CS50's Introduction to AI&lt;/td&gt;
&lt;td&gt;Harvard&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Machine Learning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Machine Learning Crash Course&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deep Learning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deep Learning Specialization&lt;/td&gt;
&lt;td&gt;Andrew Ng&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLMs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ChatGPT Prompt Engineering&lt;/td&gt;
&lt;td&gt;DeepLearning.AI&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TensorFlow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TensorFlow Developer Cert&lt;/td&gt;
&lt;td&gt;Coursera&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ☁️ Part 2: The DevOps &amp;amp; Cloud Roadmap
&lt;/h2&gt;

&lt;p&gt;You don't need to learn everything. You just need these core skills.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Resource Name&lt;/th&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intro to Linux&lt;/td&gt;
&lt;td&gt;Linux Foundation&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Docker for Beginners&lt;/td&gt;
&lt;td&gt;KodeKloud&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;K8s Fundamentals&lt;/td&gt;
&lt;td&gt;CNCF&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Practitioner Essentials&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Terraform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terraform Associate Prep&lt;/td&gt;
&lt;td&gt;HashiCorp&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  💡 The "Secret" Interview Cheat Sheet
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdun6r0slprwqqoirz10r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdun6r0slprwqqoirz10r.png" alt=" " width="685" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also realized that 90% of technical interviews ask the same 5 Linux questions.&lt;/p&gt;

&lt;p&gt;Instead of memorizing textbooks, I built a &lt;strong&gt;"One-Page Cheat Sheet"&lt;/strong&gt; for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File Permissions (&lt;code&gt;chmod 744&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Log Analysis (&lt;code&gt;grep "Error"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Process Management (&lt;code&gt;kill -9&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It saves me about 5 hours of studying every week.&lt;/p&gt;




&lt;h3&gt;
  
  
  📥 Want the Full Database?
&lt;/h3&gt;

&lt;p&gt;I compiled all &lt;strong&gt;50+ Verified Resources&lt;/strong&gt;, the &lt;strong&gt;Linux/Docker Cheat Sheets&lt;/strong&gt;, and &lt;strong&gt;Ready-to-Deploy Terraform Code&lt;/strong&gt; into a clean, printable PDF Portfolio Kit.&lt;/p&gt;

&lt;p&gt;It costs $19 (less than a pizza), and it supports my work.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://abhishekairforce.gumroad.com/l/headhunter-database" rel="noopener noreferrer"&gt;Download The Headhunter's Database Here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>career</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AWS Disk Full? Why Deleting Logs Might Kill Your Database (And How to Fix It)</title>
      <dc:creator>Abhishek Singh</dc:creator>
      <pubDate>Fri, 23 Jan 2026 11:13:47 +0000</pubDate>
      <link>https://dev.to/abby3103/aws-disk-full-why-deleting-logs-might-kill-your-database-and-how-to-fix-it-4aid</link>
      <guid>https://dev.to/abby3103/aws-disk-full-why-deleting-logs-might-kill-your-database-and-how-to-fix-it-4aid</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg30k9r8hi3wu527qz5j9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg30k9r8hi3wu527qz5j9.jpg" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;strong&gt;Phase 1: Diagnosis (Don’t Panic, Verify)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before you run any "fix" commands, you need to confirm two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the disk actually full?&lt;/li&gt;
&lt;li&gt;Is InnoDB actually corrupted, or just stopped?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First, check the disk usage. 99% of the time, this is the root cause.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;df -h&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you see /dev/xvda1 at &lt;strong&gt;100%&lt;/strong&gt;, you have your culprit. But here is where most people mess up: &lt;strong&gt;Do not just start deleting random files.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need to find what is taking up space without touching the database files yet. Go to your data directory (usually &lt;em&gt;/var/lib/mysql&lt;/em&gt; or &lt;em&gt;/opt/bitnami/mysql/data&lt;/em&gt; on AWS images) and check the file sizes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd /var/lib/mysql&lt;br&gt;
du -h --max-depth=1 | sort -hr&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you see a massive list of &lt;em&gt;mysql-bin.0000X&lt;/em&gt; files, those are binary logs. They are safe to purge later, but if you delete them now while the process is hung, you risk breaking the replication chain or crash recovery.&lt;/p&gt;

&lt;p&gt;Next, check the logs to see if InnoDB is screaming for help.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tail -n 100 /var/log/mysql/error.log&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You are looking for the "Red Flag" error:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace mysqldb/users uses space ID: 5 at filepath: ./mysqldb/users.ibd&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or the classic:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[ERROR] InnoDB: Page [page id: space=0, page_number=5] log sequence number 123456 is in the future!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you see these, standard restarts won't work. The database is in a "Crash Loop." It tries to start, reads the corrupted file, panics, and shuts down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: The Surgical Fix (The Scary Part)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you see those InnoDB corruption errors, standard restarts will fail. You need to force the engine to start in "Read Only" mode so you can extract your data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: This process involves innodb_force_recovery. It is powerful, but if you use it wrong, you can permanently delete data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Stop everything&lt;/strong&gt;. Ensure the service is dead.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo service mysql stop&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: The Magic Config&lt;/strong&gt; Open your MySQL configuration file (usually /etc/mysql/my.cnf or /opt/bitnami/mysql/conf/my.cnf).&lt;/p&gt;

&lt;p&gt;Add this line under the [mysqld] section:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[mysqld]&lt;br&gt;
innodb_force_recovery = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How this works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with 1. This tells InnoDB to ignore corrupt pages and let you read the rest.&lt;/li&gt;
&lt;li&gt;If it doesn't start, change it to 2, then 3, up to 4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DANGER ZONE&lt;/strong&gt;: Levels 5 and 6 are destructive. Do not use them unless you have a snapshot backup and know exactly what you are doing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Start and Dump&lt;/strong&gt; Start the service again. If it comes up without crashing—congratulations. You are in "Life Support" mode. The database is read-only.&lt;/p&gt;

&lt;p&gt;Now, get your data out immediately:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mysqldump -u root -p --all-databases --routines --triggers &amp;gt; /tmp/full_backup.sql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command exports everything—tables, views, triggers—into a single file. Once this finishes, check the file size to make sure it looks right.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ls -lh /tmp/full_backup.sql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If that file exists and has size, you have successfully saved the company's data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: The Rebuild (Fresh Start)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that your data is safe in &lt;em&gt;/tmp/full_backup.sql&lt;/em&gt;, it’s time to fix the corrupted engine. We are not going to try to "repair" the files (which rarely works). We are going to nuke them and rebuild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Stop the service again.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo service mysql stop&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Remove the recovery flag.&lt;/strong&gt; Go back to my.cnf and **remove **or comment out the line we added earlier:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# innodb_force_recovery = 1  &amp;lt;-- Comment this out!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Move the corrupted data.&lt;/strong&gt; Do not rm it yet! Move it to a backup folder just in case.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo mv /var/lib/mysql /var/lib/mysql_corrupted_backup&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Initialize a fresh instance.&lt;/strong&gt; Create a new, empty data directory.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo mkdir /var/lib/mysql&lt;br&gt;
sudo chown mysql:mysql /var/lib/mysql&lt;br&gt;
sudo mysqld --initialize --user=mysql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Start and Import.&lt;/strong&gt; Start the service. It should come up instantly because it's empty. Now, pour your data back in:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mysql -u root -p &amp;lt; /tmp/full_backup.sql&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion: Don't Let It Happen Again&lt;/strong&gt;&lt;br&gt;
You saved the database, but you haven't fixed the root cause. If you don't set up &lt;strong&gt;Log Rotation&lt;/strong&gt;, that disk will fill up again in a month.&lt;/p&gt;

&lt;p&gt;As a quick fix, set your binary logs to expire automatically. In MySQL 8.0, run this inside the SQL prompt:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SET GLOBAL binlog_expire_logs_seconds = 259200; -- 3 Days&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, go grab a coffee. You earned it.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>database</category>
      <category>mysql</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
