zoukankan      html  css  js  c++  java
  • MySQL之ptosc原理

      参考:https://www.cnblogs.com/mysql-dba/p/9901632.html

         https://blog.csdn.net/hanbowu/article/details/79919621

      pt-osc原理

       一,环境检查

    # uname -a
    Linux prd-mysql-master 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    # mysql -V
    mysql  Ver 14.14 Distrib 5.7.22, for linux-glibc2.12 (x86_64) using  EditLine wrapper
    

       二,下载安装包

      下载地址

    https://www.percona.com/downloads/percona-toolkit/LATEST/
    

      根据需要选择的版本下载即可

      本次我们下载centos7下的3.0.11版本

       三,安装

      安装依赖

    yum -y install perl
    yum -y install perl-DBI
    yum -y install perl-DBD-MySQL
    yum -y install perl-Time-HiRes
    yum -y install perl-IO-Socket-SSL
    

      下载的文件解压后是rpm文件,安装即可

    rpm -ivh percona-toolkit-3.0.11-1.el7.x86_64.rpm 
    

      四,使用

      pt-osc的工作原理

    •   创建一个和原表一样的结构的新表
    •   在新表执行DDL语句
    •   在源表创建三个触发器分别对应insert,update,delete操作
    •   从源表拷贝数据到新表,拷贝过程中源表通过触发器把新的DML操作更新到新表中
    •   rename源表到old表中,把新表rename为源表,默认最后删除源表

      pt-osc工具的限制

      1,源表不能有触发器存在

      显然不是不能有任何触发器,只是不能有针对insert、update、delete的触发器存在,因为一个表上不能有两个相同类型的触发器

      2,源表必须要有主键

      3,源表有外键,必须使用--alter-foreign-keys-method指定特定的值

      使用示例

      使用之前创建数据库test以及表test01

    mysql>create database test;
    mysql> create table test01(id int(4) not null primary key);
    

      注意:表需要有主键否则无法使用pt-osc

      1,添加新列

    [root@prd-mysql-master opt]# pt-online-schema-change --host=127.0.0.1 --port=3306 --user=root --password=123456 --alter "add column age int(4) default 0" D=test,t=test01 --print --execute
    Found 1 slaves:
    prd-mysql-slave -> 172.16.90.188:3306
    Will check slave lag on:
    prd-mysql-slave -> 172.16.90.188:3306
    Operation, tries, wait:
      analyze_table, 10, 1
      copy_rows, 10, 0.25
      create_triggers, 10, 1
      drop_triggers, 10, 1
      swap_tables, 10, 1
      update_foreign_keys, 10, 1
    Altering `test`.`test01`...
    Creating new table...
    CREATE TABLE `test`.`_test01_new` (
      `id` int(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    Created new table test._test01_new OK.
    Altering new table...
    ALTER TABLE `test`.`_test01_new` add column age int(4) default 0
    Altered `test`.`_test01_new` OK.
    2022-01-05T22:59:01 Creating triggers...
    2022-01-05T22:59:01 Created triggers OK.
    2022-01-05T22:59:01 Copying approximately 1 rows...
    INSERT LOW_PRIORITY IGNORE INTO `test`.`_test01_new` (`id`) SELECT `id` FROM `test`.`test01` LOCK IN SHARE MODE /*pt-online-schema-change 20128 copy table*/
    2022-01-05T22:59:01 Copied rows OK.
    2022-01-05T22:59:01 Analyzing new table...
    2022-01-05T22:59:01 Swapping tables...
    RENAME TABLE `test`.`test01` TO `test`.`_test01_old`, `test`.`_test01_new` TO `test`.`test01`
    2022-01-05T22:59:01 Swapped original and new tables OK.
    2022-01-05T22:59:01 Dropping old table...
    DROP TABLE IF EXISTS `test`.`_test01_old`
    2022-01-05T22:59:01 Dropped old table `test`.`_test01_old` OK.
    2022-01-05T22:59:01 Dropping triggers...
    DROP TRIGGER IF EXISTS `test`.`pt_osc_test_test01_del`
    DROP TRIGGER IF EXISTS `test`.`pt_osc_test_test01_upd`
    DROP TRIGGER IF EXISTS `test`.`pt_osc_test_test01_ins`
    2022-01-05T22:59:01 Dropped triggers OK.
    Successfully altered `test`.`test01`.
    

      --print可以打印详细的执行日志已经明显显示了整个执行过程

      查看MySQL表也可以看到增加了列

    mysql> desc test01;
    +-------+--------+------+-----+---------+-------+
    | Field | Type   | Null | Key | Default | Extra |
    +-------+--------+------+-----+---------+-------+
    | id    | int(4) | NO   | PRI | NULL    |       |
    | age   | int(4) | YES  |     | 0       |       |
    +-------+--------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    

      2,增加索引

    pt-online-schema-change --host=127.0.0.1 --port=3306 --user=root --password=123456 --alter "add key indx_vid(age)" D=test,t=test01 --execute
    

      

      

      

  • 相关阅读:
    UVALive
    BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
    BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)
    51nod1674:区间的价值2(分治,利用&和|的收敛性)
    [CQOI2009]DANCE跳舞
    [HNOI2006]超级英雄
    Luogu1613 跑路
    [HZOI 2016]公路修建
    [NOI2014]魔法森林
    [HAOI2006] 旅行
  • 原文地址:https://www.cnblogs.com/minseo/p/15769308.html
Copyright © 2011-2022 走看看