J'ai lu le Diagnostiquer des serrures MySQL Innodb Article. Karl E. Jørgensen écrit en 2008, donc je suis d'être en vigueur.
Je voudrais fournir un extrait du code SHOW ENGINE INNODB STATUS
:
---TRANSACTION 20532F16, ACTIVE 386 sec starting index read
mysql tables in use 6, locked 6
LOCK WAIT 2 lock struct(s), heap size 1248, 1 row lock(s)
MySQL thread id 96238, query id 81681916 192.168.6.31 thanhnt updating
DELETE FROM `v3_zone_date`
WHERE `dt` = NAME_CONST('_currDate',_latin1'2012-03-02' COLLATE 'latin1_swedish_ci')
------- TRX HAS BEEN WAITING 8 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 482988 page no 6 n bits 360 index `GEN_CLUST_INDEX` of table `reportingdb`.`v3_zone_date` /* Partition `pcurrent_201232` */ trx id 20532F16 lock_mode X waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 13; compact format; info bits 0
0: len 6; hex 000237440e77; asc 7D w;;
1: len 6; hex 0000204f2acb; asc O* ;;
2: len 7; hex e6000480120110; asc ;;
3: len 3; hex 8f5340; asc S@;;
4: len 2; hex 83d4; asc ;;
5: len 3; hex 814f42; asc OB;;
6: len 3; hex 000000; asc ;;
7: len 3; hex 000000; asc ;;
8: len 3; hex 800000; asc ;;
9: len 3; hex 000001; asc ;;
10: len 3; hex 000000; asc ;;
11: len 3; hex 8fb862; asc b;;
12: len 2; hex 0000; asc ;;
------------------
---TRANSACTION 20532EE8, ACTIVE 437 sec fetching rows, thread declared inside InnoDB 236
mysql tables in use 22, locked 22
24944 lock struct(s), heap size 3586488, 11457529 row lock(s)
MySQL thread id 97447, query id 81504647 event_scheduler Copying to tmp table
La requête est coupée à part donc je l'obtiens à partir de la sortie SHOW FULL PROCESSLIST
:
*************************** 18. row ***************************
Id: 97447
User: thanhnt
Host: 192.168.6.31
db: reportingdb
Command: Connect
Time: 423
State: Copying to tmp table
Info: UPDATE `selfserving_banner_zone` A,( SELECT B.`bannerid`,C.`zoneid`,ROUND(SUM(C.`realclick`)*100/SUM(C.`totalview`),5) CTR
FROM `ox_campaigns` A
INNER JOIN `ox_banners` B ON B.`campaignid`= A.`campaignid`
INNER JOIN `v3_zone_date` C ON C.`campaignid` = B.`campaignid` AND B.`bannerid` = C.bannerid
WHERE A.`revenue_type` = 5 AND C.`dt` BETWEEN DATE_SUB( NAME_CONST('_currdate',_latin1'2012-03-02' COLLATE 'latin1_swedish_ci'),INTERVAL 1 DAY) AND NAME_CONST('_currdate',_latin1'2012-03-02' COLLATE 'latin1_swedish_ci') AND C.totalview >0 AND A.isExpired NOT IN (1,2)
AND A.deleted = 0 AND B.deleted = 0 AND CURRENT_DATE BETWEEN B.`activate` AND B.`expire` AND A.status = 1 AND B.status = 1 AND C.`realclick` > 0
GROUP BY B.`bannerid`,C.`zoneid`) B
SET A.`ctr` = B.CTR WHERE A.`bannerid` = B.bannerid AND A.`zoneid` = B.zoneid
Selon l'article ci-dessus, la transaction 20532f16 attend un verrou. Mais comme vous pouvez le constater, il y a quelques hex-shopés ici. Lequel peut être utilisé pour déterminer la transaction qui détient la serrure? De plus, je vois que le numéro de transaction est déjà en hexadécimal (ex: 20532e8)
Ceci L'article n'explique pas assez de détails sur l'hex.
PS: J'ai essayé tout ce qui précède hexadé-largué (à la fois en hexagonale et à la décimale) mais pas de chance.
Répondre à Rolandomysqldba:
J'ai écrit un post récent sur la manière dont 44 Ko est nécessaire pour verrouiller 100 000 lignes sur une table
11457529 Verrou (s) de rangée (s) prenez simplement la fin de 5 Mo.
Si votre pool Buffer InnoDb n'est pas assez grand, vous ne pouvez pas avoir assez de ressources pour définir autant de serrures de rangée que nécessaire. Par conséquent, je recommanderais d'augmenter votre innodb_buffer_pool_size .
Voici mon piscine tampon et ma mémoire:
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 21978152960; in additional pool allocated 0
Dictionary memory allocated 2636907
Buffer pool size 1310712
Free buffers 704307
Database pages 589697
Old database pages 217517
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 361757, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 365924, created 666845, written 1151187
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s
LRU len: 589697, unzip_LRU len: 0
I/O sum[32]:cur[0], unzip sum[0]:cur[0]
Comme vous pouvez le constater, j'ai beaucoup de pages gratuites (704307). As-tu d'autres idées?
PS: innotop
montre le résultat vide sur les serrures InnoDB:
_________________________________ InnoDB Locks __________________________________
CXN ID Type Waiting Wait Active Mode DB Table Index Ins Intent Special
Mise à jour Mar 6 00:16:41 ICT 2012
PS: J'ai essayé tout ce qui précède hexadé-largué (à la fois en hexagonale et à la décimale) mais pas de chance.
Il n'y a pas de transaction avec l'hexagone ci-dessus dans mon SHOW ENGINE INNODB STATUS;
:
$ egrep -i '8f5340|814f42|8fb862' innodb.status_2012-03-02
3: len 3; hex 8f5340; asc S@;;
5: len 3; hex 814f42; asc OB;;
11: len 3; hex 8fb862; asc b;;
C'est vraiment facile maintenant. N'utilisez pas SHOW ENGINE INNODB STATUS
, utilisez informations_schema.innodb_locks. Voici un exemple que j'ai écrit un article de blog sur les clés étrangères:
http://www.mysqlperformanceblog.com/2010/09/20/instrumentalation-and-the-cost-of-forign-keys/
Pour ceux qui utilisent mysql> = 8,0, le information_schema.innodb_locks
est maintenant déplacé vers performance_schema.data_locks
.
Référez ce blog Post: https://dev.mysql.com/doc/refman/8.0/fr/innodb-locks-table.html