MySql海量数据表结构在线更新方案

2018-05-22 by 没有评论

原理

基本思路是复制表,完成修改后替换
– 创建临时新表,结构与目标表一致
– 在空白新表执行alter修改表结构
– 创建触发器将旧表和新表关联,保证复制表过程中的新增数据不会遗漏
– 复制旧表所有数据到新表
– 新表替换旧表
– 删除触发器

安装

CentOS为例

访问:
https://www.percona.com/downloads/percona-toolkit/LATEST/
获取对应操作系统和应用版本的安装包地址,下载并安装

使用

基础用法

pt-online-schema-change [OPTIONS] DSN

常用参数:
-h,--host: mysql服务器host
-P,--port: mysql端口
-u,--user: mysql连接用户名
-p,--password: mysql连接密码
--alter: 修改表结构的Alter语句,注意去除Alter table部分,只留修改部分语句,注意mysql的字段名引用符号``同时也是bash的命令执行符号,需要去除或转义,多条语句用逗号分隔,一次只能更新一张表
--recursion-method: 默认是show processlist,但在云服务器上需要设置为none,否则可能在execute的时候可能报错
--print: 打印执行状态和语句
--quiet: 静默执行
--dry-run: 和–execute二选一,dry run模式只输出执行的语句,不实际执行,用于任务开始前的检查
--execute: 和–dry-run二选一,正式执行

案例

pt-online-schema-change -uroot -ppassword -h127.0.0.1 --alter 'DROP INDEX client_id ,ADD INDEX client_id (client_id) USING HASH ,DROP INDEX org_id ,ADD INDEX org_id (org_id) USING HASH ,DROP INDEX gateway ,ADD INDEX gateway (gateway) USING HASH ,DROP INDEX dev_id ,ADD INDEX dev_id (dev_id) USING HASH ,DROP INDEX customer_id ,ADD INDEX customer_id (customer_id) USING HASH ,DROP INDEX client_order_id ,ADD INDEX client_order_id (client_order_id) USING HASH ,DROP INDEX channel ,ADD INDEX channel (channel) USING HASH' D=sample_db,t=sample_table --recursion-method=none --execute --print

waiting for metadata lock问题:

执行execute时有两个节点可能遭遇这个问题,一个是creating trigger,另一个是switch table

首先执行

select * from information_schema.innodb_trx

查看当前的transaction

根据trx_started判断transaction持续时间,如果发现有transaction持续时间过长,应该尝试kill掉对应的thread,thread id在trx_mysql_thread_id

标签:,

Leave a Comment