{"id":18642,"date":"2025-12-05T07:03:53","date_gmt":"2025-12-05T15:03:53","guid":{"rendered":"https:\/\/www.pingcap.com\/?p=18642"},"modified":"2025-12-08T07:05:03","modified_gmt":"2025-12-08T15:05:03","slug":"effective-online-ddl-database-schema-changes-zero-downtime","status":"publish","type":"post","link":"https:\/\/www.pingcap.com\/ko\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/","title":{"rendered":"Effective MySQL Online DDL: Making Critical Database Schema Changes with Zero Downtime"},"content":{"rendered":"<p>Online Data Definition Language (DDL) is a crucial feature for modern databases and a cornerstone of <a href=\"https:\/\/www.pingcap.com\/ko\/solutions\/modernize-mysql-workloads\/\">MySQL modernization<\/a> strategies. It allows schema changes without significant downtime or locking that could disrupt database operations. This means these operations carry out while the database continues to be available for reads and writes, minimizing downtime and avoiding disruption to ongoing activities.<\/p>\n\n\n\n<p>Online DDL is particularly important for applications requiring high availability and where maintenance windows are not feasible or are too disruptive. This capability is crucial for large, operational databases that need to scale, evolve, and undergo schema changes without affecting the user experience or service availability.<\/p>\n\n\n\n<p>In this blog post, we\u2019ll explore what online DDL is and then dive into how TiDB, a <a href=\"https:\/\/www.pingcap.com\/ko\/blog\/why-distributed-sql-databases-elevate-modern-app-dev\/\">distributed SQL database<\/a>, efficiently handles online DDL operations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What_Is_Online_DDL%E2%80%94and_Why_It_Matters_for_Modern_MySQL_Systems\"><\/span><strong>What Is Online DDL\u2014and Why It Matters for Modern MySQL Systems<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Online DDL is the ability to evolve a schema\u2014add columns, create or drop indexes, change constraints\u2014while the database stays read\/write available. Instead of blocking tables, the system performs changes concurrently with live traffic, which preserves uptime, protects p95\/p99 latency, and raises <a href=\"https:\/\/www.pingcap.com\/ko\/blog\/how-tidb-achieves-10x-performance-gains-in-online-ddl\/\">online DDL performance<\/a> by avoiding long metadata locks that stall queries or applications.<\/p>\n\n\n\n<p>Building on the <a href=\"https:\/\/research.google\/pubs\/f1-a-distributed-sql-database-that-scales\/\">Google F1 approach<\/a>, online DDL is split into safe transition stages (e.g., prepare \u2192 backfill\/validation \u2192 publish) so reads\/writes continue as the change progresses. Data backfills run in the background with rate limits, new structures (like \u201cshadow\u201d indexes) are built alongside existing ones, and metadata is switched atomically only at the end\u2014so nodes can lag by at most one DDL version without corruption or outages. The result is predictable performance during schema evolution, even on large tables under production load, especially with <a href=\"https:\/\/www.pingcap.com\/ko\/blog\/tidb-ddl-optimizations-unleashing-50x-performance-increases\/\">TiDB DDL optimizations<\/a> that parallelize and throttle backfills safely.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>From Locking to Non-Blocking: The Evolution of DDL Operations<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Non-blocking Operations:<\/strong> Avoids long-term locks on tables.<\/li>\n\n\n\n<li><strong>Minimal Downtime:<\/strong> Keeps the database available during schema changes.<\/li>\n\n\n\n<li><strong>Concurrency:<\/strong> Allows simultaneous DML (Data Manipulation Language) operations.<\/li>\n\n\n\n<li><strong>Phased Approach:<\/strong> Performs changes in multiple stages to reduce impact.<\/li>\n<\/ul>\n\n\n\n<p>Planning a <a href=\"https:\/\/www.pingcap.com\/ko\/blog\/migrating-mysql-tidb\/\">MySQL migration<\/a>? It helps to understand where native MySQL shines and where a distributed engine adds guarantees.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_MySQL_Handles_Online_DDL_Strengths_and_Trade-offs\"><\/span><strong>How MySQL Handles Online DDL: Strengths and Trade-offs<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>MySQL\u2019s online DDL behavior is controlled primarily by the <strong>ALTER TABLE <\/strong>algorithm and <strong>LOCK<\/strong> settings:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Algorithms:<\/strong>\n<ul class=\"wp-block-list\">\n<li>ALGORITHM=COPY rebuilds the table by making a copy. It\u2019s the safest but most disruptive and slow.<\/li>\n\n\n\n<li>ALGORITHM=INPLACE changes structures alongside the live table (e.g., creates a \u201cshadow\u201d index, backfills in the background) and then switches metadata\u2014no full table copy.<\/li>\n\n\n\n<li>ALGORITHM=INSTANT (MySQL 8.0+) updates only metadata for supported operations (for example, add a column at the end). There\u2019s no data backfill or table rebuild, so it completes almost immediately.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Concurrency (<\/strong><strong>LOCK<\/strong><strong>):<\/strong>\n<ul class=\"wp-block-list\">\n<li>LOCK=NONE keeps read\/write traffic flowing during most of the operation, taking only brief metadata locks at start\/commit.<\/li>\n\n\n\n<li>LOCK=SHARED permits reads but restricts writes at critical moments.<\/li>\n\n\n\n<li>LOCK=EXCLUSIVE blocks both reads and writes for the duration (typically paired with COPY).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Here\u2019s what the phased flow (INPLACE) looks like:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Prepare:<\/strong> Acquire a short metadata lock, record the planned change, and start background workers.<\/li>\n\n\n\n<li><strong>Reorg (background):<\/strong> Build the new structure (e.g., index backfill) while <strong>DML continues<\/strong>; changes are tracked so new\/updated rows are included.<\/li>\n\n\n\n<li><strong>Commit:<\/strong> Take a brief metadata lock to atomically switch pointers to the new structure; release.<\/li>\n<\/ol>\n\n\n\n<p>With <strong>ALGORITHM=INSTANT<\/strong>, supported alterations (notably <strong>ADD COLUMN<\/strong> at the end of the table, some secondary index metadata ops in newer 8.0) finish in milliseconds because only the data dictionary changes. There\u2019s no table copy, no backfill, and the operation typically holds just a short metadata lock. Limitations apply (e.g., column must be appended; certain data type\/position changes still require INPLACE or COPY).<\/p>\n\n\n\n<p>Picking the right algorithm + lock level lets you evolve schemas with minimal latency impact and near-zero downtime.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Understanding Metadata Locks and Non-Blocking Schema Changes<\/strong><\/strong><\/h3>\n\n\n\n<p>MySQL\u2019s InnoDB engine allows many schema changes without blocking access to the table. For instance, adding a column or creating an index is done without locking the entire table, as shown below.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/static.pingcap.com\/files\/2024\/07\/24115823\/Screenshot-2024-07-24-at-2.58.10%E2%80%AFPM.png\" alt=\"Non-blocking schema changes with online DLL in MySQL.\" class=\"wp-image-18647\"\/><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Metadata Update<\/strong>: MySQL updates the table&#8217;s metadata to include the new column.<\/li>\n\n\n\n<li><strong>Background Processing<\/strong>: The InnoDB engine performs the addition of the new column in the background. Existing rows update incrementally to include the new column without blocking read or write operations.<\/li>\n\n\n\n<li><strong>Concurrent Operations<\/strong>: While the background task is running, the table remains fully accessible for other operations. New data includes the new column, and existing data gradually updates.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Online Index Creation and Instant DDL<\/strong><\/h3>\n\n\n\n<p>MySQL supports creating indexes concurrently, meaning the table remains available for reads and writes while the index builds.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/static.pingcap.com\/files\/2024\/07\/24115918\/Screenshot-2024-07-24-at-2.58.54%E2%80%AFPM.png\" alt=\"Online index creation with online ddl in MySQL.\" class=\"wp-image-18648\"\/><\/figure>\n<\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Metadata Preparation<\/strong>: MySQL updates the table metadata to include the index definition.<\/li>\n\n\n\n<li><strong>Index Build Process<\/strong>: The InnoDB engine builds the index in the background. It reads existing table data and populates the index incrementally.<\/li>\n\n\n\n<li><strong>Minimal Disruption<\/strong>: During the index build, the table remains accessible. Queries and updates proceed without being blocked, and the new index is used only after it is fully built and activated.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_TiDB_Redefines_Online_DDL_Scalable_Distributed_and_Instant\"><\/span><strong>How TiDB Redefines Online DDL: Scalable, Distributed, and Instant<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>MySQL\u2019s best-case online DDL can be excellent\u2014especially with ALGORITHM=INSTANT or INPLACE\u2014but it\u2019s fundamentally single-node concurrency with brief metadata locks and table-local backfills. TiDB inherits the online benefits and then extends them to a distributed SQL setting: schema change is coordinated across many nodes, backfills are parallelized and throttled cluster-wide, and reads\/writes keep flowing without hotspots or long metadata locks.<\/p>\n\n\n\n<p>As mentioned earlier, TiDB implements a three-phase schema change protocol\u2014Prepare \u2192 Reorganize \u2192 Commit\u2014adapted for a multi-node cluster.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prepare:<\/strong> A DDL owner acquires a short metadata lease, records the intent, and installs new descriptors (e.g., shadow index\/column) so DML can continue safely.<\/li>\n\n\n\n<li><strong>Reorganize:<\/strong> Background workers backfill and validate in parallel across regions\/stores while normal reads\/writes proceed under MVCC; rate limits protect p95\/p99 latency.<\/li>\n\n\n\n<li><strong>Commit:<\/strong> The cluster performs an atomic metadata switch to activate the new structure, with only a brief, distributed metadata lock\u2014nodes may lag by at most one DDL version and catch up without blocking traffic.<\/li>\n<\/ul>\n\n\n\n<p><strong><\/strong>Instead of pausing tables, TiDB uses a cluster-elected DDL owner, metadata versioning, and MVCC to ensure writers\/readers see consistent schemas while work progresses. The scheduler spreads backfill across leaders to avoid hot stores, and built-in throttles keep OLTP steady during heavy change.<\/p>\n\n\n\n<p>What you get in practice:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/www.pingcap.com\/ko\/article\/what-is-high-availability-and-how-you-can-achieve\/\">High availability<\/a>:<\/strong> Continuous reads and writes during schema evolution, with only momentary metadata coordination.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.pingcap.com\/ko\/horizontal-scaling-vs-vertical-scaling\/\">\ud655\uc7a5\uc131<\/a>:<\/strong> Parallel, region-aware backfills and validation for large, distributed datasets.<\/li>\n\n\n\n<li><strong>Operational flexibility:<\/strong> Predictable tail latency and no maintenance windows for common changes\u2014so you can ship schema alongside features, not instead of them.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>TiDB\u2019s Three-Phase Schema Change Protocol Explained<\/strong><\/h3>\n\n\n\n<p>TiDB employs a three-phase approach to handle online DDL operations:<\/p>\n\n\n\n<p><strong>1. Prepare Phase:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&nbsp;TiDB updates metadata and prepares for the schema change.<\/li>\n\n\n\n<li>&nbsp;Ensures the change propagates safely across the cluster.<\/li>\n<\/ul>\n\n\n\n<p><strong>2. Reorganization Phase:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The actual changes are applied in the background.<\/li>\n\n\n\n<li>For example, building a new index or adding a column incrementally.<\/li>\n\n\n\n<li>Allows concurrent DML operations, ensuring the database remains fully operational.<\/li>\n<\/ul>\n\n\n\n<p><strong>3. Commit Phase:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The schema change is finalized and made active.<\/li>\n\n\n\n<li>Metadata updates to reflect the new schema, making changes visible.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step-by-Step: How TiDB Executes Instant DDL Changes<\/strong><\/h3>\n\n\n\n<p>In this section, we\u2019ll explore some common examples of online DDL operations in TiDB:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Metadata updates<\/li>\n\n\n\n<li>Background processing<\/li>\n\n\n\n<li>Final commit<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Adding Columns with Zero Downtime<\/h4>\n\n\n\n<p>When adding a column in TiDB, the process avoids table locks and ensures continuous availability. Here\u2019s how it works technically:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prepare Phase<\/strong>: TiDB updates the table\u2019s metadata to include the new column definition. This change propagates across all nodes in the cluster to ensure consistency.<\/li>\n\n\n\n<li><strong>Reorganization Phase<\/strong>: The new column is added in the background. TiDB uses a background task to backfill the column data for existing rows incrementally. During this phase, the table remains accessible for reads and writes, with new writes including the new column data.<\/li>\n\n\n\n<li><strong>Commit Phase<\/strong>: Once the backfill is complete, TiDB finalizes the schema change. The metadata updates to reflect the new schema, making the new column fully active and visible for all subsequent operations.<\/li>\n<\/ul>\n\n\n\n<p>This approach allows TiDB to add a column without long-term locking, ensuring minimal disruption to ongoing operations.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/static.pingcap.com\/files\/2024\/07\/24120003\/Screenshot-2024-07-24-at-2.59.49%E2%80%AFPM.png\" alt=\"Adding a column in TiDB with online ddl.\" class=\"wp-image-18649\"\/><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\">Creating Indexes Instantly in TiDB<\/h4>\n\n\n\n<p>Creating an index in TiDB is another common operation that benefits from online DDL. The process ensures that queries and updates continue smoothly:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prepare Phase<\/strong>: TiDB prepares for the index creation by updating metadata and ensuring the change distributes across the cluster.<\/li>\n\n\n\n<li><strong>Reorganization Phase<\/strong>: The index is built in the background. TiDB processes existing data to populate the index incrementally, allowing read and write operations to proceed concurrently.<\/li>\n\n\n\n<li><strong>Commit Phase<\/strong>: The new index is finalized and made active. The metadata updates, and the index becomes available for query optimization, enhancing performance without having caused downtime.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/static.pingcap.com\/files\/2024\/07\/24120048\/Screenshot-2024-07-24-at-3.00.34%E2%80%AFPM.png\" alt=\"Creating an index in TiDB.\" class=\"wp-image-18650\"\/><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\">Modifying Columns Safely at Scale<\/h4>\n\n\n\n<p>Modifying a column, such as changing its type or attributes, is handled with similar efficiency:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prepare Phase<\/strong>: TiDB updates the table\u2019s metadata to reflect the changes in the column\u2019s definition.<\/li>\n\n\n\n<li><strong>Reorganization Phase<\/strong>: The actual data transformation performs in the background. For example, changing a column from INT to BIGINT involves converting existing data incrementally, ensuring that the table remains accessible.<\/li>\n\n\n\n<li><strong>Commit Phase<\/strong>: The schema change is finalized. The metadata updates to reflect the new column type, making the changes fully active.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/static.pingcap.com\/files\/2024\/07\/24120117\/Screenshot-2024-07-24-at-3.01.03%E2%80%AFPM.png\" alt=\"Modifying a column in TiDB.\" class=\"wp-image-18651\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Alternative_Tools_gh-ost_and_pt-osc_for_Safer_Schema_Migrations\"><\/span><strong>Alternative Tools: gh-ost and pt-osc for Safer Schema Migrations<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>If you\u2019re running MySQL (or MySQL-compatible) and can\u2019t rely on native online DDL for a specific change, two battle-tested online schema change tools are <strong>gh-ost<\/strong> (GitHub\u2019s Online Schema Transmogrifier) and <strong>pt-online-schema-change<\/strong> (Percona Toolkit). Both create a shadow table, backfill in the background, keep triggers or event hooks to mirror writes, then cut over with minimal interruption. They differ in how they hook in, how much they automate, and how they behave under load.<\/p>\n\n\n\n<p>When to use which (at a glance):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Use <\/strong><strong>gh-ost<\/strong> when you want fewer triggers, better control via binlog stream, easier throttling\/pauses, rich automation hooks (hooks, cutover flags), and safer behavior on very busy masters.<\/li>\n\n\n\n<li><strong>Use <\/strong><strong>pt-osc<\/strong> when you need a widely deployed, mature option that works across many MySQL versions, including older setups, and you\u2019re comfortable with trigger-based mirroring and simple throttling.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature Comparison<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Capability<\/th><th><strong>gh-ost<\/strong><\/th><th><strong>pt-online-schema-change<\/strong><\/th><\/tr><\/thead><tbody><tr><td><strong>Backfill method<\/strong><\/td><td>Consumes <strong>binlog<\/strong> to replicate changes into a shadow table; minimal reliance on triggers<\/td><td>Uses <strong>row-level triggers<\/strong> on the original table to mirror DML into a shadow table<\/td><\/tr><tr><td><strong>Cutover behavior<\/strong><\/td><td>Controlled, low-latency cutover with automatic retries; can be fully automated or manually approved<\/td><td>Quick rename cutover; typically brief metadata lock; manual guardrails available<\/td><\/tr><tr><td><strong>Speed under load<\/strong><\/td><td>Generally faster on busy masters (binlog-driven; less trigger overhead)<\/td><td>Good throughput; triggers can add overhead on very hot tables<\/td><\/tr><tr><td><strong>Downtime window<\/strong><\/td><td>Near-zero (milliseconds at rename); resilient to brief stalls<\/td><td>Near-zero (milliseconds at rename); depends on lock acquisition<\/td><\/tr><tr><td><strong>Throttling &amp; safety<\/strong><\/td><td>Built-in smart throttling (replication lag, load avg, custom hooks); pause\/resume friendly<\/td><td>Throttling available (replication lag, load), but less granular than gh-ost<\/td><\/tr><tr><td><strong>Automation &amp; CI\/CD<\/strong><\/td><td>Strong: hooks for pre\/post checks, status APIs, dry-runs; easy to script pipelines<\/td><td>Solid: command-line driven; commonly scripted; fewer native hooks<\/td><\/tr><tr><td><strong>Operational complexity<\/strong><\/td><td>Moderate; requires binlog access and proper privileges<\/td><td>Lower barrier to entry; relies on triggers (which add their own considerations)<\/td><\/tr><tr><td><strong>Best fit<\/strong><\/td><td>Large\/very active tables, need precise throttling and safer cutovers<\/td><td>Broad MySQL estates, older versions, teams comfortable with trigger-based mirroring<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Best_Practices_for_Zero-Downtime_Schema_Changes\"><\/span><strong>Best Practices for Zero-Downtime Schema Changes<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Zero-downtime DDL is not a single command. It\u2019s a disciplined process that treats schema evolution like any other production release: design for concurrency, test with realistic load, monitor during rollout, and verify after cutover.<\/p>\n\n\n\n<p>Here are some principles to anchor on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Design for concurrency:<\/strong> Assume live reads\/writes continue. Favor algorithms\/modes that avoid long metadata locks and use background backfills with throttling.<\/li>\n\n\n\n<li><strong>Test before you DDL:<\/strong> Reproduce production scale (row counts, indexes, skew) in a staging environment; replay representative traffic to catch plan regressions and lock contention.<\/li>\n\n\n\n<li><strong>Observe in real time:<\/strong> Track p95\/p99 latency, error rates, replication lag, and backfill throughput; set abort thresholds so you can pause safely.<\/li>\n\n\n\n<li><strong>Roll forward or roll back:<\/strong> Every migration should have a fast, documented rollback (or fall-forward) path.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Engineer Checklist<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Concurrency validation<\/strong>\n<ul class=\"wp-block-list\">\n<li>Confirm algorithm\/mode supports online change (e.g., INSTANT\/INPLACE or equivalent).<\/li>\n\n\n\n<li>Run load test with read\/write mix; verify p95\/p99 stay within SLO during backfill.<\/li>\n\n\n\n<li>Check for hot partitions\/regions and leader skew before starting.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Monitoring plan<\/strong>\n<ul class=\"wp-block-list\">\n<li>Dashboards for latency, errors, queue depth\/backfill rate, replication lag.<\/li>\n\n\n\n<li>Alerts with hard abort thresholds (e.g., p99 &gt; SLO + 10% for N minutes).<\/li>\n\n\n\n<li>Log sampling on affected services for timeouts\/retries.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Rollback strategy<\/strong>\n<ul class=\"wp-block-list\">\n<li>Pre-create revert script (rename back, drop shadow structures, or disable feature flag).<\/li>\n\n\n\n<li>Data safety confirmed (no destructive transforms without verified backup\/snapshot).<\/li>\n\n\n\n<li>Communication plan: who can push the big red button and under what conditions.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Automation &amp; tooling<\/strong>\n<ul class=\"wp-block-list\">\n<li>Use a migration framework\/runner with <strong>idempotency<\/strong>, <strong>dry-run<\/strong>, \uadf8\ub9ac\uace0 <strong>resume<\/strong> support.<\/li>\n\n\n\n<li>Throttling controls (rate limits tied to latency\/lag); pause\/resume hooks.<\/li>\n\n\n\n<li>Pre-\/post-checks: index coverage, query plan diff, metadata lock timing.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Post-change verification<\/strong>\n<ul class=\"wp-block-list\">\n<li>Compare query plans before\/after; watch for regressions on hot paths.<\/li>\n\n\n\n<li>Validate new structures are used (e.g., index adoption) and backfills completed.<\/li>\n\n\n\n<li>Update runbooks, dashboards, and capacity models with lessons learned.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Challenges and Considerations<\/h3>\n\n\n\n<p>While <a href=\"https:\/\/www.pingcap.com\/ko\/tidb\/\">TiDB&#8217;s<\/a> online DDL offers numerous advantages, it&#8217;s important to be aware of potential challenges and considerations. Understanding these can help in planning and executing <a href=\"https:\/\/docs.pingcap.com\/tidb\/stable\/dev-guide-schema-design-overview\/\">schema changes<\/a> more effectively. In this section, we\u2019ll discuss the resource usage implications, the complexity of certain <a href=\"https:\/\/www.pingcap.com\/ko\/article\/database-schema-why-it-matters-in-sql-data-management\/\">schema changes<\/a>, and the importance of version compatibility when using online DDL in TiDB.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Resource Usage:<\/strong> Online DDL operations can be resource-intensive. Monitoring and <a href=\"https:\/\/www.pingcap.com\/ko\/blog\/tidb-resource-control-workload-consolidation-transactional-apps\/\">managing resources<\/a> is crucial to prevent performance issues.<\/li>\n\n\n\n<li><strong>Complex Schema Changes:<\/strong> Some changes might require careful planning and execution.<\/li>\n\n\n\n<li><strong>Version Compatibility: <\/strong>Ensure the TiDB version supports the specific online DDL operations needed.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion_Building_Resilient_MySQL_Workloads_with_TiDB\"><\/span><strong>Conclusion: Building Resilient MySQL Workloads with TiDB<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Online DDL is no longer optional\u2014it\u2019s how modern teams evolve schemas without sacrificing uptime, performance, or velocity. TiDB\u2019s three-phase protocol (Prepare \u2192 Reorganize \u2192 Commit), distributed concurrency control, and background backfills keep reads and writes flowing during change, so large MySQL-compatible estates can scale safely and predictably.<\/p>\n\n\n\n<p>By leaning on TiDB\u2019s online DDL, high availability, and elastic scale, organizations gain operational flexibility (ship schema during business hours), performance stability (p95\/p99 stay within SLOs), and a cleaner path to growth (no maintenance windows, fewer fire drills). The result is a resilient data layer that supports fast-moving applications across regions, tenants, and workloads.<\/p>\n\n\n\n<p><em>Want to enhance the efficiency and reliability of your database operations? <\/em><a href=\"https:\/\/tidbcloud.com\/free-trial\/?__hstc=86493575.037e26970996c6f0a1f9af91d1b69188.1763655761493.1764875614637.1764881219280.48&amp;__hssc=86493575.1.1764881219280&amp;__hsfp=3949366232&amp;_gl=1*1bxtxw7*_gcl_au*MTIwNzU5Njg5My4xNzYzNjYxODc4*_ga*MTUyNzYxOTgyNS4xNzYzNjU1NzYx*_ga_9FRXHHPYVY*czE3NjQ5NTMzNjQkbzU0JGcxJHQxNzY0OTU0MjUwJGo2MCRsMCRoMA..*_ga_3JVXJ41175*czE3NjQ5NTMzNjQkbzQ4JGcxJHQxNzY0OTU0MjUwJGo2MCRsMCRoOTQyODcyODI5*_ga_ZEL0RNV6R2*czE3NjQ5NTMzNjkkbzQ1JGcwJHQxNzY0OTU0MjUwJGo1OSRsMCRoMA..\"><em>Start a free TiDB Cloud cluster<\/em><\/a><em> to validate online DDL, rolling changes, and performance under load.<\/em><\/p>","protected":false},"excerpt":{"rendered":"<p>Online Data Definition Language (DDL) is a crucial feature for modern databases and a cornerstone of MySQL modernization strategies. It allows schema changes without significant downtime or locking that could disrupt database operations. This means these operations carry out while the database continues to be available for reads and writes, minimizing downtime and avoiding disruption [&hellip;]<\/p>\n","protected":false},"author":218,"featured_media":30907,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ub_ctt_via":"","footnotes":""},"categories":[6],"tags":[272,147,189,274,111],"class_list":["post-18642","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","tag-database-schema","tag-distributed-sql","tag-online-ddl","tag-operational-databases","tag-tidb"],"acf":[],"featured_image_src":"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png","author_info":{"display_name":"Brian Foster","author_link":"https:\/\/www.pingcap.com\/ko\/blog\/author\/brian-james-foster\/"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>MySQL Online DDL: Zero-Downtime Schema Changes with TiDB<\/title>\n<meta name=\"description\" content=\"Learn how TiDB\u2019s online DDL delivers zero-downtime schema evolution, outperforming MySQL with instant DDL, gh-ost, and pt-osc integrations.\" \/>\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\/effective-online-ddl-database-schema-changes-zero-downtime\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MySQL Online DDL: Zero-Downtime Schema Changes with TiDB\" \/>\n<meta property=\"og:description\" content=\"Learn how TiDB\u2019s online DDL delivers zero-downtime schema evolution, outperforming MySQL with instant DDL, gh-ost, and pt-osc integrations.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pingcap.com\/ko\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/\" \/>\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-12-05T15:03:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-08T15:05:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/static.pingcap.com\/files\/2024\/07\/08070427\/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=\"Brian Foster\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/static.pingcap.com\/files\/2024\/07\/08070441\/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=\"Brian Foster\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/\"},\"author\":{\"name\":\"Brian Foster\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/person\/e2c94b706bf3eaeebbd9a511005c41f2\"},\"headline\":\"Effective MySQL Online DDL: Making Critical Database Schema Changes with Zero Downtime\",\"datePublished\":\"2025-12-05T15:03:53+00:00\",\"dateModified\":\"2025-12-08T15:05:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/\"},\"wordCount\":2474,\"publisher\":{\"@id\":\"https:\/\/www.pingcap.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png\",\"keywords\":[\"Database Schema\",\"Distributed SQL\",\"Online DDL\",\"Operational Databases\",\"TiDB\"],\"articleSection\":[\"Engineering\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/\",\"url\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/\",\"name\":\"MySQL Online DDL: Zero-Downtime Schema Changes with TiDB\",\"isPartOf\":{\"@id\":\"https:\/\/www.pingcap.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png\",\"datePublished\":\"2025-12-05T15:03:53+00:00\",\"dateModified\":\"2025-12-08T15:05:03+00:00\",\"description\":\"Learn how TiDB\u2019s online DDL delivers zero-downtime schema evolution, outperforming MySQL with instant DDL, gh-ost, and pt-osc integrations.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#primaryimage\",\"url\":\"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png\",\"contentUrl\":\"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png\",\"width\":3600,\"height\":1200},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.pingcap.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Effective MySQL Online DDL: Making Critical Database Schema Changes with Zero Downtime\"}]},{\"@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\/e2c94b706bf3eaeebbd9a511005c41f2\",\"name\":\"Brian Foster\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/static.pingcap.com\/files\/2023\/07\/06161300\/brian-foster-150x150.jpeg\",\"contentUrl\":\"https:\/\/static.pingcap.com\/files\/2023\/07\/06161300\/brian-foster-150x150.jpeg\",\"caption\":\"Brian Foster\"},\"description\":\"Global Content Director\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/brian-foster-33453a6\/\"],\"url\":\"https:\/\/www.pingcap.com\/ko\/blog\/author\/brian-james-foster\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MySQL Online DDL: Zero-Downtime Schema Changes with TiDB","description":"Learn how TiDB\u2019s online DDL delivers zero-downtime schema evolution, outperforming MySQL with instant DDL, gh-ost, and pt-osc integrations.","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\/effective-online-ddl-database-schema-changes-zero-downtime\/","og_locale":"ko_KR","og_type":"article","og_title":"MySQL Online DDL: Zero-Downtime Schema Changes with TiDB","og_description":"Learn how TiDB\u2019s online DDL delivers zero-downtime schema evolution, outperforming MySQL with instant DDL, gh-ost, and pt-osc integrations.","og_url":"https:\/\/www.pingcap.com\/ko\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/","og_site_name":"TiDB","article_publisher":"https:\/\/facebook.com\/pingcap2015","article_published_time":"2025-12-05T15:03:53+00:00","article_modified_time":"2025-12-08T15:05:03+00:00","og_image":[{"width":2400,"height":1254,"url":"https:\/\/static.pingcap.com\/files\/2024\/07\/08070427\/tidb_1200x627-2.png","type":"image\/png"}],"author":"Brian Foster","twitter_card":"summary_large_image","twitter_image":"https:\/\/static.pingcap.com\/files\/2024\/07\/08070441\/tidb_twitter_1600x900-3.png","twitter_creator":"@PingCAP","twitter_site":"@PingCAP","twitter_misc":{"Written by":"Brian Foster","Est. reading time":"12\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#article","isPartOf":{"@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/"},"author":{"name":"Brian Foster","@id":"https:\/\/www.pingcap.com\/#\/schema\/person\/e2c94b706bf3eaeebbd9a511005c41f2"},"headline":"Effective MySQL Online DDL: Making Critical Database Schema Changes with Zero Downtime","datePublished":"2025-12-05T15:03:53+00:00","dateModified":"2025-12-08T15:05:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/"},"wordCount":2474,"publisher":{"@id":"https:\/\/www.pingcap.com\/#organization"},"image":{"@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#primaryimage"},"thumbnailUrl":"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png","keywords":["Database Schema","Distributed SQL","Online DDL","Operational Databases","TiDB"],"articleSection":["Engineering"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/","url":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/","name":"MySQL Online DDL: Zero-Downtime Schema Changes with TiDB","isPartOf":{"@id":"https:\/\/www.pingcap.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#primaryimage"},"image":{"@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#primaryimage"},"thumbnailUrl":"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png","datePublished":"2025-12-05T15:03:53+00:00","dateModified":"2025-12-08T15:05:03+00:00","description":"Learn how TiDB\u2019s online DDL delivers zero-downtime schema evolution, outperforming MySQL with instant DDL, gh-ost, and pt-osc integrations.","breadcrumb":{"@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#primaryimage","url":"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png","contentUrl":"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/tidb_feature_1800x600-1.png","width":3600,"height":1200},{"@type":"BreadcrumbList","@id":"https:\/\/www.pingcap.com\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pingcap.com\/"},{"@type":"ListItem","position":2,"name":"Effective MySQL Online DDL: Making Critical Database Schema Changes with Zero Downtime"}]},{"@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\/e2c94b706bf3eaeebbd9a511005c41f2","name":"Brian Foster","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.pingcap.com\/#\/schema\/person\/image\/","url":"https:\/\/static.pingcap.com\/files\/2023\/07\/06161300\/brian-foster-150x150.jpeg","contentUrl":"https:\/\/static.pingcap.com\/files\/2023\/07\/06161300\/brian-foster-150x150.jpeg","caption":"Brian Foster"},"description":"Global Content Director","sameAs":["https:\/\/www.linkedin.com\/in\/brian-foster-33453a6\/"],"url":"https:\/\/www.pingcap.com\/ko\/blog\/author\/brian-james-foster\/"}]}},"grav_blocks":false,"card_markup":"<a class=\"card-resource bg-white\" href=\"https:\/\/www.pingcap.com\/ko\/blog\/effective-online-ddl-database-schema-changes-zero-downtime\/\"><div class=\"card-resource__image-container\"><img class=\"card-resource__image\" alt=\"tidb_feature_1800x600 (1)\" src=\"https:\/\/static.pingcap.com\/files\/2024\/07\/08070410\/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\">Engineering<\/div><\/div><h5 class=\"card-resource__title\">Effective MySQL Online DDL: Making Critical Database Schema Changes with Zero Downtime<\/h5><\/div><\/a>","_links":{"self":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/18642","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\/218"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/comments?post=18642"}],"version-history":[{"count":19,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/18642\/revisions"}],"predecessor-version":[{"id":30911,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/18642\/revisions\/30911"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/media\/30907"}],"wp:attachment":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/media?parent=18642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/categories?post=18642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/tags?post=18642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}