debugsqlMinor
LOAD DATA (400k rows) INFILE takes about 7 minutes, cannot kill the "logging slow query" process?
Viewed 0 times
cannotrowstakeskilltheloggingprocess400kqueryslow
Problem
MySQL version: 5.5.13
The query that I'm using:
Normally it takes 3s to complete. But sometime, the insert query takes about 3-7 minutes to run:
and my database is locked completely (very slow when connecting). The process Id 97 continues running after I try to kill it. The init script shows the [ FAILED ] flag when trying to restart MySQL, so I must use
I will try to disable the
There are some
and a
There isn't anything related to the above table -
The query that I'm using:
SET AUTOCOMMIT=0;
LOAD DATA INFILE '/data10/select_into.outfile/v3_zone_date.out' INTO TABLE v3_zone_date FIELDS TERMINATED BY ',';
COMMIT;Normally it takes 3s to complete. But sometime, the insert query takes about 3-7 minutes to run:
Id: 97
User: tom
Host: 192.168.6.31:27059
db: test
Command: Query
Time: 155
State: logging slow query
Info: COMMITand my database is locked completely (very slow when connecting). The process Id 97 continues running after I try to kill it. The init script shows the [ FAILED ] flag when trying to restart MySQL, so I must use
kill -9 and start again.I will try to disable the
unique_checks follow this guide. But I'm trying to find out why it's locked.There are some
Waiting for table metadata lock states on temporary tables:Id: 180098
User: jerry
Host: 192.168.6.31:54909
db: test
Command: Query
Time: 142
State: Waiting for table metadata lock
Info: DROP TABLE IF EXISTS norep_locationtmpand a
Waiting for table level lock state:Id: 180233
User: bob
Host: 192.168.6.31:43537
db: test
Command: Query
Time: 65
State: Waiting for table level lock
Info: SELECT COUNT(DISTINCT A.`campaignid`) INTO _c
FROM `ox_campaigns` A
INNER JOIN `selfserving_users` B ON B.`user_id` = A.`uid`
INNER JOIN `v3_cam_date` C ON C.`campaignid` = A.`campaignid`
WHERE A.`revenue_type` = 5 AND A.`deleted` = 0 AND A.`expire` = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY)
AND A.`isExpired` = 0 AND IF( NAME_CONST('_permitid',3) = -1, 1=1, IF( NAME_CONST('_permitid',3) = 0, A.`uid` IN (SELECT C.`user_id` FROM `selfserving_users` C WHERE C.`groupid` = NAME_CONST('_groupid',12) ) ,A.`uid` = NAME_CONST('userid',388)))There isn't anything related to the above table -
v3_zone_date and no deadlock detected in SHOW ENGINE INNODB STATUS. Where should I take a look at first to troubleshoot this case? Let me know if youSolution
The query under process ID 180233 looks like it is in distress.
Here is the query itself
The scary part about the query is the self-reference
You have
Sometimes, the MySQL Query Optimizer will play a bait-and-switch, smoke-and-mirrors games with data, especially with a self reference, in order to formulate the best EXPLAIN plan possible. While mysql is very capable of completing sub-SELECTs, it can be still be expensive.
However, this is just a symptom that manifested because of Process ID 97. What is really the issue here?
LOAD DATA INFILE against an InnoDB table could make mysqld a little punch drunk. I don't believe (or at least I don't exercise full confidence) you can encapsulate it as a normal transaction although this was addressed back in MySQL 5.0.
Just picture it:
There may be a way to throttle the LOAD DATA INFILE process on an InnoDB table. I cannot give you a solid answer on this one, but try this link from Baron Schwartz.
UPDATE 2012-02-22 12:00 EST
There is open bug report in MySQL 5.5.7 called Deadlock when DDL under LOCK TABLES WRITE, READ + PREPARE. At the bottom of the report, a person complained about a block problem cause by the explicit
Launching a
UPDATE 2012-02-22 12:42 EDT
In your question you stated the following about your .NET process
All of these events are running within the same DB Session. This is also happening within one DB Connection. Thus, this is not a deadlock in the traditional sense. It is just a case of blocking your COMMIT within a given DB Connection/Session because the tables were locked within the same DB Connection/Session.
UPDATE 2012-02-23 19:00 EDT
I would change the sequence to be this:
Please remember, a
Here is the query itself
SELECT COUNT(DISTINCT A.`campaignid`) INTO _c
FROM `ox_campaigns` A
INNER JOIN `selfserving_users` B ON B.`user_id` = A.`uid`
INNER JOIN `v3_cam_date` C ON C.`campaignid` = A.`campaignid`
WHERE A.`revenue_type` = 5 AND A.`deleted` = 0
AND A.`expire` = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY)
AND A.`isExpired` = 0
AND IF( NAME_CONST('_permitid',3) = -1, 1=1,
IF( NAME_CONST('_permitid',3) = 0, A.`uid` IN
(SELECT C.`user_id` FROM `selfserving_users` C
WHERE C.`groupid` = NAME_CONST('_groupid',12) ) ,
A.`uid` = NAME_CONST('userid',388)));The scary part about the query is the self-reference
You have
selfserving_users acting in a self serving manner against itself.Sometimes, the MySQL Query Optimizer will play a bait-and-switch, smoke-and-mirrors games with data, especially with a self reference, in order to formulate the best EXPLAIN plan possible. While mysql is very capable of completing sub-SELECTs, it can be still be expensive.
However, this is just a symptom that manifested because of Process ID 97. What is really the issue here?
LOAD DATA INFILE against an InnoDB table could make mysqld a little punch drunk. I don't believe (or at least I don't exercise full confidence) you can encapsulate it as a normal transaction although this was addressed back in MySQL 5.0.
Just picture it:
- You are hammering the InnoDB Buffer
- Some memory swapping may be going on
- Possible full table locking issues that are affecting data pages outside the
v3_zone_datetable (such was with theselfserving_userstable)
There may be a way to throttle the LOAD DATA INFILE process on an InnoDB table. I cannot give you a solid answer on this one, but try this link from Baron Schwartz.
UPDATE 2012-02-22 12:00 EST
There is open bug report in MySQL 5.5.7 called Deadlock when DDL under LOCK TABLES WRITE, READ + PREPARE. At the bottom of the report, a person complained about a block problem cause by the explicit
LOCK TABLES.Launching a
COMMIT on locked rows in a table would hang because of trying to unraveling MVCC data assocaited with the locked rows. Based on the InnoDB Status you have shown, there would exist 6933 row locks on the table you are importing. I know that in Oracle, when introducing new rows to a table, MVCC is still generated because the previous version of the newly inserted row is a nonexistent row. The same must be occurring for InnoDB.UPDATE 2012-02-22 12:42 EDT
In your question you stated the following about your .NET process
- LOCK TABLES;
- SET autocommit=0;
- SET unique_checks=0;
- SET foreign_key_checks=0;
- LOAD DATA;
- COMMIT;
- UNLOCK TABLES;
- SET autocommit=1;
- SET unique_checks=1;
All of these events are running within the same DB Session. This is also happening within one DB Connection. Thus, this is not a deadlock in the traditional sense. It is just a case of blocking your COMMIT within a given DB Connection/Session because the tables were locked within the same DB Connection/Session.
UPDATE 2012-02-23 19:00 EDT
I would change the sequence to be this:
- SET autocommit=0;
- SET unique_checks=0;
- SET foreign_key_checks=0;
- LOCK TABLES;
- LOAD DATA;
- UNLOCK TABLES;
- COMMIT;
- SET autocommit=1;
- SET unique_checks=1;
- SET foreign_key_checks=1;
Please remember, a
COMMIT cannot proceed if you have the tables locked in serial fashion. Therefore, UNLOCK TABLES must precede COMMIT.Code Snippets
SELECT COUNT(DISTINCT A.`campaignid`) INTO _c
FROM `ox_campaigns` A
INNER JOIN `selfserving_users` B ON B.`user_id` = A.`uid`
INNER JOIN `v3_cam_date` C ON C.`campaignid` = A.`campaignid`
WHERE A.`revenue_type` = 5 AND A.`deleted` = 0
AND A.`expire` = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY)
AND A.`isExpired` = 0
AND IF( NAME_CONST('_permitid',3) = -1, 1=1,
IF( NAME_CONST('_permitid',3) = 0, A.`uid` IN
(SELECT C.`user_id` FROM `selfserving_users` C
WHERE C.`groupid` = NAME_CONST('_groupid',12) ) ,
A.`uid` = NAME_CONST('userid',388)));Context
StackExchange Database Administrators Q#12304, answer score: 2
Revisions (0)
No revisions yet.