Monthly Archives: June 2016

有效的升级 MySQL 库中所有表的字段属性

By | 2016/06/29

背景介绍 本文基于一个 discuz 论坛表的需求描述 — 将论坛中所有表为 mediumint(8) 的字段升级为 int(10), 以存储更大的用户 id 信息; 通过批量升级字段的方式也适用于其它相关的需求. 顺便吐槽下 discuz 这么多年以来对基础表的优化接近于无, 在用户较多或访问较频繁的场景下, 基础表的结构依然缺乏比较完善的设计. 步骤 考虑到论坛运行一段时间后, 一些表会比较大, 如果业务需要持续运行的话, 不太适合直接 alter table 的方式更新表, 下文会介绍使用 percona 的工具完成修改, 所以在整个流程中分为以下步骤操作: 找出论坛中数据较多的表; 生成相关的 DDL sql 语句, 忽略较大的表; 执行 DDL sql 语句; 如果表较大, 使用 pt-online-schema-change 工具在线修改表结构; 如果表加大, 而且没有主键或唯一键, 则只能手工执行 alter 操作; 1. 找出论坛中较大的表, 可以通过 information_schema.tables 完成: mysql>… Read More »

MySQl schema 表变更版本管理

By | 2016/06/07

https://github.com/nomad-software/snap https://github.com/arstercz/snap 注: 笔者新启 snap 分支项目后, 做了以下改动: 修复 cli 命令行需要返回 error 信息的错误; 增加 clear 选择删除指定库的版本控制信息; 更多信息参见 snap 链接 snap 用途概述 在开发过程中, 我们经常需要对核心的库表结构进行调整, 新建表, 增删字段等都需要记录以便和线上的环境区别开, 亦可以和相关的代码对应起来方便功能的追溯. 在交叉开发的环境中, 多名开发者共同更新一个表的情况很容易引起开发和部署的混乱, 可以通过版本管理的方式避免此类问题. 1. 适用范围 仅适用于内网开发环境, 线上环境不做改动, 指定库中的所有表的 DDL 语句都需要使用 snap 工具更新. 2. 风险提示 alter 相关的语句不影响测试表中的数据, create 相关的语句在回滚的时候会清理相关的数据. 3. 选项说明 snap 以命令行方式运行: snap command [optional] 更细节的帮助信息可以通过 snap help command 获得,… Read More »