Size: a a a

2020 July 23

V

Vlad in ru_mysql
Александр
А юзера реплицируются что ли тоже?
Да
источник

А

Александр in ru_mysql
Vlad
Да
Ага, разобрался уже, спасибо
источник

А

Александр in ru_mysql
А может кто-нть объяснить как тут дедлок появляется и как его избежать:
- данные пишутся в несколько потоков
- пачкой вставляются в целевую таблицу и в этой же транзакции агрегируются по дням
вот кусок кода:
...
START TRANSACTION;
INSERT INTO trackdb.tracking_data (created_at, event_type, conf_id, conf_shown, is_first, page_sid, conversion_value)
SELECT t.created_at, t.event_type, t.conf_id, t.conf_shown, t.is_first, t.page_sid, t.conversion_value
FROM tmp_tracking_data t
INNER JOIN confs g ON t.conf_id = g.id
;
SET @id_beg := IF(ROW_COUNT() > 0, LAST_INSERT_ID(), NULL)
, @id_end := IF(ROW_COUNT() > 0, LAST_INSERT_ID() + ROW_COUNT() - 1, NULL)
;
-- make day agregation
INSERT INTO tracking_data_agregated
(conf_id, date, server_id, conf_shown, imp_cnt, conv_cnt, vtc_cnt, conversion_value)
SELECT *
FROM (
   SELECT t.conf_id new_conf_id
   , DATE(t.created_at) new_date
   , @@server_id new_server_id
   , t.conf_shown new_conf_shown
   , COUNT(CASE WHEN t.event_type = 'impression' THEN 1 END) new_imp_cnt
   , COUNT(CASE WHEN t.event_type = 'conversion' THEN 1 END) new_conv_cnt
   , COUNT(CASE WHEN t.event_type = 'vtc' THEN 1 END) new_vtc_cnt
   , SUM(t.conversion_value) new_conversion_value
   FROM trackdb.tracking_data t
   WHERE t.id BETWEEN @id_beg AND @id_end
    AND t.event_type IN ('impression', 'conversion', 'vtc')
   GROUP BY t.conf_id, DATE(t.created_at), t.conf_shown
   ORDER BY new_conf_id, new_date, new_conf_shown
) t
ON DUPLICATE KEY UPDATE imp_cnt = IFNULL(imp_cnt, 0) + IFNULL(t.new_imp_cnt, 0)
, conv_cnt = IFNULL(conv_cnt, 0) + IFNULL(t.new_conv_cnt, 0)
, vtc_cnt = IFNULL(vtc_cnt, 0) + IFNULL(t.new_vtc_cnt, 0)
, conversion_value = IFNULL(conversion_value, 0) + IFNULL(t.new_conversion_value, 0)
;
...
TRUNCATE TABLE tmp_tracking_data
;
- в конце TRUNCATE вместо COMMIT'а, он закоммитит данные и очистит временную таблицу, а если до него дело не дошло, то временная таблица не очистится и данные попробуют загрузиться повторно
- таблицы вот
CREATE TABLE `trackdb`.`tracking_data` (
 `id` bigint unsigned NOT NULL AUTO_INCREMENT,
 `created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
 `event_type` enum('impression','conversion','vtc','abandon','restart') NOT NULL,
 `conf_id` int unsigned DEFAULT NULL,
 `conf_shown` tinyint(1) DEFAULT NULL,
 `is_first` tinyint(1) DEFAULT NULL,
 `page_sid` char(32) DEFAULT NULL,
 `conversion_value` float DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `tracking_data_created_at_index` (`created_at`)
) ENGINE=InnoDB
;
CREATE TABLE `tracking_data_agregated` (
 `conf_id` int unsigned NOT NULL,
 `date` date NOT NULL,
 `server_id` int unsigned NOT NULL,
 `conf_shown` tinyint(1) NOT NULL DEFAULT '1',
 `imp_cnt` int DEFAULT NULL,
 `conv_cnt` int DEFAULT NULL,
 `vtc_cnt` int DEFAULT NULL,
 `conversion_value` float DEFAULT NULL,
 PRIMARY KEY (`conf_id`,`date`,`server_id`,`conf_shown`)
) ENGINE=InnoDB
;
- вот что ИННОДБ СТАТУС говорит:
```
LATEST DETECTED DEADLOCK
------------------------
2020-07-22 16:22:13 0x7fc0fa618700
*** (1) TRANSACTION:
TRANSACTION 1176808, ACTIVE 0 sec fetching rows
mysql tables in use 2, locked 2
LOCK WAIT 6 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 2
MySQL thread id 2480, OS thread handle 140465930659584, query id 176738804 localhost 127.0.0.1 confuser executing
INSERT INTO tracking_data_agregated
(conf_id, date, server_id, conf_shown, imp_cnt, conv_cnt, vtc_cnt, conversion_value)
SELECT *
FROM (
   SELECT t.conf_id new_conf_id
   , DATE(t.created_at) new_date
   , @@server_id new_server_id
   , t.conf_shown new_conf_shown
   , COUNT(CASE WHEN t.event_type = 'impression' THEN 1 END) new_imp_cnt
   , COUNT(CASE WHEN t.event_type = 'conversion' THEN 1 END) new_conv_cnt
   , COUNT(CASE WHEN t.event_type = 'vtc' THEN 1 END) new_vtc_cnt
   , SUM(t.conversion_value) new_conversion_value
   FROM trackdb.tracking_data t
   WHERE t.id BETWEEN @id_beg AND @id_end
    AND t.event_type IN ('impression', 'conversion', 'vtc')
   GROUP BY t.conf_id, DATE(t.created_at), t.conf_shown
   ORDER BY new_conf_i
источник

А

Александр in ru_mysql
d, new_date, new_conf_shown
) t
ON DUPLICATE KEY UPDATE imp_cnt = IFNULL(imp_cnt, 0) + IFNULL(t.new_imp_cnt, 0)
, conv_cnt = IFNULL(conv_cnt, 0) + IFNULL(

*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 355 page no 1816 n bits 80 index PRIMARY of table trackdb.tracking_data trx id 1176808 lock_mode X locks rec but not gap
Record lock, heap no 8 PHYSICAL RECORD: n_fields 10; compact format; info bits 0
0: len 8; hex 000000000004c0dc; asc         ;;
1: len 6; hex 00000011f4e8; asc       ;;
2: len 7; hex 820000017f0110; asc        ;;
3: len 8; hex 99a6ed058c007530; asc       u0;;
4: len 1; hex 04; asc  ;;
5: len 4; hex 00000ecd; asc     ;;
6: SQL NULL;
7: SQL NULL;
8: len 30; hex 6f31446e614d58736b6b4f76374a4342506f6a3869365075483255564365; asc o1DnaMXskkOv7JCBPoj8i6PuH2UVCe; (total 32 bytes);
9: SQL NULL;


*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 355 page no 1816 n bits 80 index PRIMARY of table trackdb.tracking_data trx id 1176808 lock mode S waiting
Record lock, heap no 9 PHYSICAL RECORD: n_fields 10; compact format; info bits 0
0: len 8; hex 000000000004c0dd; asc         ;;
1: len 6; hex 00000011f4e7; asc       ;;
2: len 7; hex 810000015f0121; asc     _ !;;
3: len 8; hex 99a6ed058c0cbdb8; asc         ;;
4: len 1; hex 04; asc  ;;
5: len 4; hex 00000ecd; asc     ;;
6: SQL NULL;
7: SQL NULL;
8: len 30; hex 375f4249677a5865737a4b4b7262334765586a3357446c30525a5f5a5747; asc 7_BIgzXeszKKrb3GeXj3WDl0RZ_ZWG; (total 32 bytes);
9: SQL NULL;


*** (2) TRANSACTION:
TRANSACTION 1176807, ACTIVE 0 sec fetching rows
mysql tables in use 2, locked 2
LOCK WAIT 6 lock struct(s), heap size 1136, 5 row lock(s), undo log entries 2
MySQL thread id 2453, OS thread handle 140465928890112, query id 176738803 localhost 127.0.0.1 confuser executing
INSERT INTO tracking_data_agregated
(conf_id, date, server_id, conf_shown, imp_cnt, conv_cnt, vtc_cnt, conversion_value)
SELECT *
FROM (
   SELECT t.conf_id new_conf_id
   , DATE(t.created_at) new_date
   , @@server_id new_server_id
   , t.conf_shown new_conf_shown
   , COUNT(CASE WHEN t.event_type = 'impression' THEN 1 END) new_imp_cnt
   , COUNT(CASE WHEN t.event_type = 'conversion' THEN 1 END) new_conv_cnt
   , COUNT(CASE WHEN t.event_type = 'vtc' THEN 1 END) new_vtc_cnt
   , SUM(t.conversion_value) new_conversion_value
   FROM trackdb.tracking_data t
   WHERE t.id BETWEEN @id_beg AND @id_end
    AND t.event_type IN ('impression', 'conversion', 'vtc')
   GROUP BY t.conf_id, DATE(t.created_at), t.conf_shown
   ORDER BY new_conf_id, new_date, new_conf_shown
) t
ON DUPLICATE KEY UPDATE imp_cnt = IFNULL(imp_cnt, 0) + IFNULL(t.new_imp_cnt, 0)
, conv_cnt = IFNULL(conv_cnt, 0) + IFNULL(

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 355 page no 1816 n bits 80 index PRIMARY of table trackdb.tracking_data trx id 1176807 lock_mode X locks rec but not gap
Record lock, heap no 7 PHYSICAL RECORD: n_fields 10; compact format; info bits 0
0: len 8; hex 000000000004c0db; asc         ;;
1: len 6; hex 00000011f4e7; asc       ;;
2: len 7; hex 810000015f0110; asc     _  ;;
3: len 8; hex 99a6ed058c0ad188; asc         ;;
4: len 1; hex 04; asc  ;;
5: len 4; hex 00001078; asc    x;;
6: SQL NULL;
7: SQL NULL;
8: len 30; hex 6a396e6741516d644f7936327072693532366b5476376934327a394b3634; asc j9ngAQmdOy62pri526kTv7i42z9K64; (total 32 bytes);
9: SQL NULL;

Record lock, heap no 9 PHYSICAL RECORD: n_fields 10; compact format; info bits 0
0: len 8; hex 000000000004c0dd; asc         ;;
1: len 6; hex 00000011f4e7; asc       ;;
2: len 7; hex 810000015f0121; asc     _ !;;
3: len 8; hex 99a6ed058c0cbdb8; asc         ;;
4: len 1; hex 04; asc  ;;
5: len 4; hex 00000ecd; asc     ;;
6: SQL NULL;
7: SQL NULL;
8: len 30; hex 375f4249677a5865737a4b4b7262334765586a3357446c30525a5f5a5747; asc 7_BIgzXeszKKrb3GeXj3WDl0RZ_ZWG; (total 32 bytes);
9: SQL NULL;


*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 355 page no 1816 n bits 80 index PRIMARY of table trackdb.tracking_data trx id 1176807 lock mode S waiting
Record lock, heap no 8
источник

А

Александр in ru_mysql
PHYSICAL RECORD: n_fields 10; compact format; info bits 0
0: len 8; hex 000000000004c0dc; asc         ;;
1: len 6; hex 00000011f4e8; asc       ;;
2: len 7; hex 820000017f0110; asc        ;;
3: len 8; hex 99a6ed058c007530; asc       u0;;
4: len 1; hex 04; asc  ;;
5: len 4; hex 00000ecd; asc     ;;
6: SQL NULL;
7: SQL NULL;
8: len 30; hex 6f31446e614d58736b6b4f76374a4342506f6a3869365075483255564365; asc o1DnaMXskkOv7JCBPoj8i6PuH2UVCe; (total 32 bytes);
9: SQL NULL;

*** WE ROLL BACK TRANSACTION (2)
```
источник

ls

løst søul in ru_mysql
лучше бы ты это на pastebin закинул
источник

ls

løst søul in ru_mysql
insert into select в транзакции с уровнем изоляции выше read committed блокирует все таблицы в select до окончания транзакции
делать неявный коммит посредством truncate table - плохо
источник

E

Envy in ru_mysql
Может кто-нибудь объяснить, почему не работает такой запрос?
SELECT * FROM reports where session_id IN (@ids);
источник

E

Envy in ru_mysql
@ids в свою очередь хранит в себе числа(id), например (140,141,142)
источник

k

konstahntin in ru_mysql
тебе, как вариант, для решения этой задачи нужна динамика
источник

k

konstahntin in ru_mysql
препаре экзикьют
источник

ls

løst søul in ru_mysql
Envy
Может кто-нибудь объяснить, почему не работает такой запрос?
SELECT * FROM reports where session_id IN (@ids);
потому что не должен
источник

E

Envy in ru_mysql
Да, я разобрался уже
источник

E

Envy in ru_mysql
Делаю вложенным селектом
источник

А

Александр in ru_mysql
løst søul
insert into select в транзакции с уровнем изоляции выше read committed блокирует все таблицы в select до окончания транзакции
делать неявный коммит посредством truncate table - плохо
откуда инфа что блокирует все таблицы в селект? с каким уровнем? ну и это не проблема в общем-то они у меня не изменяются.....
источник

ls

løst søul in ru_mysql
из документации
источник

А

Александр in ru_mysql
Ссылку
источник

А

Александр in ru_mysql
Я так понимаю любое чтение потенциально создаёт снапшот, но ничего не блокирует
источник

A

Alexander in ru_mysql
коллеги, как сбросить репликацию до текущей позиции, делаю reset slave, затем start slave, а он пытается прочитатать старый бинлог и валится соответственно с ошибками
источник

A

Alexander in ru_mysql
сделал через change master, но скорее всего есть более быстрый способ...
источник