zoukankan      html  css  js  c++  java
  • mysql pt-osc

    一、pt-osc的工作原理

    (1.1)基本原理步骤

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

     

    general log种已经算比较详细了,但不同参数可能结果还是会有不少区别,此处不多分析,精简一下osc的几个重要的步骤如下:

    步骤操作
    step1 检查原表是否由主键和触发器
    step2 被操作表是S表,创建tmp-S数据表
    step3 在S表上创建insert update delete触发器
    step4 全量数据同步过去
    step5 全量同步的过程中,新产生的增量(变化)数据就触发到tmp-S表中
    step6 新旧表重命名(元数据锁,短暂锁表)
    step7 删除旧表,删除触发器

    general log 提炼全过程

    step1:略
    
    step2:
    (root@localhost) [(none)]> truncate mysql.general_log;
    Query OK, 0 rows affected (1.65 sec)
    
    (root@localhost) [(none)]> set global general_log = 1;
    Query OK, 0 rows affected (0.00 sec)
    
    (root@localhost) [(none)]> set global log_output = 'table';
    Query OK, 0 rows affected (0.01 sec)
    
    step 3:
    pt-online-schema-change --alter "add index index_c (c)" --socket=/tmp/mysql.sock --user=root --password=123  D=test,t=sbtest1 --execute
    No slaves found.  See --recursion-method if host VM_221_162_centos has slaves.
    Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
    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`.`sbtest1`...
    Creating new table...
    Created new table test._sbtest1_new OK.
    Altering new table...
    Altered `test`.`_sbtest1_new` OK.
    2017-11-30T18:28:19 Creating triggers...
    2017-11-30T18:28:19 Created triggers OK.
    2017-11-30T18:28:19 Copying approximately 493200 rows...
    2017-11-30T18:28:41 Copied rows OK.
    2017-11-30T18:28:41 Analyzing new table...
    2017-11-30T18:28:41 Swapping tables...
    2017-11-30T18:28:41 Swapped original and new tables OK.
    2017-11-30T18:28:41 Dropping old table...
    2017-11-30T18:28:41 Dropped old table `test`.`_sbtest1_old` OK.
    2017-11-30T18:28:41 Dropping triggers...
    2017-11-30T18:28:41 Dropped triggers OK.
    Successfully altered `test`.`sbtest1`.
    
    上面已经可以看出个大概过程了
    
    step 4:
    这一步详细分5块分析如下:
    (root@localhost) [(none)]> set global log_output = 'file';
    Query OK, 0 rows affected (0.00 sec)
    
    (root@localhost) [(none)]> set global general_log = 0;
    Query OK, 0 rows affected (0.01 sec)
    
    (root@localhost) [mysql]> select argument from mysql.general_log;
    
     root@localhost on test using Socket                                                                
     set autocommit=1                                                                               
     SHOW VARIABLES LIKE 'innodb\_lock_wait_timeout'                                                
     SET SESSION innodb_lock_wait_timeout=1                                                             
     SHOW VARIABLES LIKE 'lock\_wait_timeout'                                                   
     SET SESSION lock_wait_timeout=60                                                                   
     SHOW VARIABLES LIKE 'wait\_timeout'                                                            
     SET SESSION wait_timeout=10000                                                                 
     SELECT @@SQL_MODE                                                                                  
     SET @@SQL_QUOTE_SHOW_CREATE = 1/*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/                        
     SELECT @@server_id /*!50038 , @@hostname*/  
    
    说明:
    1、设置session级的变量
     SET SESSION innodb_lock_wait_timeout=1  
     SET SESSION lock_wait_timeout=60  
     SET SESSION wait_timeout=10000 
     
     -----------------------------------------
     
     SHOW VARIABLES LIKE 'version%'                                                                  
     SHOW ENGINES                                                                                   
     SHOW VARIABLES LIKE 'innodb_version'                                                           
     SHOW VARIABLES LIKE 'innodb_stats_persistent'                                                  
     SELECT @@SERVER_ID                                                                             
     SHOW GRANTS FOR CURRENT_USER()                                                                     
     SHOW FULL PROCESSLIST                                     
     SHOW SLAVE HOSTS                                                                                 
     SHOW GLOBAL STATUS LIKE 'Threads_running'                                                       
     SHOW GLOBAL STATUS LIKE 'Threads_running'                           
     SELECT CONCAT(@@hostname, @@port)                                                           
     SHOW TABLES FROM `test` LIKE 'sbtest1'                                  
     SELECT VERSION()                                       
     SHOW TRIGGERS FROM `test` LIKE 'sbtest1'                                                   
     /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */                                                              
     USE `test`                                                             
     SHOW CREATE TABLE `test`.`sbtest1`                                       
     /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */                 
     EXPLAIN SELECT * FROM `test`.`sbtest1` WHERE 1=1                                    
     SELECT table_schema, table_name FROM information_schema.key_column_usage WHERE referenced_table_schema='test' AND referenced_table_name='sbtest1'                               
     SHOW VARIABLES LIKE 'wsrep_on'                                                                    
     /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */ 
     
    说明:
    1、查看变量,当前用户的权限,slave信息,版本信息等
    2、检查sbtest1是否存在触发器
    3、执行计划
    4、检查sbtest1是否存在外键关联
    
     -----------------------------------------
    
     USE `test`                                 
     SHOW CREATE TABLE `test`.`sbtest1`                                                             
     /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */                 
     CREATE TABLE `test`.`_sbtest1_new` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
        `k` int(11) NOT NULL DEFAULT '0',
          `c` char(120) NOT NULL DEFAULT '',
            `pad` char(60) NOT NULL DEFAULT '',
              PRIMARY KEY (`id`),
                KEY `k_1` (`k`)
                ) ENGINE=InnoDB AUTO_INCREMENT=500001 DEFAULT CHARSET=latin1 
     ALTER TABLE `test`.`_sbtest1_new` add index index_c (c)                                            
     /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */                                                                 
     USE `test`                                                                                 
     SHOW CREATE TABLE `test`.`_sbtest1_new`                                    
     /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */                 
     
     SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE,        CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING   FROM INFORMATION_SCHEMA.TRIGGERS  WHERE EVENT_MANIPULATION = 'DELETE'    AND ACTION_TIMING = 'AFTER'    AND TRIGGER_SCHEMA = 'test'    AND EVENT_OBJECT_TABLE = 'sbtest1'  
     SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE,        CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING   FROM INFORMATION_SCHEMA.TRIGGERS  WHERE EVENT_MANIPULATION = 'UPDATE'    AND ACTION_TIMING = 'AFTER'    AND TRIGGER_SCHEMA = 'test'    AND EVENT_OBJECT_TABLE = 'sbtest1'  
     SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE,        CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING   FROM INFORMATION_SCHEMA.TRIGGERS  WHERE EVENT_MANIPULATION = 'INSERT'    AND ACTION_TIMING = 'AFTER'    AND TRIGGER_SCHEMA = 'test'    AND EVENT_OBJECT_TABLE = 'sbtest1'  
     SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE,        CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING   FROM INFORMATION_SCHEMA.TRIGGERS  WHERE EVENT_MANIPULATION = 'DELETE'    AND ACTION_TIMING = 'BEFORE'    AND TRIGGER_SCHEMA = 'test'    AND EVENT_OBJECT_TABLE = 'sbtest1' 
     SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE,        CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING   FROM INFORMATION_SCHEMA.TRIGGERS  WHERE EVENT_MANIPULATION = 'UPDATE'    AND ACTION_TIMING = 'BEFORE'    AND TRIGGER_SCHEMA = 'test'    AND EVENT_OBJECT_TABLE = 'sbtest1' 
     SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE,        CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING   FROM INFORMATION_SCHEMA.TRIGGERS  WHERE EVENT_MANIPULATION = 'INSERT'    AND ACTION_TIMING = 'BEFORE'    AND TRIGGER_SCHEMA = 'test'    AND EVENT_OBJECT_TABLE = 'sbtest1' 
     
     CREATE TRIGGER `pt_osc_test_sbtest1_del` AFTER DELETE ON `test`.`sbtest1` FOR EACH ROW DELETE IGNORE FROM `test`.`_sbtest1_new` WHERE `test`.`_sbtest1_new`.`id` <=> OLD.`id`          
     CREATE TRIGGER `pt_osc_test_sbtest1_upd` AFTER UPDATE ON `test`.`sbtest1` FOR EACH ROW BEGIN DELETE IGNORE FROM `test`.`_sbtest1_new` WHERE !(OLD.`id` <=> NEW.`id`) AND `test`.`_sbtest1_new`.`id` <=> OLD.`id`;REPLACE INTO `test`.`_sbtest1_new` (`id`, `k`, `c`, `pad`) VALUES (NEW.`id`, NEW.`k`, NEW.`c`, NEW.`pad`);END              
     CREATE TRIGGER `pt_osc_test_sbtest1_ins` AFTER INSERT ON `test`.`sbtest1` FOR EACH ROW REPLACE INTO `test`.`_sbtest1_new` (`id`, `k`, `c`, `pad`) VALUES (NEW.`id`, NEW.`k`, NEW.`c`, NEW.`pad`)
     
     说明:
     1、根据原表的表结构结创建一张新表
     2、对新表上的c字段加索引,这里依然用的是alter
     3、检查原表上触发器情况,5.6开始同一张表上不能存在同一个动作的触发器
     4、针对新表创建三个触发器,DELETE,UPDATE和INSERT(重点看下三个触发器内容)
    
     -----------------------------------------
     
     EXPLAIN SELECT * FROM `test`.`sbtest1` WHERE 1=1                                                 
     SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) ORDER BY `id` LIMIT 1 /*first lower boundary*/                                       
     SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `test`.`sbtest1` FORCE INDEX (`PRIMARY`) WHERE `id` IS NOT NULL ORDER BY `id` LIMIT 1 /*key_len*/                              
     
     EXPLAIN SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`sbtest1` FORCE INDEX (`PRIMARY`) WHERE `id` >= '1' /*key_len*/                                               
     EXPLAIN SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '1')) ORDER BY `id` LIMIT 999, 2 /*next chunk boundary*/                                 
     SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '1')) ORDER BY `id` LIMIT 999, 2 /*next chunk boundary*/                                        
     EXPLAIN SELECT `id`, `k`, `c`, `pad` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '1')) AND ((`id` <= '1000')) LOCK IN SHARE MODE /*explain pt-online-schema-change 16157 copy nibble*/                                  
     INSERT LOW_PRIORITY IGNORE INTO `test`.`_sbtest1_new` (`id`, `k`, `c`, `pad`) SELECT `id`, `k`, `c`, `pad` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '1')) AND ((`id` <= '1000')) LOCK IN SHARE MODE /*pt-online-schema-change 16157 copy nibble*/                             
     SHOW WARNINGS                                                                          
     SHOW GLOBAL STATUS LIKE 'Threads_running'       
     
     EXPLAIN SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '1001')) ORDER BY `id` LIMIT 3787, 2 /*next chunk boundary*/                             
     SELECT /*!40001 SQL_NO_CACHE */ `id` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '1001')) ORDER BY `id` LIMIT 3787, 2 /*next chunk boundary*/                                      
     EXPLAIN SELECT `id`, `k`, `c`, `pad` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '1001')) AND ((`id` <= '4788')) LOCK IN SHARE MODE /*explain pt-online-schema-change 16157 copy nibble*/                                                                     
     INSERT LOW_PRIORITY IGNORE INTO `test`.`_sbtest1_new` (`id`, `k`, `c`, `pad`) SELECT `id`, `k`, `c`, `pad` FROM `test`.`sbtest1` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= '1001')) AND ((`id` <= '4788')) LOCK IN SHARE MODE /*pt-online-schema-change 16157 copy nibble*/               
     SHOW WARNINGS                                                                                 
     SHOW GLOBAL STATUS LIKE 'Threads_running'  
     
     说明:
     1、chunk太多,此处只贴两组
     2、以chunk为单位进行目标表数据的拷贝(根据pk或uk分片),有专门的参数指定怎么分片
     3、在拷贝的过程中,对目标表的相关记录加了lock in share mode mode保证数据一致性,此时,会堵塞客户端对这些记录的DML操作
     4、LOW_PRIORITY插入,降低优先级插入,等表上无其他操作时才插
     5、SHOW GLOBAL STATUS LIKE 'Threads_running'检查当前正在运行的Threads数量,默认Threads_running=25,如果未指定最大值,则会取当前值的120%作为最大值,如果超过阀值则会暂停数据拷贝
     6、很多explain语句?原因是没指定chunk大小,第一次默认分1000条记录,后面chunk具体多少根据执行计划判断成本,不影响系统正常运行则执行insert
    
     -----------------------------------------
    
     RENAME TABLE `test`.`sbtest1` TO `test`.`_sbtest1_old`, `test`.`_sbtest1_new` TO `test`.`sbtest1` 
     DROP TABLE IF EXISTS `test`.`_sbtest1_old`                                                       
     DROP TRIGGER IF EXISTS `test`.`pt_osc_test_sbtest1_del`                            
     DROP TRIGGER IF EXISTS `test`.`pt_osc_test_sbtest1_upd`                                         
     DROP TRIGGER IF EXISTS `test`.`pt_osc_test_sbtest1_ins`                                            
     SHOW TABLES FROM `test` LIKE '\_sbtest1\_new' 
    
    说明:
    1、ANALYZE更新新表的统计信息
    2、新老两张表重命名
    3、删除原表
    4、删除触发器
    View Code

    重点提炼:

    (1.2)如何保证全量先过去还是增量先过去?

      insert、update两个触发器都是replace机制,解决了增量先于全量导致数据不对的问题

      比如update一条记录,全量的还没进来,你update啥呢?是空数据,就不执行,但没关系,我先把最新数据插进去,全量过来冲突了就ignore,此时无主键就会导致数据错误

      ignore表示出错了,不会返回出错信息,直接忽略

      update的ignore:增量数据先执行了,又接着导原来的数据进去可能会主键冲突

      delete的ignore:导入过程中,原表一条数据被删除,之后的导入过程中已经没有这条记录了,那么新表中delete时找不到该记录

    (1.3)怎样保证limit 1000 数据一致?

    数据一致是由lock in share mode保证

    (1.4)为什么不直接先全量后增量?

    不好控制,先建触发器,所以肯定有增量比全量之先过去,如果触发器后建,那导入全量的时候产生的增量又没办法弄了

    (1.5)osc的一些限制

    ①表上一定要有主键(操作主键有风险需注意)

      一方面chunck分片时要用主键,另一方面降低数据错误的风险
    ②表上有外键怎么办?

      --alter-foreign-keys-metho=rebuild_constraints
    ③原表不能存在触发器

      同一个表不能存在同一类型的触发器(5.7版本已经没有这个限制)

    ④只支持innodb,并且实例上空闲空间大于原表1倍以上

    【1.6】go-ost

    GitHub's online schema migration for MySQL

    https://github.com/github/gh-ost

     
    image.png
    • 先连接到主库上,根据alter语句创建所需的新表;

    • 作为一个“备库”连接到其中一个真正的备库上,一边在主库上拷贝已有的数据到新表,一边从备库上拉取增量数据的binlog;

    • 然后不断的把 binlog 应用回主库;

    • cut-over是最后一步,锁住主库的源表,等待binlog 应用完毕,然后替换gh-ost表为源表。

    go-ost基于bin-log同步 , 基于binlog肯定都是伪装成一个replica。

    由于使用单线程回放binlog来替换触发器,所以增量DML回放效率不如触发器,因为pt-osc的增量回放并发度是与业务DML并发度相同的,是多线程的。

    相对于percona的优势是:

    • 对于DDL操作的灵活度掌控,可暂停,可动态修改参数;DBA可以根据执行情况来快速调整预设的参数,可快可慢,实现DDL操作性能和对业务影响的平衡;

    • 更为稳健的切表控制:将-cut-over-lock-timeout-seconds和-default-retries 配合使用,可以对切表进行灵活的控制。避免pt-osc切表异常导致对业务造成严重影响;



    二、pt-osc工具的限制

    1、源表不能有触发器存在(insert、update、delete)
    2、源表必须要有主键或唯一索引,如果没有工具将停止工作
    3、源表有外键,必须使用–alter-foreign-keys-method指定特定的值
    4、如果线上的复制环境过滤器操作过于复杂,工具将无法工作
    5、如果开启复制延迟检查,但主从延迟时,工具将暂停数据拷贝工作
    6、如果开启主服务器负载检查,但主服务器负载较高时,工具将暂停操作
    7、只支持Innodb存储引擎表,且要求服务器上有该表1倍以上的空闲空间。
    8、修改索引、外键、列名时,优先采用online ddl,并指定 ALGORITHM=INPLACE

    三、安装pt-osc工具

    下载地址:https://www.percona.com/downloads/percona-toolkit/LATEST/

    (3.1)yum安装

    wget https://www.percona.com/downloads/percona-toolkit/3.2.1/binary/redhat/7/x86_64/percona-toolkit-3.2.1-1.el7.x86_64.rpm
    yum -y install percona-toolkit-3.2.1-1.el7.x86_64.rpm

    (3.2)二进制安装

    安装包已经下载上传到机器:
    tar -zxvf percona-toolkit-3.0.12.tar.gz
    cd percona-toolkit-3.0.12/bin
    cp pt-online-schema-change /usr/bin/

    四、基本使用 与 参数

    (4.1)基本使用案例

    [root@mysql ~]# pt-online-schema-change 
    --host="127.0.0.1" 
    --port=3306 
    --user="root" 
    --password="xxxxxxx" 
    --charset="utf8mb4" 
    --max-lag=10 
    --check-salve-lag='xxx.xxx.xxx.xxx' 
    --recursion-method="hosts" 
    --check-interval=2 
    D="testdb1",t="tb001" 
    --alter="add column age int(4) default 0" 
    --dry-run
    --print
    --execute

    (4.2)常用参数

    参数 说明
    –host 数据库主机IP
    –port=3306 端口号
    –user=“root” 登录用户
    –password 登录密码(明文)
    –ask-pass 手动输入(密文)
    –charset=“utf8mb4” 指定字符集为UTF8mb4
    –max-lag=10 默认10s,检查slave延迟的值,超过10秒则暂停复制数据
    –check-salve-lag= 指定一个从库的DSN连接地址,如果从库超过–max-lag参数设置的值,就会暂停操作
    –recursion-method=“hosts” 默认是show processlist,发现从的方法,也可以是host
    –check-interval –max-lag检查的睡眠时间,默认是1
    D 指定数据库名
    t 指定表名
    –alter= 结构变更语句,不需要 ALTER TABLE关键字。与原始ddl一样可以指定多个更改,用逗号分隔
    –dry-run 只进行模拟测试
    –print 输出结果
    –execute 确定修改表

    【最佳实践】我的使用

    注意,如果有从库的话,可以主从

    (0)忽略一些检查

    很多时候老是要我检查 很烦的;

    #(1)添加唯一索引时,忽略检查被添加列中数据是否值是唯一:
    --nocheck-unique-key-change
    
    #(2)删除主键时,忽略检查是否有其他唯一索引级键(唯一key是为了保证delete触发器可以删掉对应行)
    --no-check-alter

    #(3)当有复制过滤时,pt-online-schema-change会不让使用,可以选择忽略
    --no-check-replication-filters

    (1)修改主键

    -- (1 )tea_prop_rich_log:  原主键(logid)    修改主键为(logid,logtime)      -- 分区列: logtime  (datetime)
    pt-online-schema-change --host="localhost" --port='3306' --user="root" --password="xx" 
    D="test1",t="tea_prop_rich_log" --alter="drop primary key,add primary key (logid,logtime)" --no-check-alter --nocheck-unique-key-change --execute

    (2)添加索引

    nohup pt-online-schema-change --host="localhost" --port='3306' --user="root" --password="xx" 
    D="weixin_agent",t="agent_money_stock_hourly" --alter="add unique index uix_bid(bid)" --no-check-alter --nocheck-unique-key-change --execute &

    (3)现有表修改为分区表

    pt-online-schema-change --host="localhost" --port='3306' --user="root" --password="xx" 
    D="test1",t="tea_prop_rich_log" --alter="partition by range(to_days(logtime)) ( 
    partition p202102 values less than (to_days('2021-03-01') ), 
    partition p202103 values less than (to_days('2021-04-01') ), 
    partition p202104 values less than (to_days('2021-05-01') ), 
    partition p202105 values less than (to_days('2021-06-01') ), 
    partition p202106 values less than (to_days('2021-07-01') ), 
    partition p202107 values less than (to_days('2021-08-01') ), 
    partition p202108 values less than (to_days('2021-09-01') ), 
    partition p202109 values less than (to_days('2021-10-01') ), 
    partition pmax      values less than (maxvalue) 
    );" --nocheck-unique-key-change --execute


    原文链接:https://blog.csdn.net/g950904/article/details/108822529

  • 相关阅读:
    深入Spring之IOC之加载BeanDefinition
    Hexo+GitHub Actions 完美打造个人博客
    Spring中资源的加载原来是这么一回事啊!
    Web 跨域请求问题的解决方案- CORS 方案
    重新认识 Spring IOC
    Spring Data Jpa 入门学习
    前奏:Spring 源码环境搭建
    最短路径——floyd算法代码(c语言)
    leetcode 第184场周赛第一题(数组中的字符串匹配)
    如何用尾插法建立双链表(C语言,非循环)
  • 原文地址:https://www.cnblogs.com/gered/p/15272660.html
Copyright © 2011-2022 走看看