Part01-基础概念与理论知识
1.1 DDL基础概念
DDL(Data Definition Language)是用于定义和管理数据库结构的语言,包括:
- CREATE:创建数据库对象
- ALTER:修改数据库对象
- DROP:删除数据库对象
- TRUNCATE:截断表数据
更多视频教程www.fgedu.net.cn
1.2 在线DDL原理
在线DDL的核心原理是:
- 在执行DDL操作时,不阻塞读写操作
- 使用多版本并发控制(MVCC)来实现并发访问
- 通过后台任务来执行DDL操作
- 使用临时表或中间状态来管理变更过程
1.3 TiDB在线DDL特性
TiDB的在线DDL特性包括:
- 非阻塞:执行DDL操作时不阻塞读写
- 原子性:DDL操作要么全部成功,要么全部失败
- 并发执行:支持多个DDL操作并发执行
- 可中断:DDL操作可以被中断和恢复
- 进度监控:可以监控DDL操作的执行进度
学习交流加群风哥微信: itpux-com
Part02-生产环境规划与建议
2.1 在线DDL策略规划
在线DDL的策略规划包括:
- 选择合适的DDL类型:根据变更类型选择合适的DDL语句
- 评估影响范围:评估DDL操作对系统性能的影响
- 选择合适的时间窗口:在业务低峰期执行DDL操作
- 制定回滚计划:准备好回滚方案,以应对可能的问题
2.2 性能影响评估
在线DDL对性能的影响评估:
- CPU影响:DDL操作会增加CPU使用
- IO影响:DDL操作会增加磁盘IO
- 内存影响:DDL操作会占用一定的内存
- 网络影响:分布式DDL操作会增加网络流量
2.3 最佳实践建议
在线DDL的最佳实践建议:
- 在业务低峰期执行DDL操作
- 分批执行大型DDL操作
- 监控DDL操作的执行进度
- 备份数据,以防万一
- 测试环境验证后再应用到生产环境
风哥提示:在线DDL虽然不会阻塞读写操作,但仍然会对系统性能产生影响,需要合理规划和监控。学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 在线DDL配置实施
配置TiDB的在线DDL参数:
SHOW VARIABLES LIKE ‘tidb_ddl%’;
# 设置DDL并发度
SET GLOBAL tidb_ddl_concurrency = 4;
# 设置DDL批处理大小
SET GLOBAL tidb_ddl_batch_size = 1000;
# 设置DDL重试次数
SET GLOBAL tidb_ddl_retry_duration = ’30m’;
# 执行在线DDL操作
# 添加列
ALTER TABLE fgedudb.fgedu_users ADD COLUMN email VARCHAR(255);
# 修改列
ALTER TABLE fgedudb.fgedu_users MODIFY COLUMN email VARCHAR(512);
# 添加索引
ALTER TABLE fgedudb.fgedu_users ADD INDEX idx_email (email);
# 删除索引
ALTER TABLE fgedudb.fgedu_users DROP INDEX idx_email;
3.2 监控与调优
监控在线DDL操作:
SHOW DDL JOBS;
# 查看DDL执行详情
SHOW DDL JOB QUERIES 1;
# 监控DDL进度
SELECT * FROM information_schema.tidb_ddl_jobs;
# 调优DDL性能
# 1. 调整DDL并发度
SET GLOBAL tidb_ddl_concurrency = 2;
# 2. 调整批处理大小
SET GLOBAL tidb_ddl_batch_size = 500;
3.3 故障处理
在线DDL故障处理:
# ddl_troubleshooting.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# DDL故障排查脚本
log_file=”/tidb/logs/ddl_troubleshooting.log”
log() {
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1” >> $log_file
echo “[$(date +’%Y-%m-%d %H:%M:%S’)] $1”
}
# 检查DDL状态
check_ddl_status() {
log “检查DDL状态”
mysql -h 192.168.1.100 -P 4000 -u root -p”password” -e “SHOW DDL JOBS;” >> $log_file
}
# 检查DDL详情
check_ddl_detail() {
log “检查DDL详情”
job_id=$(mysql -h 192.168.1.100 -P 4000 -u root -p”password” -e “SHOW DDL JOBS;” | tail -n 1 | awk ‘{print $1}’)
if [ -n “$job_id” ]; then
mysql -h 192.168.1.100 -P 4000 -u root -p”password” -e “SHOW DDL JOB QUERIES $job_id;” >> $log_file
fi
}
# 取消DDL操作风哥提示:
cancel_ddl() {
log “取消DDL操作”
job_id=$(mysql -h 192.168.1.100 -P 4000 -u root -p”password” -e “SHOW DDL JOBS;” | tail -n 1 | awk ‘{print $1}’)
if [ -n “$job_id” ]; then
mysql -h 192.168.1.100 -P 4000 -u root -p”password” -e “CANCEL DDL JOB $job_id;”
log “已取消DDL操作 $job_id”
fi
}
# 主函数
main() {
log “DDL故障排查开始”
check_ddl_status
check_ddl_detail
# 如果需要取消DDL操作
# cancel_ddl
log “DDL故障排查完成”
}
main
Part04-生产案例与实战讲解
4.1 表结构变更案例
案例:添加新列到大型表
# 2. 解决方案:
# 使用在线DDL添加列
ALTER TABLE fgedudb.fgedu_users ADD COLUMN phone VARCHAR(20) DEFAULT ”;
# 3. 监控DDL进度
SHOW DDL JOBS;
# 4. 验证操作结果
SHOW CREATE TABLE fgedudb.fgedu_users;
# 5. 效果:表结构变更完成,期间不阻塞读写操作
4.2 索引管理案例
案例:添加索引到大型表
# 2. 解决方案:
# 使用在线DDL添加索引
ALTER TABLE fgedudb.fgedu_orders ADD INDEX idx_user_id (user_id);
# 3. 监控DDL进度
SELECT * FROM information_schema.tidb_ddl_jobs;
# 4. 验证索引创建
SHOW INDEX FROM fgedudb.fgedu_orders;
# 5. 效果:索引创建完成,期间不阻塞读写操作
4.3 性能优化案例
案例:优化在线DDL性能
# 2. 分析原因:DDL并发度和批处理大小设置不合理
# 3. 解决方案:
# 调整DDL参数
SET GLOBAL tidb_ddl_concurrency = 2;
SET GLOBAL tidb_ddl_batch_size = 500;
# 4. 重新执行DDL操作
ALTER TABLE fgedudb.fgedu_users ADD COLUMN address VARCHAR(255);
# 5. 效果:DDL操作执行速度显著提升
更多学习教程公众号风哥教程itpux_com
Part05-风哥经验总结与分享
5.1 在线DDL最佳实践
- 在业务低峰期执行DDL操作:减少对业务的影响
- 分批执行大型DDL操作:避免一次性处理过多数据
- 监控DDL操作的执行进度:及时发现和解决问题
- 备份数据:以防DDL操作出现问题
- 测试环境验证:在测试环境验证DDL操作的影响
- 合理调整DDL参数:根据系统资源和数据量调整参数
5.2 常见问题与解决方案
- DDL操作执行慢:调整DDL并发度和批处理大小,选择合适的时间窗口
- DDL操作失败:检查错误信息,修复问题后重新执行
- 系统性能下降:在业务低峰期执行DDL操作,调整DDL参数
- DDL操作卡住:检查系统资源使用情况,必要时取消并重新执行
学习交流加群风哥QQ113257174
5.3 未来发展趋势
- 更高效的在线DDL算法:减少资源使用,提高执行速度
- 智能DDL调度:根据系统负载自动调整DDL执行策略
- 并行DDL执行:支持更多类型的DDL操作并行执行
- DDL操作的可视化管理:提供更直观的DDL操作管理界面
from tidb视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
