obdumper是下载的社区办官网最新的
目前能复现是存储过程中有以下两个存储过程的时候 就会出现参数顺序不一致
今天用obdumper复现的。
./obdumper -h -P 2883 -u '’ --tenant ‘’ -p '’ -c obcluster -D test_db_20230301 --procedure ‘*’ --ddl --file-path /root/dbbakoutput/13
单独导出是不会的
./obdumper -h -P 2883 -u '’ --tenant ‘’ -p '’ -c obcluster -D test_db_20230301 --procedure ‘create_number_month_partition’ --ddl --file-path /root/dbbakoutput/13
CREATE DEFINER = root@% PROCEDURE test_db_20230301
.create_number_month_partition
(
IN in_database_name
varchar(64), IN in_table_name
varchar(64)
) BEGIN
– 自动分区创建存储过程, 需要传入表名, 表需要预先创建分区, 分区的格式为pYYYYMM才能支持自动分区, 如p202107
– 数据库名
DECLARE database_name varchar(64);
– 表名
DECLARE table_name varchar(64);
– 最近一次分区的名称
DECLARE p_last_name varchar(20);
– 最近一次分区的时间
DECLARE p_last_date date;
– 最近一次分区的时间
DECLARE p_last_date_str varchar(20);
– 最近一次分区的时间搓
DECLARE p_last_less_unix_time_date BIGINT;
– 最近一次分区的年月, 用于计算月份间隔, 格式yyyyMM
DECLARE p_last_year_month_day varchar(10);
– 当前年月, 用于计算月份间隔, 格式yyyyMM
DECLARE now_year_month_day varchar(10);
SET table_name = in_table_name;
SET database_name = in_database_name;
– 查询最近一次的分区名称
SET @find_partition = CONCAT(‘SELECT partition_name INTO @p_last_name FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = ‘’’, database_name, ‘’’ AND TABLE_NAME = ‘’’, table_name,’’’ ORDER BY partition_ordinal_position DESC LIMIT 1;’);
PREPARE stmt1 FROM @find_partition;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
SET p_last_name = @p_last_name;
– 将最近一次的分区名称转换为日期
SET p_last_date = DATE_FORMAT(CONCAT( REPLACE(REPLACE(p_last_name, ‘’’’, ‘’), ‘p’, ‘’), “01”), ‘%Y%m%d’);
– 获取最近一次的分区时间格式yyyyMM
SET p_last_year_month_day = DATE_FORMAT(p_last_date, ‘%Y%m’);
– 获取当前时间格式yyyyMMdd, 由于分区使用的是less than, 分区p20210701保存的是7月1号的数据, 需要提前为下月的数据创建分区,所以这里增加3天,防止数据跨日时没有分区导致数据添加不进来
– 这里也是用来控制提前新增的分区数量的
SET now_year_month_day = DATE_FORMAT(DATE_ADD(curdate(), interval 2 MONTH), ‘%Y%m’);
IF PERIOD_DIFF(now_year_month_day, p_last_year_month_day) > 0 THEN
– 将分区日期增加一个月, 新增分区时间
SET p_last_date = DATE_ADD(p_last_date, interval 1 MONTH);
SET p_last_date_str = DATE_FORMAT(p_last_date, '%Y%m');
SET p_last_less_unix_time_date = UNIX_TIMESTAMP(DATE_ADD(p_last_date, interval 1 MONTH));
SET @add_partition = CONCAT(‘alter table ‘, table_name,’ add partition (partition ', concat('p', p_last_date_str),'
VALUES LESS than(’, p_last_less_unix_time_date, ‘))’);
PREPARE stmt FROM @add_partition;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END
CREATE DEFINER = root@% PROCEDURE test_db_20230301
.create_number_partition
(
IN in_database_name
varchar(64), IN in_table_name
varchar(64)
) BEGIN
– 自动分区创建存储过程, 需要传入表名, 表需要预先创建分区, 分区的格式为pYYYYMMdd才能支持自动分区, 如p20210724
– 数据库名
DECLARE database_name varchar(64);
– 表名
DECLARE table_name varchar(64);
– 最近一次分区的名称
DECLARE p_last_name varchar(20);
– 最近一次分区的时间
DECLARE p_last_date date;
– 最近一次分区的时间
DECLARE p_last_date_str varchar(20);
– 最近一次分区的时间搓
DECLARE p_last_less_unix_time_date BIGINT;
– 最近一次分区的年月, 用于计算月份间隔, 格式yyyyMMdd
DECLARE p_last_year_month_day varchar(10);
– 当前年月, 用于计算月份间隔, 格式yyyyMMdd
DECLARE now_year_month_day varchar(10);
SET table_name = in_table_name;
SET database_name = in_database_name;
– 查询最近一次的分区名称
SET @find_partition = CONCAT(‘SELECT partition_name INTO @p_last_name FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = ‘’’, database_name, ‘’’ AND TABLE_NAME = ‘’’, table_name,’’’ ORDER BY partition_ordinal_position DESC LIMIT 1;’);
PREPARE stmt1 FROM @find_partition;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
SET p_last_name = @p_last_name;
– 将最近一次的分区名称转换为日期
SET p_last_date = DATE_FORMAT(REPLACE(REPLACE(p_last_name, ‘’’’, ‘’), ‘p’, ‘’), ‘%Y%m%d’);
– 获取最近一次的分区时间格式yyyyMM
SET p_last_year_month_day = DATE_FORMAT(p_last_date, ‘%Y%m%d’);
– 获取当前时间格式yyyyMMdd, 由于分区使用的是less than, 分区p20210701保存的是7月1号的数据, 需要提前为下月的数据创建分区,所以这里增加3天,防止数据跨日时没有分区导致数据添加不进来
– 这里也是用来控制提前新增的分区数量的
SET now_year_month_day = DATE_FORMAT(DATE_ADD(curdate(), interval 2 DAY), ‘%Y%m%d’);
IF DATEDIFF(now_year_month_day, p_last_year_month_day) > 0 THEN
– 将分区日期增加一个月, 新增分区时间
SET p_last_date = DATE_FORMAT(DATE_ADD(p_last_date, interval 1 DAY), ‘%Y%m%d’);
SET p_last_date_str = DATE_FORMAT(p_last_date, '%Y%m%d');
SET p_last_less_unix_time_date = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD(p_last_date, interval 1 DAY), '%Y%m%d'));
SET @add_partition = CONCAT(‘alter table ‘, table_name,’ add partition (partition ', concat('p', p_last_date_str),'
VALUES LESS than(’, p_last_less_unix_time_date, ‘))’);
PREPARE stmt FROM @add_partition;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END