{"id":13966,"date":"2025-11-13T05:20:04","date_gmt":"2025-11-13T13:20:04","guid":{"rendered":"https:\/\/www.pingcap.com\/?p=13966"},"modified":"2025-11-19T07:36:07","modified_gmt":"2025-11-19T15:36:07","slug":"achieving-zero-downtime-upgrades-tidb","status":"publish","type":"post","link":"https:\/\/www.pingcap.com\/ko\/blog\/achieving-zero-downtime-upgrades-tidb\/","title":{"rendered":"Zero-Downtime Upgrades: How TiDB Powers Always-On Databases"},"content":{"rendered":"<p>In the vast landscape of databases, ensuring zero-downtime upgrades and operation continuity remains a challenge. Due to inherent design limitations, traditional databases often introduce significant downtime during upgrades &#8211; a challenge that can spell operational chaos for businesses reliant on real-time data access.&nbsp;<\/p>\n\n\n\n<p>Enter TiDB, a cutting-edge distributed SQL database that offers a solution to overcome this challenge. Built on a robust, <a href=\"https:\/\/www.pingcap.com\/ko\/tidb\/cloud\/\">cloud-native<\/a>, and loosely coupled architecture, TiDB introduces online rolling upgrades &#8211; a feature that enables zero-downtime upgrades with uninterrupted operations.<\/p>\n\n\n\n<p>In this post, we will explore the unique and easy-to-use upgrading mechanisms of TiDB with a hands-on demonstration.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Why_Zero_Downtime_Matters_in_Production_Environments\"><\/span>Why Zero Downtime Matters in Production Environments<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>When production goes dark, the meter spins fast. Recent industry surveys show the <a href=\"https:\/\/itic-corp.com\/itic-2024-hourly-cost-of-downtime-report\/\">average cost of an hour of IT downtime now exceeds $300,000 for most mid-to-large enterprises<\/a>, and a significant share report $1\u20135 million per hour depending on the workload and industry. <\/p>\n\n\n\n<p>Uptime Institute\u2019s outage analyses reinforce the trend: <a href=\"https:\/\/uptimeinstitute.com\/resources\/research-and-reports\/annual-outage-analysis-2023?utm_source=chatgpt.com\">major incidents are costly<\/a> and increasingly scrutinized by regulators and boards, which raises the bar for resilience and change safety. Even conservative calculators place typical downtime between <a href=\"https:\/\/www.atlassian.com\/incident-management\/kpis\/cost-of-downtime?utm_source=chatgpt.com\">$100k and $540k per hour<\/a>, which aligns with many teams\u2019 internal incident postmortems. In short, every planned maintenance window you eliminate and every risky schema change you can do online directly protects revenue, reputation, and SLOs.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Industry<\/th><th>Typical Range (USD\/hr)<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Financial Services<\/td><td>$300,000 \u2013 $5,000,000+<\/td><td>Large enterprises frequently report \u2265$300k\/hr; high-stakes incidents can exceed $1\u20135M\/hr.<\/td><\/tr><tr><td>E-commerce \/ Retail<\/td><td>$140,000 \u2013 $1,000,000<\/td><td>Common \u201cper minute\u201d averages translate to ~$140k\u2013$540k+\/hr, with <a href=\"https:\/\/www.atlassian.com\/incident-management\/kpis\/cost-of-downtime\">peaks higher for major events<\/a>.<\/td><\/tr><tr><td>SaaS \/ Cloud<\/td><td>$300,000 \u2013 $1,000,000+<\/td><td>Mid-to-large enterprises commonly cite \u2265$300k\/hr; severe incidents can cross $1M.<\/td><\/tr><tr><td>Manufacturing<\/td><td>$260,000 \u2013 $1,360,000+<\/td><td>Benchmarks cluster around ~$260k\/hr; <a href=\"https:\/\/gitnux.org\/manufacturing-downtime-statistics\/\">recent reports show averages &gt;$1.3M\/hr in some regions<\/a>. <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>What this means for zero-downtime upgrades in TiDB:<\/strong> If your environment runs dozens of services across shared database clusters, the difference between online DDL\/rolling upgrades and even a brief maintenance window can be six figures per incident. Investing in automation for online schema evolution, rolling restarts, and version changes is not a \u201cnice to have.\u201d It is a material cost saver that keeps roadmaps moving on schedule.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Challenges_of_Traditional_Database_Upgrades\"><\/span>Challenges of Traditional Database Upgrades<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Legacy database platforms still assume stop-and-wait maintenance windows, which clashes with 24\u00d77 SaaS and fintech realities. Teams struggle with true online schema change: blocking DDL, long locks, and table copies that spike IO and trigger timeouts. To dodge outages they bolt on brittle dual-writes, triggers, or shadow tables, adding risk while slowing delivery. Upgrades also collide with versioning conflicts across ORMs, client drivers, and SQL dialects; planner differences, reserved keywords, and collation quirks cause regressions and rollbacks.<\/p>\n\n\n\n<p>Without first-class rolling updates, many stacks require cluster-wide restarts or read-only windows, producing scheduled downtime, cache thrash, and retry storms. These stop-and-wait techniques may work for small fleets, but they collapse under multi-region, multi-tenant load, amplifying queue backlogs and replica lag. The takeaway: If your upgrade path depends on blocking DDL, coordinated app outages, or all-at-once node restarts, you are carrying avoidable risk\u2014precisely the gap zero-downtime approaches like TiDB are built to close.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"TiDBs_Distributed_SQL_Architecture_for_Zero_Downtime\"><\/span>TiDB\u2019s Distributed SQL Architecture for Zero Downtime<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Traditional databases often use &#8220;stop-and-wait&#8221; techniques, freezing all operations for the time-consuming upgrade process. In contrast, TiDB uses an online rolling upgrade strategy. This approach ensures zero-downtime upgrades by upgrading components in a specific sequence:&nbsp;<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Placement Driver (PD) servers&nbsp;<\/li>\n\n\n\n<li>The TiKV servers<\/li>\n\n\n\n<li>The TiDB servers<\/li>\n<\/ol>\n\n\n\n<p>Each server upgrades one at a time, ensuring that other servers seamlessly handle the incoming load, resulting in a smooth and uninterrupted upgrade experience.<\/p>\n\n\n\n<p>Here&#8217;s a closer look at how each key component contributes to the process:<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"877\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-9.png\" alt=\"\" class=\"wp-image-13979\" style=\"width:840px;height:460px\" srcset=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-9.png 1600w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-9-300x164.png 300w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-9-1024x561.png 1024w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-9-768x421.png 768w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-9-1536x842.png 1536w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-9-1440x789.png 1440w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 1. Auto-upgrading architecture<\/em><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Component<\/strong><\/td><td><strong>Definition<\/strong><\/td><td><strong>Auto-Upgrading Mechanism<\/strong><\/td><\/tr><tr><td>Placement Driver (PD) Servers<\/td><td>PD servers act as the cluster manager, managing metadata, scheduling, and load balancing.<\/td><td>During the upgrade, each PD server is upgraded one at a time. If a PD is the current leader, leadership is transferred first, causing only a brief pause in active TSO requests without affecting ongoing transactions or client connections.<\/td><\/tr><tr><td>TiKV Servers<\/td><td>TiKV is the distributed transactional key-value storage layer, responsible for data storage and retrieval.<\/td><td>TiKV servers are upgraded one at a time. Before upgrading, the leader for each Region is transferred to another TiKV server, thereby ensuring that ongoing operations are not disrupted.<\/td><\/tr><tr><td>TiDB Servers (Facilitated by TiProxy)<\/td><td>TiDB is the stateless SQL server responsible for SQL query processing, maintaining sessions, and handling transactions.<\/td><td>TiProxy assists in the smooth upgrading of TiDB servers by sitting between the network load balancer and the SQL Layer. It migrates client sessions to other TiDB servers during the upgrade, thereby ensuring zero disruption to client applications.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>This upgrade mechanism ensures that at each stage of the upgrade, the client experiences zero downtime and continues to interact with the database as if nothing has changed. In TiDB&#8217;s world, upgrades are not an interruption but a seamless transition. To learn more about how the upgrade mechanism works, see <a href=\"https:\/\/www.pingcap.com\/ko\/blog\/maintaining-database-connectivity-in-serverless-infra-with-tiproxy\/\">Maintaining Database Connectivity in Serverless Infrastructure with TiProxy<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cloud-Native and Horizontally Scalable by Design<\/h3>\n\n\n\n<p>TiDB\u2019s resilience starts with its architecture: a <a href=\"https:\/\/www.pingcap.com\/ko\/tidb\/cloud\/\">cloud-native<\/a>, shared-nothing design that cleanly separates stateless SQL compute (TiDB) from stateful storage (TiKV) with Raft replication and optional TiFlash for analytics. That separation means you can roll out changes, add capacity, or replace nodes one at a time without taking the service down. When demand spikes or a node fails, the cluster rebalances leaders and regions automatically, so throughput and availability stay steady while upgrades proceed in the background.<\/p>\n\n\n\n<p>Here&#8217;s why this enables zero-downtime change:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Elastic scale-out\/scale-in:<\/strong> Add or remove TiDB (compute) and TiKV (storage) nodes online; traffic spreads automatically via PD scheduling.<\/li>\n\n\n\n<li><strong>Fault-tolerant storage:<\/strong> Raft keeps multiple replicas; leader elections and region movement happen live during maintenance.<\/li>\n\n\n\n<li><strong>Rolling everything:<\/strong> Upgrade binaries, apply patches, and change configs node-by-node while the cluster serves reads\/writes.<\/li>\n\n\n\n<li><strong>Workload isolation:<\/strong> Use Placement Rules and TiFlash to keep heavy scans off OLTP paths, preserving p95\/p99 during upgrades.<\/li>\n\n\n\n<li><strong>Operational safety nets:<\/strong> Online DDL, point-in-time recovery, and rich observability reduce change risk and shorten MTTR if something regresses.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">High Availability with PD Servers and TiKV\/TiDB Components<\/h3>\n\n\n\n<p>Placement Driver (PD) is TiDB\u2019s control plane. It keeps the cluster healthy and highly available by (1) maintaining the global cluster metadata (stores, regions, leaders), (2) providing a monotonic timestamp oracle (TSO) for distributed transactions, and (3) scheduling region placement and leader elections across TiKV nodes according to capacity, load, and your Placement Rules. PD continuously ingests heartbeats from TiKV, detects failures within seconds, and triggers safe rebalancing or leader transfers so read\/write traffic stays online during node restarts, upgrades, or hardware issues.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Step-by-Step_Demonstration_of_a_Zero_Downtime_Upgrade\"><\/span>Step-by-Step Demonstration of a Zero Downtime Upgrade<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>To provide a tangible illustration of TiDB&#8217;s zero-downtime upgrade capability, let&#8217;s walk through a real-world demonstration using a self-hosted TiDB cluster. While fully-managed TiDB Cloud provides these capabilities out-of-the-box, a self-hosted environment allows for a more detailed exploration of the upgrade process.&nbsp;<\/p>\n\n\n\n<p>We conducted the demo on AWS. We have provided a <a href=\"https:\/\/github.com\/pingcap\/tidb-course-201-lab\/tree\/master\/tidb-quick-demo\/005-online-upgrade-by-real-cluster\">step-by-step guide<\/a> with detailed scripts, programs, CloudFormation templates, and workflow so that you can do it yourself. Feel free to refine or reproduce it in other cloud-based demonstration implementations. In this section, we will only focus on the observations through the upgrading process.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pre-Upgrade Preparations and Scaling Best Practices<\/h3>\n\n\n\n<p>While the primary focus is on demonstrating zero downtime during upgrades, TiDB&#8217;s architectural design also allows for proactive scaling. This is particularly useful if your workload relies heavily on parallel processing. We recommend the following practices for online upgrading:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Before the upgrade: Proactively scale out a TiDB server instance to ensure a smooth rolling upgrade. This scaling can also extend to TiKV server instances depending on your workload requirements.<\/li>\n\n\n\n<li>After the upgrade: TiDB allows you to scale in, effectively saving on operational costs. You can manage the scaling either manually or through TiDB&#8217;s auto-scaling solutions.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Pre-Upgrade Observations\u00a0<\/h3>\n\n\n\n<p>We have set up three terminal windows for the demonstration:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"998\" height=\"848\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-10.png\" alt=\"\" class=\"wp-image-13980\" srcset=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-10.png 998w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-10-300x255.png 300w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051949\/image-10-768x653.png 768w\" sizes=\"auto, (max-width: 998px) 100vw, 998px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 2. Terminal setup <\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Top terminal: Running the TiProxy service.<\/li>\n\n\n\n<li>Middle terminal: Displays our sample application with four active database connections. These connections are inserting data into the databases at a uniform frequency, routed through a network load balancer and the TiProxy service.<\/li>\n\n\n\n<li>Bottom terminal: Query events inserted by the example application and show the number of insert requests processed by each TiDB server.<\/li>\n<\/ul>\n\n\n\n<p>As you can see, there are two TiDB servers actively processing approximately 170 events each. They are receiving an equal number of connections are processing an equal number of requests. Note that we used two TiDB here for both high availability and smooth upgrading.&nbsp;<\/p>\n\n\n\n<p>The middle terminal and bottom terminal together represent the application workloads &#8211; one for writing and the other for reading.<\/p>\n\n\n\n<p>Before the upgrading, we confirmed the TiProxy status in the AWS console:<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"580\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-7.png\" alt=\"\" class=\"wp-image-13976\" style=\"width:840px;height:508px\" srcset=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-7.png 960w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-7-300x181.png 300w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-7-768x464.png 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 3. TiProxy status in the AWS console<\/em><\/p>\n\n\n\n<p>And we also confirmed that The current TiDB version is v6.5.1, and our target upgrade version is v6.5.2.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1020\" height=\"318\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-8.png\" alt=\"\" class=\"wp-image-13977\" srcset=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-8.png 1020w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-8-300x94.png 300w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-8-768x239.png 768w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 4. Initial cluster status<\/em><\/p>\n\n\n\n<p>Let&#8217;s now quickly talk about how to monitor queries in production. Here&#8217;s what to watch (every 1-5 minutes):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Top digests by total latency and by errors to catch regressions fast.<\/li>\n\n\n\n<li>Plan changes for hot queries (same SQL digest, different plan digest).<\/li>\n\n\n\n<li>Retry\/lock-wait signals: growing <code>write_conflict<\/code>, <code>deadlock<\/code>, or <code>backoff<\/code> counts.<\/li>\n\n\n\n<li>P95\/P99 drift on critical endpoints (keep a short allowlist of digests).<\/li>\n<\/ul>\n\n\n\n<p>And here are some operator tips:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep a small \u201cwatched digests\u201d list (5\u201310) mapped to user-visible endpoints so on-call can judge impact in seconds.<\/li>\n\n\n\n<li>Freeze the baseline 15\u201330 minutes pre-change, then compare only <code>_delta<\/code> columns during the rollout.<\/li>\n\n\n\n<li>Track plan flips alongside p95\/p99; if both move in the wrong direction, pin or re-analyze stats post-node return.<\/li>\n\n\n\n<li>Alert when a critical digest shows p95 &gt; baseline \u00d7 1.5 for 2 consecutive intervals, or when errors_delta &gt; 0 and rising.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rolling Updates in Action<\/h3>\n\n\n\n<p>Initiating the upgrade to version 6.5.2 was as straightforward &#8211; simply execute the following command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ tiup cluster upgrade tidb-demo v6.5.2 --yes<\/code><\/pre>\n\n\n\n<p>Here&#8217;s how the different components were upgraded sequentially:<\/p>\n\n\n\n<p>Placement Driver (PD) Servers: Upgraded one-by-one without causing any interruptions to the sample application.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"192\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051947\/image-6.png\" alt=\"\" class=\"wp-image-13975\" srcset=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051947\/image-6.png 660w, https:\/\/static.pingcap.com\/files\/2023\/09\/15051947\/image-6-300x87.png 300w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 5. PD upgrade process<\/em><\/p>\n\n\n\n<p><strong>TiKV Servers<\/strong>: Each TiKV node was upgraded sequentially. The leader role for each Region was transferred to another server before proceeding with the upgrade. Again, no disruptions were observed.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"480\" height=\"262\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051948\/image-1.gif\" alt=\"\" class=\"wp-image-13978\" style=\"width:551px;height:172px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 6. TiKV upgrade process<\/em><\/p>\n\n\n\n<p><strong>TiDB Servers<\/strong>: TiProxy played a pivotal role here. Before upgrading each TiDB server, TiProxy moved its active sessions to another TiDB server, ensuring uninterrupted service. For example, before upgrading TiDB server with IP 1.216, TiProxy migrated its hosted sessions to server 3.163.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"226\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/15051952\/image-2.gif\" alt=\"\" class=\"wp-image-13981\" style=\"width:615px;height:217px\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Figure 7. TiDB upgrade process<\/em><\/p>\n\n\n\n<p>Throughout the upgrade process, the four sessions in our sample program remained active, and the client did not notice the upgrade process.&nbsp;<\/p>\n\n\n\n<p>Here&#8217;s how rolling upgrades proceed without interruption:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PD servers (control plane):<\/strong> Upgrade one PD at a time. Before each restart, PD transfers internal leadership; the remaining PDs continue serving TSO and scheduling, so transactions and placement decisions proceed normally.<\/li>\n\n\n\n<li><strong>TiKV nodes (storage):<\/strong> Drain leaders from the target store, then restart that node. Raft elects a new leader for any affected regions, so reads\/writes route to healthy peers. PD restores replica count and balances leaders in the background.<\/li>\n\n\n\n<li><strong>TiDB servers (compute):<\/strong> Because TiDB is stateless, restart or replace nodes one by one behind the load balancer. Existing sessions drain; new sessions attach to healthy TiDB nodes, keeping connection scale and query throughput steady.<\/li>\n<\/ul>\n\n\n\n<p><strong>What you should see:<\/strong> Query throughput (QPS\/TPS) stays flat with only minor ripples during each component\u2019s sub-step. Error rates and tail latencies remain within baseline bands.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"403\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/11145449\/tidb_upgrade_qps_before_after-1-1024x403.png\" alt=\"\" class=\"wp-image-30447\" srcset=\"https:\/\/static.pingcap.com\/files\/2023\/09\/11145449\/tidb_upgrade_qps_before_after-1-1024x403.png 1024w, https:\/\/static.pingcap.com\/files\/2023\/09\/11145449\/tidb_upgrade_qps_before_after-1-300x118.png 300w, https:\/\/static.pingcap.com\/files\/2023\/09\/11145449\/tidb_upgrade_qps_before_after-1-768x302.png 768w, https:\/\/static.pingcap.com\/files\/2023\/09\/11145449\/tidb_upgrade_qps_before_after-1-1536x605.png 1536w, https:\/\/static.pingcap.com\/files\/2023\/09\/11145449\/tidb_upgrade_qps_before_after-1.png 1583w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em>Figure 8. The vertical markers indicate PD, TiKV (rolling), and TiDB (rolling) windows. Note the absence of a downtime drop\u2014only small, transient ripples during node restarts.<\/em><\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Online Schema Change Example<\/h3>\n\n\n\n<p>TiDB executes DDL online, so you can evolve schemas while traffic flows. Here\u2019s a minimal, production-ready pattern you can paste into your session while load tests or real workloads are running.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- 1) Add a new nullable column safely (no app pause)\nALTER TABLE orders\n  ADD COLUMN promo_code VARCHAR(32) NULL DEFAULT NULL COMMENT 'marketing code';\n\n-- 2) Create an index online to speed up a hot path\nCREATE INDEX idx_orders_created ON orders (created_at);\n\n-- 3) (Optional) Backfill a derived column without blocking OLTP\n--    Do it in small batches from the app or a job runner.\n--    Example: 5k rows at a time to avoid hotspots.\nUPDATE orders\nSET promo_code = NULL\nWHERE promo_code IS NULL\nLIMIT 5000;\n\n-- 4) Observe DDL progress non-disruptively\nADMIN SHOW DDL JOBS 5;\n\n-- 5) Verify the planner uses the new index (no restart required)\nEXPLAIN ANALYZE\nSELECT id, created_at\nFROM orders\nWHERE created_at &gt;= NOW() - INTERVAL 7 DAY;\n<\/code><\/pre>\n\n\n\n<p>Tip: keep long-running backfills batch-sized and idempotent, and monitor tail latencies while the index backfill runs. In TiDB, the DDL pipeline handles the online phases (delete-only, write-only, write-reorg, public), so reads and writes stay available throughout.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Best_Practices_for_Zero_Downtime_in_Cluster_Management\"><\/span>Best Practices for Zero Downtime in Cluster Management<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Here&#8217;s a quick checklist you can use to manage zero downtime in TiDB:<\/p>\n\n\n\n<p><strong>Scheduling rolling updates<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use maintenance windows sized in small, repeatable batches (one PD \u2192 a few TiKV stores \u2192 one TiDB at a time).<\/li>\n\n\n\n<li>Pre-drain leaders on the target TiKV store; confirm leader count trending to ~0 before restart.<\/li>\n\n\n\n<li>Stagger restarts with a cool-down (3\u20135 min) to let PD rebalance regions\/leaders.<\/li>\n\n\n\n<li>Pin a rollback checkpoint per step (package version + config diff + BR\/PITR restore point).<\/li>\n\n\n\n<li>Freeze change scope: no concurrent heavy DDL, compactions, or BR jobs during the rolling phase.<\/li>\n<\/ul>\n\n\n\n<p><strong>Monitoring cluster health during upgrades<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Track p95\/p99, error rate, and QPS\/TPS per TiDB instance; alert on p95 &gt; 1.5\u00d7 baseline for two intervals.<\/li>\n\n\n\n<li>Watch Top SQL (latency and errors) and plan flips for the hottest digests.<\/li>\n\n\n\n<li>On storage, watch TiKV CPU, scheduler pending tasks, raft ready\/append, and leader concentration by store.<\/li>\n\n\n\n<li>On PD, check TSO rate\/latency, region balance, and store health; verify no long-tailed scheduling.<\/li>\n\n\n\n<li>Re-run quick checks after each node returns:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Top latency (delta window)\nSELECT digest_text, exec_count_delta, sum_latency_delta\/1000 AS ms\nFROM information_schema.statements_summary\nORDER BY sum_latency_delta DESC LIMIT 10;\n\n-- Leader skew by store\nSELECT store_id, SUM(CASE WHEN is_leader=1 THEN 1 ELSE 0 END) AS leaders\nFROM information_schema.tikv_region_peers GROUP BY store_id ORDER BY leaders DESC;\n<\/code><\/pre>\n\n\n\n<p><strong>Leveraging MySQL compatibility for smooth migration<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lift-and-shift schemas first; keep app code unchanged (MySQL protocol + dialect).<\/li>\n\n\n\n<li>Use TiDB\u2019s online DDL to evolve tables post-cutover (no app pause).<\/li>\n\n\n\n<li>Validate critical queries with EXPLAIN\/ANALYZE and add indexes online:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE INDEX idx_orders_created ON orders(created_at);\nEXPLAIN ANALYZE SELECT * FROM orders WHERE created_at &gt;= NOW() - INTERVAL 7 DAY;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>For data movement, use TiDB Dumpling\/Lightning for initial load and TiCDC for change sync; plan a blue-green cutover with feature flags.<\/li>\n\n\n\n<li>Keep a compatibility checklist (SQL modes, collations, reserved keywords, drivers\/ORMs) and upgrade client libraries in lockstep with the cutover plan.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion_%E2%80%93_Future-Proof_Your_Database_with_TiDB\"><\/span>Conclusion \u2013 Future-Proof Your Database with TiDB<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Zero-downtime isn\u2019t a stunt. With TiDB\u2019s cloud-native, distributed SQL architecture, you get an always-on data tier: rolling upgrades across PD\/TiKV\/TiDB, high availability via Raft replication and automatic leader rebalancing, online schema changes under load, and horizontal scalability for both reads and writes. The result is predictable SLOs, safer change velocity, and fewer fire-drills without app rewrites.<\/p>\n\n\n\n<p>Ready to see TiDB in your environment? Explore our <a href=\"https:\/\/www.pingcap.com\/ko\/demo\/\">TiDB Demo Center<\/a> to watch online upgrades in action, or dive into our <a href=\"https:\/\/docs.pingcap.com\/\">documentation<\/a> for step-by-step guides on rolling updates, online DDL, and migration tooling.<\/p>","protected":false},"excerpt":{"rendered":"<p>In the vast landscape of databases, ensuring zero-downtime upgrades and operation continuity remains a challenge. Due to inherent design limitations, traditional databases often introduce significant downtime during upgrades &#8211; a challenge that can spell operational chaos for businesses reliant on real-time data access.&nbsp; Enter TiDB, a cutting-edge distributed SQL database that offers a solution to [&hellip;]<\/p>\n","protected":false},"author":236,"featured_media":30586,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ub_ctt_via":"","footnotes":""},"categories":[13],"tags":[223,221,9,111,273],"class_list":["post-13966","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-product","tag-business-continuity","tag-online-upgrade","tag-scalability","tag-tidb","tag-zero-downtime"],"acf":[],"featured_image_src":"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png","author_info":{"display_name":"Guanglei Bao","author_link":"https:\/\/www.pingcap.com\/ko\/blog\/author\/bao-gl\/"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Zero Downtime Database Upgrade with TiDB | Always-On DB<\/title>\n<meta name=\"description\" content=\"Learn how TiDB enables zero downtime database upgrades with rolling updates, distributed SQL, and high availability for production databases.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pingcap.com\/ko\/blog\/achieving-zero-downtime-upgrades-tidb\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zero Downtime Database Upgrade with TiDB | Always-On DB\" \/>\n<meta property=\"og:description\" content=\"Learn how TiDB enables zero downtime database upgrades with rolling updates, distributed SQL, and high availability for production databases.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pingcap.com\/ko\/blog\/achieving-zero-downtime-upgrades-tidb\/\" \/>\n<meta property=\"og:site_name\" content=\"TiDB\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/pingcap2015\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-13T13:20:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-19T15:36:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/static.pingcap.com\/files\/2023\/09\/19072858\/tidb_1200x627-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1254\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Guanglei Bao\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/static.pingcap.com\/files\/2023\/09\/19072914\/tidb_twitter_1600x900-3.png\" \/>\n<meta name=\"twitter:creator\" content=\"@PingCAP\" \/>\n<meta name=\"twitter:site\" content=\"@PingCAP\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Guanglei Bao\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/\"},\"author\":{\"name\":\"Guanglei Bao\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/person\/b7cfeaa633d1893ad56abb26bda171b3\"},\"headline\":\"Zero-Downtime Upgrades: How TiDB Powers Always-On Databases\",\"datePublished\":\"2025-11-13T13:20:04+00:00\",\"dateModified\":\"2025-11-19T15:36:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/\"},\"wordCount\":2369,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.pingcap.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png\",\"keywords\":[\"Business Continuity\",\"Online Upgrade\",\"Scalability\",\"TiDB\",\"Zero Downtime\"],\"articleSection\":[\"Product\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/\",\"url\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/\",\"name\":\"Zero Downtime Database Upgrade with TiDB | Always-On DB\",\"isPartOf\":{\"@id\":\"https:\/\/www.pingcap.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png\",\"datePublished\":\"2025-11-13T13:20:04+00:00\",\"dateModified\":\"2025-11-19T15:36:07+00:00\",\"description\":\"Learn how TiDB enables zero downtime database upgrades with rolling updates, distributed SQL, and high availability for production databases.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#primaryimage\",\"url\":\"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png\",\"contentUrl\":\"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png\",\"width\":3600,\"height\":1200},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.pingcap.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zero-Downtime Upgrades: How TiDB Powers Always-On Databases\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.pingcap.com\/#website\",\"url\":\"https:\/\/www.pingcap.com\/\",\"name\":\"TiDB\",\"description\":\"TiDB | SQL at Scale\",\"publisher\":{\"@id\":\"https:\/\/www.pingcap.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.pingcap.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.pingcap.com\/#organization\",\"name\":\"PingCAP\",\"url\":\"https:\/\/www.pingcap.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/static.pingcap.com\/files\/2021\/11\/pingcap-logo.png\",\"contentUrl\":\"https:\/\/static.pingcap.com\/files\/2021\/11\/pingcap-logo.png\",\"width\":811,\"height\":232,\"caption\":\"PingCAP\"},\"image\":{\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/pingcap2015\",\"https:\/\/x.com\/PingCAP\",\"https:\/\/linkedin.com\/company\/pingcap\",\"https:\/\/youtube.com\/channel\/UCuq4puT32DzHKT5rU1IZpIA\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/person\/b7cfeaa633d1893ad56abb26bda171b3\",\"name\":\"Guanglei Bao\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/static.pingcap.com\/files\/2023\/06\/20023309\/bao-gl-150x150.jpeg\",\"contentUrl\":\"https:\/\/static.pingcap.com\/files\/2023\/06\/20023309\/bao-gl-150x150.jpeg\",\"caption\":\"Guanglei Bao\"},\"description\":\"Principal Solutions Architect\",\"url\":\"https:\/\/www.pingcap.com\/ko\/blog\/author\/bao-gl\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Zero Downtime Database Upgrade with TiDB | Always-On DB","description":"Learn how TiDB enables zero downtime database upgrades with rolling updates, distributed SQL, and high availability for production databases.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pingcap.com\/ko\/blog\/achieving-zero-downtime-upgrades-tidb\/","og_locale":"ko_KR","og_type":"article","og_title":"Zero Downtime Database Upgrade with TiDB | Always-On DB","og_description":"Learn how TiDB enables zero downtime database upgrades with rolling updates, distributed SQL, and high availability for production databases.","og_url":"https:\/\/www.pingcap.com\/ko\/blog\/achieving-zero-downtime-upgrades-tidb\/","og_site_name":"TiDB","article_publisher":"https:\/\/facebook.com\/pingcap2015","article_published_time":"2025-11-13T13:20:04+00:00","article_modified_time":"2025-11-19T15:36:07+00:00","og_image":[{"width":2400,"height":1254,"url":"https:\/\/static.pingcap.com\/files\/2023\/09\/19072858\/tidb_1200x627-2.png","type":"image\/png"}],"author":"Guanglei Bao","twitter_card":"summary_large_image","twitter_image":"https:\/\/static.pingcap.com\/files\/2023\/09\/19072914\/tidb_twitter_1600x900-3.png","twitter_creator":"@PingCAP","twitter_site":"@PingCAP","twitter_misc":{"Written by":"Guanglei Bao","Est. reading time":"13\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#article","isPartOf":{"@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/"},"author":{"name":"Guanglei Bao","@id":"https:\/\/www.pingcap.com\/#\/schema\/person\/b7cfeaa633d1893ad56abb26bda171b3"},"headline":"Zero-Downtime Upgrades: How TiDB Powers Always-On Databases","datePublished":"2025-11-13T13:20:04+00:00","dateModified":"2025-11-19T15:36:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/"},"wordCount":2369,"commentCount":0,"publisher":{"@id":"https:\/\/www.pingcap.com\/#organization"},"image":{"@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#primaryimage"},"thumbnailUrl":"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png","keywords":["Business Continuity","Online Upgrade","Scalability","TiDB","Zero Downtime"],"articleSection":["Product"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/","url":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/","name":"Zero Downtime Database Upgrade with TiDB | Always-On DB","isPartOf":{"@id":"https:\/\/www.pingcap.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#primaryimage"},"image":{"@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#primaryimage"},"thumbnailUrl":"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png","datePublished":"2025-11-13T13:20:04+00:00","dateModified":"2025-11-19T15:36:07+00:00","description":"Learn how TiDB enables zero downtime database upgrades with rolling updates, distributed SQL, and high availability for production databases.","breadcrumb":{"@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#primaryimage","url":"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png","contentUrl":"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png","width":3600,"height":1200},{"@type":"BreadcrumbList","@id":"https:\/\/www.pingcap.com\/blog\/achieving-zero-downtime-upgrades-tidb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pingcap.com\/"},{"@type":"ListItem","position":2,"name":"Zero-Downtime Upgrades: How TiDB Powers Always-On Databases"}]},{"@type":"WebSite","@id":"https:\/\/www.pingcap.com\/#website","url":"https:\/\/www.pingcap.com\/","name":"\ud2f0DB","description":"TiDB | SQL at Scale","publisher":{"@id":"https:\/\/www.pingcap.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pingcap.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.pingcap.com\/#organization","name":"PingCAP","url":"https:\/\/www.pingcap.com\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.pingcap.com\/#\/schema\/logo\/image\/","url":"https:\/\/static.pingcap.com\/files\/2021\/11\/pingcap-logo.png","contentUrl":"https:\/\/static.pingcap.com\/files\/2021\/11\/pingcap-logo.png","width":811,"height":232,"caption":"PingCAP"},"image":{"@id":"https:\/\/www.pingcap.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/pingcap2015","https:\/\/x.com\/PingCAP","https:\/\/linkedin.com\/company\/pingcap","https:\/\/youtube.com\/channel\/UCuq4puT32DzHKT5rU1IZpIA"]},{"@type":"Person","@id":"https:\/\/www.pingcap.com\/#\/schema\/person\/b7cfeaa633d1893ad56abb26bda171b3","name":"Guanglei Bao","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.pingcap.com\/#\/schema\/person\/image\/","url":"https:\/\/static.pingcap.com\/files\/2023\/06\/20023309\/bao-gl-150x150.jpeg","contentUrl":"https:\/\/static.pingcap.com\/files\/2023\/06\/20023309\/bao-gl-150x150.jpeg","caption":"Guanglei Bao"},"description":"Principal Solutions Architect","url":"https:\/\/www.pingcap.com\/ko\/blog\/author\/bao-gl\/"}]}},"grav_blocks":false,"card_markup":"<a class=\"card-resource bg-white\" href=\"https:\/\/www.pingcap.com\/ko\/blog\/achieving-zero-downtime-upgrades-tidb\/\"><div class=\"card-resource__image-container\"><img class=\"card-resource__image\" alt=\"tidb_feature_1800x600 (1)\" src=\"https:\/\/static.pingcap.com\/files\/2023\/09\/19072835\/tidb_feature_1800x600-1.png\" loading=\"lazy\" width=3600 height=1200 \/><\/div><div class=\"card-resource__content-container\"><div class=\"card-resource__content-head\"><div class=\"card-resource__category\">Product<\/div><\/div><h5 class=\"card-resource__title\">Zero-Downtime Upgrades: How TiDB Powers Always-On Databases<\/h5><\/div><\/a>","_links":{"self":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/13966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/users\/236"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/comments?post=13966"}],"version-history":[{"count":37,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/13966\/revisions"}],"predecessor-version":[{"id":30592,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/13966\/revisions\/30592"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/media\/30586"}],"wp:attachment":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/media?parent=13966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/categories?post=13966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/tags?post=13966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}