mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 14:02:32 +01:00
be2ce2614b
gets deadlocked when dropping w/ log on" Log tables rely on concurrent insert machinery to add data. This means that log tables are always opened and locked by special (artificial) logger threads. Because of this, the thread which tries to drop a log table starts to wait for the table to be unlocked. Which will happen only if the log table is disabled. Alike situation happens if one tries to alter a log table. However in addition to the problem above, alter table calls check_if_locking_is_allowed() routine for the engine. The routine does not allow alter for the log tables. So, alter doesn't start waiting forever for logs to be disabled, but returns with an error. Another problem is that not all engines could be used for the log tables. That's because they need concurrent insert. In this patch we: (1) Explicitly disallow to drop/alter a log table if it is currently used by the logger. (2) Update MyISAM to support log tables (3) Allow to drop log tables/alter log tables if log is disabled At the same time we (4) Disallow to alter log tables to unsupported engine (after this patch CSV and MyISAM are alowed) Recommit with review fixes.
215 lines
9.8 KiB
Text
215 lines
9.8 KiB
Text
use mysql;
|
|
truncate table general_log;
|
|
select * from general_log;
|
|
event_time user_host thread_id server_id command_type argument
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from general_log
|
|
truncate table slow_log;
|
|
select * from slow_log;
|
|
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
|
|
truncate table general_log;
|
|
select * from general_log where argument like '%general_log%';
|
|
event_time user_host thread_id server_id command_type argument
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from general_log where argument like '%general_log%'
|
|
create table join_test (verbose_comment varchar (80), command_type varchar(64));
|
|
insert into join_test values ("User performed a usual SQL query", "Query");
|
|
insert into join_test values ("New DB connection was registered", "Connect");
|
|
insert into join_test values ("Get the table info", "Field List");
|
|
select verbose_comment, user_host, argument
|
|
from mysql.general_log join join_test
|
|
on (mysql.general_log.command_type = join_test.command_type);
|
|
verbose_comment user_host argument
|
|
User performed a usual SQL query USER_HOST select * from general_log where argument like '%general_log%'
|
|
User performed a usual SQL query USER_HOST create table join_test (verbose_comment varchar (80), command_type varchar(64))
|
|
User performed a usual SQL query USER_HOST insert into join_test values ("User performed a usual SQL query", "Query")
|
|
User performed a usual SQL query USER_HOST insert into join_test values ("New DB connection was registered", "Connect")
|
|
User performed a usual SQL query USER_HOST insert into join_test values ("Get the table info", "Field List")
|
|
User performed a usual SQL query USER_HOST select verbose_comment, user_host, argument
|
|
from mysql.general_log join join_test
|
|
on (mysql.general_log.command_type = join_test.command_type)
|
|
drop table join_test;
|
|
flush logs;
|
|
lock tables mysql.general_log WRITE;
|
|
ERROR HY000: You can't write-lock a log table. Only read access is possible.
|
|
lock tables mysql.slow_log WRITE;
|
|
ERROR HY000: You can't write-lock a log table. Only read access is possible.
|
|
lock tables mysql.general_log READ;
|
|
ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead.
|
|
lock tables mysql.slow_log READ;
|
|
ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead.
|
|
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
|
unlock tables;
|
|
lock tables mysql.general_log READ LOCAL;
|
|
flush logs;
|
|
unlock tables;
|
|
select "Mark that we woke up from flush logs in the test"
|
|
as "test passed";
|
|
test passed
|
|
Mark that we woke up from flush logs in the test
|
|
lock tables mysql.general_log READ LOCAL;
|
|
truncate mysql.general_log;
|
|
unlock tables;
|
|
select "Mark that we woke up from TRUNCATE in the test"
|
|
as "test passed";
|
|
test passed
|
|
Mark that we woke up from TRUNCATE in the test
|
|
use test;
|
|
truncate table mysql.general_log;
|
|
set names utf8;
|
|
create table bug16905 (s char(15) character set utf8 default 'пусто');
|
|
insert into bug16905 values ('новое');
|
|
select * from mysql.general_log;
|
|
event_time user_host thread_id server_id command_type argument
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query set names utf8
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query create table bug16905 (s char(15) character set utf8 default 'пусто')
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query insert into bug16905 values ('новое')
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.general_log
|
|
drop table bug16905;
|
|
truncate table mysql.slow_log;
|
|
set session long_query_time=1;
|
|
select sleep(2);
|
|
sleep(2)
|
|
0
|
|
select * from mysql.slow_log;
|
|
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
|
|
TIMESTAMP USER_HOST QUERY_TIME 00:00:00 1 0 test 0 0 1 select sleep(2)
|
|
alter table mysql.general_log engine=myisam;
|
|
ERROR HY000: You can't alter a log table if logging is enabled
|
|
alter table mysql.slow_log engine=myisam;
|
|
ERROR HY000: You can't alter a log table if logging is enabled
|
|
drop table mysql.general_log;
|
|
ERROR HY000: Cannot drop log table if log is enabled
|
|
drop table mysql.slow_log;
|
|
ERROR HY000: Cannot drop log table if log is enabled
|
|
set global general_log='OFF';
|
|
alter table mysql.slow_log engine=myisam;
|
|
ERROR HY000: You can't alter a log table if logging is enabled
|
|
set global slow_query_log='OFF';
|
|
show create table mysql.general_log;
|
|
Table Create Table
|
|
general_log CREATE TABLE `general_log` (
|
|
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
`user_host` mediumtext,
|
|
`thread_id` int(11) DEFAULT NULL,
|
|
`server_id` int(11) DEFAULT NULL,
|
|
`command_type` varchar(64) DEFAULT NULL,
|
|
`argument` mediumtext
|
|
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
|
|
show create table mysql.slow_log;
|
|
Table Create Table
|
|
slow_log CREATE TABLE `slow_log` (
|
|
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
`user_host` mediumtext NOT NULL,
|
|
`query_time` time NOT NULL,
|
|
`lock_time` time NOT NULL,
|
|
`rows_sent` int(11) NOT NULL,
|
|
`rows_examined` int(11) NOT NULL,
|
|
`db` varchar(512) DEFAULT NULL,
|
|
`last_insert_id` int(11) DEFAULT NULL,
|
|
`insert_id` int(11) DEFAULT NULL,
|
|
`server_id` int(11) DEFAULT NULL,
|
|
`sql_text` mediumtext NOT NULL
|
|
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
|
|
alter table mysql.general_log engine=myisam;
|
|
alter table mysql.slow_log engine=myisam;
|
|
Warnings:
|
|
Warning 1264 Out of range value for column 'last_insert_id' at row 0
|
|
Warning 1264 Out of range value for column 'insert_id' at row 0
|
|
show create table mysql.general_log;
|
|
Table Create Table
|
|
general_log CREATE TABLE `general_log` (
|
|
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
`user_host` mediumtext,
|
|
`thread_id` int(11) DEFAULT NULL,
|
|
`server_id` int(11) DEFAULT NULL,
|
|
`command_type` varchar(64) DEFAULT NULL,
|
|
`argument` mediumtext
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
|
|
show create table mysql.slow_log;
|
|
Table Create Table
|
|
slow_log CREATE TABLE `slow_log` (
|
|
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
`user_host` mediumtext NOT NULL,
|
|
`query_time` time NOT NULL,
|
|
`lock_time` time NOT NULL,
|
|
`rows_sent` int(11) NOT NULL,
|
|
`rows_examined` int(11) NOT NULL,
|
|
`db` varchar(512) DEFAULT NULL,
|
|
`last_insert_id` int(11) DEFAULT NULL,
|
|
`insert_id` int(11) DEFAULT NULL,
|
|
`server_id` int(11) DEFAULT NULL,
|
|
`sql_text` mediumtext NOT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log'
|
|
set global general_log='ON';
|
|
set global slow_query_log='ON';
|
|
select * from mysql.general_log;
|
|
event_time user_host thread_id server_id command_type argument
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query set names utf8
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query create table bug16905 (s char(15) character set utf8 default 'пусто')
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query insert into bug16905 values ('новое')
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.general_log
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query drop table bug16905
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query truncate table mysql.slow_log
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query set session long_query_time=1
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select sleep(2)
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.slow_log
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query alter table mysql.general_log engine=myisam
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query alter table mysql.slow_log engine=myisam
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query drop table mysql.general_log
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query drop table mysql.slow_log
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query set global general_log='OFF'
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query set global slow_query_log='ON'
|
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.general_log
|
|
flush logs;
|
|
lock tables mysql.general_log WRITE;
|
|
ERROR HY000: You can't write-lock a log table. Only read access is possible.
|
|
lock tables mysql.slow_log WRITE;
|
|
ERROR HY000: You can't write-lock a log table. Only read access is possible.
|
|
lock tables mysql.general_log READ;
|
|
ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead.
|
|
lock tables mysql.slow_log READ;
|
|
ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead.
|
|
lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
|
|
unlock tables;
|
|
set global general_log='OFF';
|
|
set global slow_query_log='OFF';
|
|
alter table mysql.slow_log engine=ndb;
|
|
ERROR HY000: One can use only CSV and MyISAM engines for the log tables
|
|
alter table mysql.slow_log engine=innodb;
|
|
ERROR HY000: One can use only CSV and MyISAM engines for the log tables
|
|
alter table mysql.slow_log engine=archive;
|
|
ERROR HY000: One can use only CSV and MyISAM engines for the log tables
|
|
alter table mysql.slow_log engine=blackhole;
|
|
ERROR HY000: One can use only CSV and MyISAM engines for the log tables
|
|
drop table mysql.slow_log;
|
|
drop table mysql.general_log;
|
|
drop table mysql.general_log;
|
|
ERROR 42S02: Unknown table 'general_log'
|
|
drop table mysql.slow_log;
|
|
ERROR 42S02: Unknown table 'slow_log'
|
|
use mysql;
|
|
CREATE TABLE `general_log` (
|
|
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
ON UPDATE CURRENT_TIMESTAMP,
|
|
`user_host` mediumtext,
|
|
`thread_id` int(11) DEFAULT NULL,
|
|
`server_id` int(11) DEFAULT NULL,
|
|
`command_type` varchar(64) DEFAULT NULL,
|
|
`argument` mediumtext
|
|
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
|
|
CREATE TABLE `slow_log` (
|
|
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
ON UPDATE CURRENT_TIMESTAMP,
|
|
`user_host` mediumtext NOT NULL,
|
|
`query_time` time NOT NULL,
|
|
`lock_time` time NOT NULL,
|
|
`rows_sent` int(11) NOT NULL,
|
|
`rows_examined` int(11) NOT NULL,
|
|
`db` varchar(512) DEFAULT NULL,
|
|
`last_insert_id` int(11) DEFAULT NULL,
|
|
`insert_id` int(11) DEFAULT NULL,
|
|
`server_id` int(11) DEFAULT NULL,
|
|
`sql_text` mediumtext NOT NULL
|
|
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
|
|
set global general_log='ON';
|
|
set global slow_query_log='ON';
|
|
use test;
|