在生产环境中执行DDL操作时,锁表问题一直是DBA和开发人员的噩梦。今天我要分享的是如何使用gh-ost工具实现无锁表的DDL变更,这是我最近在生产环境中的实战经验。
gh-ost(GitHub's Online Schema Transmogrifier)是GitHub开源的一款MySQL在线DDL工具,可以实现无锁表的表结构变更。
gh-ost通过以下步骤实现无锁表DDL变更:
以Ubuntu系统为例:
wget https://github.com/github/gh-ost/releases/download/v1.1.7/gh-ost_1.1.7_amd64.deb
sudo dpkg -i gh-ost_1.1.7_amd64.deb
验证安装:
gh-ost --version
CREATE TABLE w_content (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE USER 'gh-ost_user'@'%' IDENTIFIED BY 'password';
GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, LOCK TABLES,
SELECT, TRIGGER, UPDATE ON *.* TO 'gh-ost_user'@'%';
GRANT SUPER, REPLICATION SLAVE ON *.* TO 'gh-ost_user'@'%';
FLUSH PRIVILEGES;
我们需要在w_content表中新增一个read_counts字段,记录文章阅读量:
gh-ost \
--max-load=Threads_running=20 \
--critical-load=Threads_running=50 \
--critical-load-interval-millis=5000 \
--allow-on-master \
--chunk-size=10000 \
--user="gh-ost_user" \
--password="password" \
--host="192.168.5.246" \
--port=3306 \
--database="content" \
--table="w_content" \
--verbose \
--alter="ALTER TABLE w_content ADD COLUMN read_counts INT DEFAULT 0;" \
--assume-rbr \
--cut-over=default \
--timestamp-old-table \
--execute
| 参数 | 说明 | 示例值 |
|---|---|---|
--max-load | 当Threads_running超过阈值时暂停操作 | Threads_running=20 |
--critical-load | 当Threads_running超过阈值时中断操作 | Threads_running=50 |
--chunk-size | 每次同步处理的行数 | 10000 |
--cut-over | 数据同步完成后自动切换表 | default |
--timestamp-old-table | 使用时间戳命名旧表 | N/A |
gh-ost是一款强大的在线DDL工具,可以有效避免锁表问题,特别适合在生产环境中使用。相比传统的ALTER TABLE方式,gh-ost提供了更细粒度的控制和更好的稳定性。