mysql在线修改表结构,如何避免锁表?( 二 )

  • --progress
  • 复制数据的进度报告 , 二部分组成:第一部分是百分比 , 第二部分是时间
  • --set-vars
  • 设置mysql变量 , 多个用逗号分割 。默认该工具设置的是: wait_timeout=10000 innodb_lock_wait_timeout=1 lock_wait_timeout=60
  • 三、pt-online-schema-change使用展示1.参数
    ./bin/pt-online-schema-change --help 可以查看参数的使用 , 我们只是要修改个表结构 , 只需要知道几个简单的参数就可以了
    --user= 连接mysql的用户名--password= 连接mysql的密码--host= 连接mysql的地址P=3306 连接mysql的端口号D= 连接mysql的库名t= 连接mysql的表名--alter 修改表结构的语句--execute 执行修改表结构--charset=utf8 使用utf8编码 , 避免中文乱码--no-version-check 不检查版本 , 在阿里云服务器中一般加入此参数 , 否则会报错2.为避免每次都要输入一堆参数 , 写个脚本pt.sh
    #!/bin/bashtable=$1alter_conment=$2?cnn_host='127.0.0.1'cnn_user='user'cnn_pwd='password'cnn_db='database_name'?echo "$table"echo "$alter_conment"/root/percona-toolkit-2.2.19/bin/pt-online-schema-change --charset=utf8 --no-version-check --user=${cnn_user} --password=${cnn_pwd} --host=${cnn_host} P=3306,D=${cnn_db},t=$table --alter "${alter_conment}" --execute3.添加表字段
    如添加表字段SQL语句为:
    ALTER TABLE `tb_test` ADD COLUMN `column1` tinyint(4) DEFAULT NULL;那么使用pt-online-schema-change则可以这样写
    sh pt.sh tb_test "ADD COLUMN column1 tinyint(4) DEFAULT NULL"4.修改表字段
    【mysql在线修改表结构,如何避免锁表?】SQL语句:
    ALTER TABLE `tb_test` MODIFY COLUMN `num` int(11) unsigned NOT NULL DEFAULT '0';pt-online-schema-change工具:
    sh pt.sh tb_test "MODIFY COLUMN num int(11) unsigned NOT NULL DEFAULT '0'"5.修改表字段名
    SQL语句:
    ALTER TABLE `tb_test` CHANGE COLUMN age adress varchar(30);pt-online-schema-change工具:
    sh pt.sh tb_test "CHANGE COLUMN age address varchar(30)"6.添加索引
    SQL语句:
    ALTER TABLE `tb_test` ADD INDEX idx_address(address);pt-online-schema-change工具:
    sh pt.sh tb_test "ADD INDEX idx_address(address)"四、注意事项
    • 禁止的一些ddl
    1. 禁止创建唯一索引 , 会丢失数据 , 更加不允许添加 --alter-check=no , --check-unique-key-change=no2. 如果原表没有主键 , 或者也没有唯一索引 , 这些表是不允许用pt做DDL的3. 禁止对外键的表进行pt ddl4. 禁止对表进行重命名5. 禁止对列进行重命名 , 如果一定要做 , 也必须先print出来检测清楚列名是否正确6. 新增字段 , NOT NULL必须要指定默认值7. 不允许删除主键
    • 由于rowcopy会产业很多的binlog , 所以做之前要确保binlog空间、数据空间有足够空间可用 。
    • 禁止在业务高峰期进行pt-online-schema-change操作
    • 原表不能有触发器
    • MySQL最好设置为innodb_autoinc_lock_mode=2 , 否则在高并发的写入情况下 , 很容易产生所等待以及死锁
    • master的表结构必须跟slave的表结构一致 , 不允许异构 , 否则pt-online-schema-change的原理就是会rename , 然后slave不一致的表结构会被master覆盖 , 切记!
    五、小结
    • pt-online-schema-change工具是在线修改表结构的利器 , 除了上述参数还有其他参数 , 不过上述常规参数基本能满足业务需要 。
    • 一定要在业务低峰期做 , 这样才能确保万无一失 , 切记!




    推荐阅读