I modified the above test scenario to make it simpler and modified the DDL, procedure, and pt-online-schema-change script to specifically check whether the trigger really working during the pt-osc process operates.
By adding the 'source' column to the table,
'PROCEDURE' is inserted when a procedure is introduced,
and 'TRIGGER' is inserted when the trigger of pt-osc is activated.
1-2. Procedure DDL Script
DELIMITER $$
CREATE or replace DEFINER=`admin`@`%` PROCEDURE `bjh`.`ptosctest`(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE LAST_MSHP_ID INT DEFAULT 0;
SELECT
count(1)
INTO LAST_MSHP_ID
FROM bjh.test1 mmm
WHERE mmm.STR_CD = '012002'
AND mshp_id LIKE '%test84';
WHILE i < num
DO
INSERT INTO bjh.test1
(
MSHP_ID,
STR_CD,
reg_dtm,
source
)
values(
CONCAT(LAST_MSHP_ID, 'test84')
,'012002'
,now()
,'PROCEDURE'
);
SET i = i+1;
SET LAST_MSHP_ID = LAST_MSHP_ID + 1;
END WHILE;
2. Modifying pt-osc script
I modified pt-online-schema-change's script at line number 11860
(as-is)
my $insert_trigger
= "CREATE TRIGGER `${prefix}_ins` AFTER INSERT ON $orig_tbl->{name} "
. "FOR EACH ROW "
. "BEGIN "
. "DECLARE CONTINUE HANDLER FOR 1146 begin end; "
. "REPLACE INTO $new_tbl->{name} ($qcols) VALUES ($new_vals);"
. "END ";
(modified script)
my $insert_trigger = "CREATE TRIGGER `${prefix}_ins` BEFORE INSERT ON $orig_tbl->{name} " . "FOR EACH ROW " . "BEGIN " . "DECLARE CONTINUE HANDLER FOR 1146 begin end; " . "REPLACE INTO $new_tbl->{name} " . "(`seq`, `mshp_id`, `str_cd`, `rest_pnt`, `reg_dtm`, `source`) " . "VALUES (NEW.`seq`, NEW.`mshp_id`, NEW.`str_cd`, NEW.`rest_pnt`, NEW.`reg_dtm`, 'TRIGGER');" . "END ";
mysql> select @@version;
+---------------------+
| @@version |
+---------------------+
| 10.11.7-MariaDB-log |
+---------------------+
1 row in set (0.00 sec)
mysql> select count(*) from bjh.test1 where source='TRIGGER';
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (3.28 sec)
In mysql
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.35 |
+-----------+
1 row in set (0.00 sec)
mysql> select count(*) from bjh.test1 where source='TRIGGER';
+----------+
| count(*) |
+----------+
| 457 |
+----------+
1 row in set (0.04 sec)
As a result, clear is that the pt-osc trigger operates normally in mysql, but the table reflection by the trigger is not properly performed in mariadb. I need to check if this is an internal logic problem in mariadb.
I modified the above test scenario to make it simpler and modified the DDL, procedure, and pt-online- schema- change script to specifically check whether the trigger really working during the pt-osc process operates.
1-1. Table DDL Script `MSHP_ID` ,`STR_CD` ) utf8mb4_ general_ ci;
CREATE TABLE `test1` (
`seq` bigint unsigned not null AUTO_INCREMENT,
`MSHP_ID` varchar(16) NOT NULL ,
`STR_CD` varchar(7) NOT NULL ,
`REST_PNT` decimal(15,3) DEFAULT NULL,
`REG_DTM` varchar(25) DEFAULT NULL ,
`source` varchar(30) DEFAULT NULL ,
PRIMARY KEY (`seq`,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=
By adding the 'source' column to the table,
'PROCEDURE' is inserted when a procedure is introduced,
and 'TRIGGER' is inserted when the trigger of pt-osc is activated.
1-2. Procedure DDL Script ptosctest` (IN num INT)
DELIMITER $$
CREATE or replace DEFINER=`admin`@`%` PROCEDURE `bjh`.`
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE LAST_MSHP_ID INT DEFAULT 0;
SELECT
count(1)
INTO LAST_MSHP_ID
FROM bjh.test1 mmm
WHERE mmm.STR_CD = '012002'
AND mshp_id LIKE '%test84';
WHILE i < num LAST_MSHP_ ID, 'test84')
DO
INSERT INTO bjh.test1
(
MSHP_ID,
STR_CD,
reg_dtm,
source
)
values(
CONCAT(
,'012002'
,now()
,'PROCEDURE'
);
SET i = i+1;
SET LAST_MSHP_ID = LAST_MSHP_ID + 1;
END WHILE;
2. Modifying pt-osc script schema- change' s script at line number 11860
. "FOR EACH ROW "
. "BEGIN "
. "DECLARE CONTINUE HANDLER FOR 1146 begin end; "
. "REPLACE INTO $new_tbl->{name} "
. "(`seq`, `mshp_id`, `str_cd`, `rest_pnt`, `reg_dtm`, `source`) "
. "VALUES (NEW.`seq`, NEW.`mshp_id`, NEW.`str_cd`, NEW.`rest_pnt`, NEW.`reg_dtm`, 'TRIGGER');"
. "END ";
I modified pt-online-
(as-is)
my $insert_trigger
= "CREATE TRIGGER `${prefix}_ins` AFTER INSERT ON $orig_tbl->{name} "
. "FOR EACH ROW "
. "BEGIN "
. "DECLARE CONTINUE HANDLER FOR 1146 begin end; "
. "REPLACE INTO $new_tbl->{name} ($qcols) VALUES ($new_vals);"
. "END ";
(modified script)
my $insert_trigger = "CREATE TRIGGER `${prefix}_ins` BEFORE INSERT ON $orig_tbl->{name} "
3. Operate Procedure & pt-osc
In Session A :
call bjh. ptosctest(500000);
(5~10 Seconds later ) In Session B :
pt-online- schema- change --alter "ADD CONSTRAINT CHK_RESTPNT_RANGE CHECK (ABS(REST_PNT) < 1000000000)" D=bjh,t= test1,P= 3306 \ bjh-test- ptosc.czeeuhi5h mdb.us- east-1. rds.amazonaws. com \ 'qkswlgus' \ "Threads_ running= 200" \ load="Threads_ running= 1000" \ method= none \ index=PRIMARY \
--no-drop-old-table \
--host=
--user=admin \
--password=
--progress=time,30 \
--max-load=
--critical-
--recursion-
--chunk-
--preserve-triggers \
--execute
4. Select Result
In mariadb
mysql> select @@version; ------- ------- -+ ------- ------- -+ ------- ------- -+
+------
| @@version |
+------
| 10.11.7-MariaDB-log |
+------
1 row in set (0.00 sec)
mysql> select count(*) from bjh.test1 where source='TRIGGER';
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (3.28 sec)
In mysql
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.35 |
+-----------+
1 row in set (0.00 sec)
mysql> select count(*) from bjh.test1 where source='TRIGGER';
+----------+
| count(*) |
+----------+
| 457 |
+----------+
1 row in set (0.04 sec)
As a result, clear is that the pt-osc trigger operates normally in mysql, but the table reflection by the trigger is not properly performed in mariadb. I need to check if this is an internal logic problem in mariadb.