Новые возможности отладки mysql 5.7 на практике
TRANSCRIPT
Новые возможности отладки MySQL 5.7на практикеСвета Смирнова
Техническая поддержка MySQL20 июня 2015 года
Общие улучшенияУлучшения в оптимизаторе запросовУлучшения в InnoDBДругие улучшения
Performance SchemaДиагностика блокировок: MDL, table, indexДиагностика памятиДиагностика хранимых процедурДиагностика prepared statementsРепликация: новые таблицы, диагностика слейва, GTIDПеременные в P_SУлучшения настройки, использования ресурсов P_S
2 www.percona.com
Расширения EXPLAIN всегда включены
• Теперь не нужно писать
• EXPLAIN EXTENDED
• EXPLAIN PARTITIONS
• SHOW WARNINGS всё ещё требуется
5 www.percona.com
Преобразование: EXPLAIN EXTENDED
mysql> explain select count(*) from employees join titles using(emp_no)-> where title=’Senior Engineer’\G
*************************** 1. row ***************************...
mysql> show warnings\G*************************** 1. row ***************************Level: NoteCode: 1003Message: /* select#1 */ select count(0) AS ‘count(*)‘ from ‘employees‘.‘employees‘join ‘employees‘.‘titles‘where ((‘employees‘.‘employees‘.‘emp_no‘ = ‘employees‘.‘titles‘.‘emp_no‘)and (‘employees‘.‘titles‘.‘title‘ = ’Senior Engineer’))1 row in set (0.00 sec)
6 www.percona.com
Разбиения: EXPLAIN PARTITIONScreate table employees_part like employees;alter table employees_part drop primary key, add primary key(emp_no, hire_date);alter table employees_part partition by range(year(hire_date))(partition p0 values less than(1990), partition p1 values less than(2000),partition p2 values less than maxvalue);
mysql> explain select count(*) from employees_part where hire_date > ’1991-01-01’\G*************************** 1. row ***************************
id: 1select_type: SIMPLE
table: employees_partpartitions: p1,p2
type: indexpossible_keys: NULL
key: PRIMARYkey_len: 7
ref: NULLrows: 1
filtered: 100.00Extra: Using where; Using index1 row in set, 1 warning (0.00 sec)
7 www.percona.com
EXPLAIN FOR CONNECTION
• Можно запускать EXPLAIN длясоединения, котоое в данный моментвыполняет запрос
• Не нужно дожидаться окончаниявыполнения
• ПоддерживаетSELECT/INSERT/UPDATE/DELETE
• В случае, если соединение выполняетнеподдерживаемую команду, будетвозвращена ошибка
8 www.percona.com
EXPLAIN FOR CONNECTIONmysql> show processlist\G*************************** 1. row ***************************
Id: 7...Info: select count(*) from employees where hire_date > ’1995-01-01’
mysql> explain for connection 7\G*************************** 1. row ***************************
id: 1select_type: SIMPLE
table: employeespartitions: NULL
type: ALLpossible_keys: NULL
key: NULLkey_len: NULL
ref: NULLrows: 299335
filtered: 100.00Extra: Using where
1 row in set (0.00 sec)
9 www.percona.com
EXPLAIN FORMAT=JSON: что нового?
• Total query cost
• The cost per table
• The amount of data processed
10 www.percona.com
EXPLAIN FORMAT=JSON: пример
• MySQL Bug #77340
mysql> SELECT COUNT(DISTINCT ‘t1‘.‘id‘) FROM ‘t1‘ INNER JOIN ‘t2‘-> ON ‘t2‘.‘id‘ = ‘t1‘.‘f1‘ LEFT OUTER JOIN ‘t3‘-> ON ‘t3‘.‘f1‘ = ‘t1‘.‘id‘ AND t3.f3 IS NULL AND ‘t3‘.‘f4‘ = ’Entry’-> LEFT OUTER JOIN ‘t3‘ ‘thumbnails_t3‘-> ON ‘thumbnails_t3‘.‘f3‘ = ‘t3‘.‘id‘-> WHERE ‘t1‘.‘f2‘ IS NULL AND ‘t1‘.‘f3‘ = 85260-> AND (t1.f3 = 85260 AND t2.f2 IS NULL);
+–––––––––––––––––––––––––––+| COUNT(DISTINCT ‘t1‘.‘id‘) |+–––––––––––––––––––––––––––+| 512 |+–––––––––––––––––––––––––––+1 row in set (13.78 sec)
11 www.percona.com
EXPLAIN FORMAT=JSON: пример
• MySQL Bug #77340
mysql> SELECT COUNT(DISTINCT ‘t1‘.‘id‘) FROM ‘t1‘ INNER JOIN ‘t2‘-> ON ‘t2‘.‘id‘ = ‘t1‘.‘f1‘ LEFT OUTER JOIN ‘t3‘ force index(f1)-> ON ‘t3‘.‘f1‘ = ‘t1‘.‘id‘ AND t3.f3 IS NULL AND ‘t3‘.‘f4‘ = ’Entry’-> LEFT OUTER JOIN ‘t3‘ ‘thumbnails_t3‘-> ON ‘thumbnails_t3‘.‘f3‘ = ‘t3‘.‘id‘-> WHERE ‘t1‘.‘f2‘ IS NULL AND ‘t1‘.‘f3‘ = 85260-> AND (t1.f3 = 85260 AND t2.f2 IS NULL);
+–––––––––––––––––––––––––––+| COUNT(DISTINCT ‘t1‘.‘id‘) |+–––––––––––––––––––––––––––+| 512 |+–––––––––––––––––––––––––––+1 row in set (0.10 sec)
12 www.percona.com
EXPLAIN FORMAT=JSON: пример
• MySQL Bug #77340
• 13.78 vs 0.10 sec
• Почему такая разница?
13 www.percona.com
Обычный EXPLAIN: медленный запросmysql> explain SELECT COUNT(DISTINCT ‘t1‘.‘id‘) FROM ‘t1‘ INNER JOIN ‘t2‘
-> ON ‘t2‘.‘id‘ = ‘t1‘.‘f1‘ LEFT OUTER JOIN ‘t3‘-> ON ‘t3‘.‘f1‘ = ‘t1‘.‘id‘ AND t3.f3 IS NULL AND ‘t3‘.‘f4‘ = ’Entry’-> LEFT OUTER JOIN ‘t3‘ ‘thumbnails_t3‘ ON ‘thumbnails_t3‘.‘f3‘ = ‘t3‘.‘id‘-> WHERE ‘t1‘.‘f2‘ IS NULL AND ‘t1‘.‘f3‘ = 85260AND (t1.f3 = 85260 AND t2.f2 IS NULL)\G...
*************************** 3. row ***************************id: 1
select_type: SIMPLEtable: t3
partitions: NULLtype: ref
possible_keys: f3,f1key: f3
key_len: 9ref: const
rows: 3filtered: 100.00
Extra: Using where
14 www.percona.com
Обычный EXPLAIN: быстрый запросmysql> explain SELECT COUNT(DISTINCT ‘t1‘.‘id‘) FROM ‘t1‘ INNER JOIN ‘t2‘-> ON ‘t2‘.‘id‘ = ‘t1‘.‘f1‘ LEFT OUTER JOIN ‘t3‘ force index(f1)-> ON ‘t3‘.‘f1‘ = ‘t1‘.‘id‘ AND t3.f3 IS NULL AND ‘t3‘.‘f4‘ = ’Entry’-> LEFT OUTER JOIN ‘t3‘ ‘thumbnails_t3‘ ON ‘thumbnails_t3‘.‘f3‘ = ‘t3‘.‘id‘-> WHERE ‘t1‘.‘f2‘ IS NULL AND ‘t1‘.‘f3‘ = 85260AND (t1.f3 = 85260 AND t2.f2 IS NULL)\G...*************************** 3. row ***************************
id: 1select_type: SIMPLE
table: t3partitions: NULL
type: refpossible_keys: f1
key: f1key_len: 1032
ref: test.t1.id,constrows: 21
filtered: 100.00Extra: Using where
15 www.percona.com
EXPLAIN FORMAT=JSON
• Медленный запрос"table_name": "t3"access_type": "ref"possible_keys": ["f3"f1"],"key": "f3" ,"used_key_parts": ["f3"],"key_length": "9" ,"ref": ["const"],
• Быстрый запрос"table_name": "t3"access_type": "ref"possible_keys": ["f1"],"key": "f1" ,"used_key_parts": ["f1"f4"],"key_length": "1032" ,"ref": ["test.t1.id"const"],
16 www.percona.com
EXPLAIN FORMAT=JSON
• Медленный запрос"rows_examined_per_scan": 3,"rows_produced_per_join": 18,"filtered": "100.00"cost_info":
"read_cost": "18.65" ,"eval_cost": "3.73" ,"prefix_cost": "666.66" ,"data_read_per_join": "19K"
,"used_columns": ["id"f1"f3"f4"],
• Быстрый запрос"rows_examined_per_scan": 21,"rows_produced_per_join": 108,"filtered": "100.00"cost_info":
"read_cost": "108.01" ,"eval_cost": "21.60" ,"prefix_cost": "773.89" ,"data_read_per_join": "110K"
,"used_columns": ["id"f1"f3"f4"],
17 www.percona.com
UPDATE_TIME для InnoDB
• INFORMATION_SCHEMA.TABLES
• SHOW TABLE STATUS
• Теперь мы можем пользоватьсязапросами вида:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMAWHERE UPDATE_TIME > DATE_OF_LAST_BACKUP
19 www.percona.com
До версии 5.7
mysql> show table status like ’employees’\G*************************** 1. row ***************************Name: employeesEngine: InnoDB...Create_time: 2015-06-15 04:25:01Update_time: NULL...
mysql> SELECT UPDATE_TIME FROM INFORMATION_SCHEMA.TABLES-> WHERE TABLE_NAME = ’employees’;
+–––––––––––––+| UPDATE_TIME |+–––––––––––––+| NULL |+–––––––––––––+1 row in set (0.00 sec)
20 www.percona.com
В версии 5.7
mysql> show table status like ’employees’\G*************************** 1. row ***************************Name: employeesEngine: InnoDB...Create_time: 2015-06-15 01:39:32Update_time: 2015-06-15 01:40:21...
mysql> SELECT UPDATE_TIME FROM INFORMATION_SCHEMA.TABLES-> WHERE TABLE_NAME = ’employees’;
+–––––––––––––––––––––+| UPDATE_TIME |+–––––––––––––––––––––+| 2015-06-15 01:40:21 |+–––––––––––––––––––––+1 row in set (0.00 sec)
21 www.percona.com
InnoDB Table и Tablespace Monitor
• Замена была предложена ещё в 5.6• В версии 5.7 псевдо-таблиц не стало• Таблицы из INFORMATION_SCHEMA
• INNODB_SYS_*
• TABLES, INDEXES, COLUMNS, FIELDS, FOREIGN, FOREIGN_COLS,TABLESTATS, DATAFILES, TABESPACES
• Нелинейная конвертация• Проще управлять потоком информации
22 www.percona.com
SHOW SLAVE STATUS
• Теперь неблокирующий• Ранее команда STOP SLAVEприводила к "зависанию"SHOWSLAVE STATUS
• Как следствие было много баговтипа "Deadlock between SHOWSLAVE STATUS and ..."
• Работа не зависит от того, чтопроисходит внутри слэйва
24 www.percona.com
Stacked diagnostic area
• GET STACKED DIAGNOSTICS• Используется
• При вызове хранимых процедур• Внутри HANDLER• При вызове RESIGNAL
• Доступна только внутри HANDLER вхранимых процедурах
25 www.percona.com
Stacked diagnostic area: примерmysql> CREATE TABLE t1(id INT NOT NULL) ENGINE=InnoDB;Query OK, 0 rows affected (0.18 sec)
mysql> SET @@sql_mode=’STRICT_TRANS_TABLES’;Query OK, 0 rows affected (0.00 sec)
mysql> \d |mysql> CREATE PROCEDURE da_test()-> BEGIN-> DECLARE CONTINUE HANDLER FOR 1364-> BEGIN-> INSERT IGNORE INTO t1 VALUES(’Some string’); – Конвертация!-> GET STACKED DIAGNOSTICS CONDITION 1 @stacked_state = RETURNED_SQLSTATE;-> GET STACKED DIAGNOSTICS CONDITION 1 @stacked_msg = MESSAGE_TEXT;-> END;-> INSERT INTO t1 VALUES(); – STRICT SQL Mode не даст этого сделать-> END |Query OK, 0 rows affected (0.00 sec)
mysql> \d ;
26 www.percona.com
Stacked diagnostic area: пример
mysql> SET @stacked_state = NULL, @stacked_msg = NULL;Query OK, 0 rows affected (0.00 sec)
mysql> CALL da_test();Query OK, 1 row affected, 1 warning (0.04 sec)
mysql> SHOW WARNINGS;+–––––––––+––––––+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––+| Level | Code | Message |+–––––––––+––––––+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––+| Warning | 1366 | Incorrect integer value: ’Some string’ for column ’id’ at row 1 |+–––––––––+––––––+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––+1 row in set (0.00 sec)
• В версии 5.6 мы ничего не узнаем опервой ошибке
27 www.percona.com
Stacked diagnostic area: примерmysql> SET @stacked_state = NULL, @stacked_msg = NULL;Query OK, 0 rows affected (0.00 sec)
mysql> CALL da_test();Query OK, 1 row affected, 1 warning (0.04 sec)
mysql> SHOW WARNINGS;+–––––––––+––––––+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––+| Level | Code | Message |+–––––––––+––––––+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––+| Warning | 1366 | Incorrect integer value: ’Some string’ for column ’id’ at row 1 |+–––––––––+––––––+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––+1 row in set (0.00 sec)
mysql> SELECT @stacked_state, @stacked_msg;+––––––––––––––––+–––––––––––––––––––––––––––––––––––––––––+| @stacked_state | @stacked_msg |+––––––––––––––––+–––––––––––––––––––––––––––––––––––––––––+| HY000 | Field ’id’ doesn’t have a default value |+––––––––––––––––+–––––––––––––––––––––––––––––––––––––––––+1 row in set (0.00 sec)
27 www.percona.com
Нововведения журналирования• log_error_verbosity - выбирайте, чтохотите видеть в логе: ERRORS,WARNINGS, NOTES
• log_syslog* - писать ли в системный лог,также доступны настройки.
• log_timestamps - какую timezoneиспользовать для записи в логи
• log_throttle_queries_not_using_indexes- ограничивает количество запросов, неиспользующих индексы в Slow QueryLog
28 www.percona.com
MDL
• Таблица METADATA_LOCKS
• Что ждёт блокировку
• Что держит блокировку
• Не только таблицы:GLOBAL, SCHEMA, TABLE, FUNCTION, PROCEDURE, EVENT, COMMIT, USER LEVEL LOCK,TABLESPACE
31 www.percona.com
METADATA_LOCKS: пример
mysql> select processlist_id, object_type, lock_type, lock_status, source-> from metadata_locks join threads on (owner_thread_id=thread_id)-> where object_schema=’employees’ and object_name=’titles’\G
*************************** 1. row ***************************processlist_id: 4
object_type: TABLElock_type: EXCLUSIVE
lock_status: PENDING – ждётsource: mdl.cc:3263
*************************** 2. row ***************************processlist_id: 5
object_type: TABLElock_type: SHARED_READ
lock_status: GRANTED – держитsource: sql_parse.cc:5707
32 www.percona.com
Табличные блокировки
• Таблица TABLE_HANDLES
• Не только блокировки, но иинформация об открытых таблицах
• FLUSH TABLES удаляет данные изтаблицы
33 www.percona.com
Табличные блокировки: пример
mysql1> select count(*) from employees where first_name like ’Svet%’;
• Пока здесь ждём, в параллельномклиенте:mysql2> select * from table_handles\G*************************** 1. row ***************************
OBJECT_TYPE: TABLEOBJECT_SCHEMA: employees
OBJECT_NAME: employeesOBJECT_INSTANCE_BEGIN: 140544885988272
OWNER_THREAD_ID: 23OWNER_EVENT_ID: 818320INTERNAL_LOCK: NULLEXTERNAL_LOCK: READ EXTERNAL – Табличная блокировка!
1 row in set (0.00 sec)
34 www.percona.com
Табличные блокировки: пример
mysql1> select count(*), sleep(10) from employees where emp_no=10001;
• В параллельном клиенте:
mysql2> select * from table_handles\G*************************** 1. row ***************************
OBJECT_TYPE: TABLEOBJECT_SCHEMA: employees
OBJECT_NAME: employeesOBJECT_INSTANCE_BEGIN: 140544885988272
OWNER_THREAD_ID: 23OWNER_EVENT_ID: 1011419INTERNAL_LOCK: NULLEXTERNAL_LOCK: NULL – Всё нормально, выборка по индексу
1 row in set (0.00 sec)
35 www.percona.com
Почему это моё любимое улучшение?
• До версии 5.7 понять куда утекаетпамять из MySQL сервера былоневозможно
• Выделенные буферы?• Временные таблицы?• Внутренние структуры, никак неконтролируемые пользователем?
• Утечки нет, просто система непоказывает память как свободную?
37 www.percona.com
Диагностика памяти до версии 5.7
• free
• top
• vmstat
• Косвенные данные
• Узнать на что конкретно памятьвыделена было нельзя
38 www.percona.com
Диагностика памяти до версии 5.7
• free$freetotal used free shared buffers cachedMem: 16149184 6223916 9925268 317536 1048 3655160-/+ buffers/cache: 2567708 13581476Swap: 2110460 0 2110460
• top• vmstat• Косвенные данные
38 www.percona.com
Диагностика памяти до версии 5.7
• free• top
$topTasks: 295 total, 3 running, 292 sleeping, 0 stopped, 0 zombie%Cpu(s): 3.0 us, 0.8 sy, 0.1 ni, 95.4 id, 0.8 wa, 0.0 hi, 0.0 si, 0.0 stKiB Mem: 16149184 total, 6231688 used, 9917496 free, 1048 buffersKiB Swap: 2110460 total, 0 used, 2110460 free. 3670752 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND1914 mysql 20 0 670m 95m 1296 S 0.7 1.2 2:42.14 mysqld
• vmstat• Косвенные данные
38 www.percona.com
Диагностика памяти до версии 5.7
• free• top• vmstat
$vmstat -t 5 3procs –––––––––––memory––––––––––– –––swap–– –––––io–––– –system–– ––––––cpu...r b swpd free buff cache si so bi bo in cs us sy id wa...2 0 0 9923160 1048 3662724 0 0 168 86 167 674 3 1 87...0 0 0 9923252 1048 3662904 0 0 30 122 1168 5264 3 1 96...0 0 0 9922864 1048 3663120 0 0 25 128 1191 5342 2 1 96...
• Косвенные данные
38 www.percona.com
Диагностика памяти до версии 5.7
• free• top• vmstat• Косвенные данные
• Размер буферов• Количество временных таблиц• Количество параллельныхсоединений
38 www.percona.com
Диагностика памяти в версии 5.7mysql> select thread_id tid, user, current_allocated ca, total_allocated
-> from sys.memory_by_thread_by_current_bytes;+–––––+–––––––––––––––––––––––––+–––––––––––––+–––––––––––––––––+| tid | user | ca | total_allocated |+–––––+–––––––––––––––––––––––––+–––––––––––––+–––––––––––––––––+| 1 | sql/main | 2.53 GiB | 2.69 GiB || 150 | [email protected] | 4.06 MiB | 32.17 MiB || 146 | sql/slave_sql | 1.31 MiB | 1.44 MiB || 145 | sql/slave_io | 1.08 MiB | 2.79 MiB |...| 28 | innodb/io_read_thread | 0 bytes | 2.25 KiB || 60 | innodb/io_read_thread | 0 bytes | 384 bytes || 139 | innodb/srv_purge_thread | -328 bytes | 754.21 KiB || 69 | innodb/io_write_thread | -1008 bytes | 34.28 KiB || 68 | innodb/io_write_thread | -1440 bytes | 298.05 KiB || 74 | innodb/io_write_thread | -1656 bytes | 103.55 KiB || 4 | innodb/io_log_thread | -2880 bytes | 132.38 KiB || 72 | innodb/io_write_thread | -7632 bytes | 1.10 MiB |+–––––+–––––––––––––––––––––––––+–––––––––––––+–––––––––––––––––+145 rows in set (2.65 sec)
39 www.percona.com
Возможна статистика по thread-ам
mysql> select * from sys.memory_by_thread_by_current_bytes-> order by current_allocated desc\G
*************************** 1. row ***************************thread_id: 152
user: [email protected]_count_used: 325current_allocated: 36.00 GiBcurrent_avg_alloc: 113.43 MiBcurrent_max_alloc: 36.00 GiB
total_allocated: 37.95 GiB...
• Легко найти соединение, использующееслишком много памяти
40 www.percona.com
RAW Performance Schema tables
• memory_summary_by_account_by_event_name
• memory_summary_by_host_by_event_name
• memory_summary_by_thread_by_event_name
• memory_summary_by_user_by_event_name
• memory_summary_global_by_event_name
• sys schema подставляет информацию опользователе
41 www.percona.com
Пользователи в таблицах sys.memory_*
• NAME@HOST - обычный пользователь
• Системные пользователи• sql/main
• innodb/*• ...
• Берутся из таблицы THREADS
42 www.percona.com
Новые инструментыmysql> select * from setup_instruments where name like ’statement/sp%’;+––––––––––––––––––––––––––––––––+–––––––––+–––––––+| NAME | ENABLED | TIMED |+––––––––––––––––––––––––––––––––+–––––––––+–––––––+| statement/sp/stmt | YES | YES || statement/sp/set | YES | YES || statement/sp/set_trigger_field | YES | YES || statement/sp/jump | YES | YES || statement/sp/jump_if_not | YES | YES || statement/sp/freturn | YES | YES || statement/sp/hpush_jump | YES | YES || statement/sp/hpop | YES | YES || statement/sp/hreturn | YES | YES || statement/sp/cpush | YES | YES || statement/sp/cpop | YES | YES || statement/sp/copen | YES | YES || statement/sp/cclose | YES | YES || statement/sp/cfetch | YES | YES || statement/sp/error | YES | YES || statement/sp/set_case_expr | YES | YES |+––––––––––––––––––––––––––––––––+–––––––––+–––––––+16 rows in set (0.00 sec)44 www.percona.com
Диагностика хранимых процедур
• Что происходит внутри
• Запросы, которые реально исполнялись
• statement/sp/stmt
45 www.percona.com
Хранимые процедуры: пример
• Тестовая процедура
CREATE DEFINER=‘root‘@‘localhost‘ PROCEDURE ‘sp_test‘(val int)BEGIN
DECLARE CONTINUE HANDLER FOR 1364, 1048, 1366BEGIN
INSERT IGNORE INTO t1 VALUES(’Some string’);GET STACKED DIAGNOSTICS CONDITION 1 @stacked_state = RETURNED_SQLSTATE;GET STACKED DIAGNOSTICS CONDITION 1 @stacked_msg = MESSAGE_TEXT;
END;INSERT INTO t1 VALUES(val);END
• Выполнится ли HANDLER?
46 www.percona.com
Корректное значение
mysql> call sp_test(1);Query OK, 1 row affected (0.07 sec)
mysql> select thread_id, event_name, sql_text from events_statements_history-> where event_name like ’statement/sp%’;
+–––––––––––+–––––––––––––––––––––––––+––––––––––––––––––––––––––––+| thread_id | event_name | sql_text |+–––––––––––+–––––––––––––––––––––––––+––––––––––––––––––––––––––––+| 24 | statement/sp/hpush_jump | NULL || 24 | statement/sp/stmt | INSERT INTO t1 VALUES(val) || 24 | statement/sp/hpop | NULL |+–––––––––––+–––––––––––––––––––––––––+––––––––––––––––––––––––––––+3 rows in set (0.00 sec)
47 www.percona.com
Вызов HANDLER
mysql> call sp_test(NULL);Query OK, 1 row affected (0.07 sec)
mysql> select thread_id, event_name, sql_text from events_statements_history-> where event_name like ’statement/sp%’;
+–––––––––––+–––––––––––––––––––––––––+––––––––––––––––––––––––––––––––––––––––––+| thread_id | event_name | sql_text |+–––––––––––+–––––––––––––––––––––––––+––––––––––––––––––––––––––––––––––––––––––+| 24 | statement/sp/hpush_jump | NULL || 24 | statement/sp/stmt | INSERT INTO t1 VALUES(val) || 24 | statement/sp/stmt | INSERT IGNORE INTO t1 VALUES(’Some str... || 24 | statement/sp/stmt | GET STACKED DIAGNOSTICS CONDITION 1 @s... || 24 | statement/sp/stmt | GET STACKED DIAGNOSTICS CONDITION 1 @s... || 24 | statement/sp/hreturn | NULL || 24 | statement/sp/hpop | NULL |+–––––––––––+–––––––––––––––––––––––––+––––––––––––––––––––––––––––––––––––––––––+7 rows in set (0.00 sec)
48 www.percona.com
Таблица prepared_statements_instances
• Содержит текущие prepared statements• Статистика по
• Какой thread использует• Сколько раз выполнен• Статистика оптимизации,аналогичная содержащейся вevents_statements_*
• Похоже она не обновляется
50 www.percona.com
Пример: prepared statement
mysql1> prepare stmt from ’select count(*) from employees where hire_date > ?’;Query OK, 0 rows affected (0.00 sec)Statement prepared
mysql1> set @hd=’1995-01-01’;Query OK, 0 rows affected (0.00 sec)
mysql1> execute stmt using @hd;+––––––––––+| count(*) |+––––––––––+| 34004 |+––––––––––+1 row in set (1.44 sec)
• Повторим EXECUTE с разнымизначениями
51 www.percona.com
Пример: диагностика
mysql2> select statement_name, sql_text, owner_thread_id, count_reprepare,-> count_execute, sum_timer_execute from prepared_statements_instances\G
*************************** 1. row ***************************statement_name: stmt
sql_text: select count(*) from employees where hire_date > ?owner_thread_id: 22count_reprepare: 0
count_execute: 3sum_timer_execute: 41565613680001 row in set (0.00 sec)
mysql1> drop prepare stmt;Query OK, 0 rows affected (0.00 sec)
mysql2> select * from prepared_statements_instances\GEmpty set (0.00 sec)
52 www.percona.com
Основные улучшения
• Данные из SHOW SLAVE STATUSдоступны в таблицах replication_*
• Поддержка Replication Channels(Multi-threaded slave)
• Больше инструментов для работы сGTID
54 www.percona.com
SLAVE STATUS• Теперь не нужно парсить выводкоманды SHOW
• Конфигурация• replication_connection_configuration• replication_applier_configuration
• IO thread• replication_connection_status
• SQL thread• replication_applier_status• replication_applier_status_by_coordinator• replication_applier_status_by_worker(Только для multi-threaded slave)
55 www.percona.com
SLAVE STATUS• Конфигурация
mysql> select * from replication_connection_configuration-> join replication_applier_configuration using(channel_name)\G
*************************** 1. row ***************************CHANNEL_NAME:
HOST: 127.0.0.1PORT: 13000USER: root
NETWORK_INTERFACE:AUTO_POSITION: 1
SSL_ALLOWED: NOSSL_CA_FILE:
...SSL_CRL_PATH:
CONNECTION_RETRY_INTERVAL: 60CONNECTION_RETRY_COUNT: 10
HEARTBEAT_INTERVAL: 60.000CHANNEL_NAME:
DESIRED_DELAY: 01 row in set (0.00 sec)
56 www.percona.com
SLAVE STATUS
• Состояние IO Threadmysql> select * from replication_connection_status\G*************************** 1. row ***************************
CHANNEL_NAME:GROUP_NAME:
SOURCE_UUID: d0753e78-14ec-11e5-b3fb-28b2bd7442fdTHREAD_ID: 21
SERVICE_STATE: ONCOUNT_RECEIVED_HEARTBEATS: 17LAST_HEARTBEAT_TIMESTAMP: 2015-06-17 15:49:08RECEIVED_TRANSACTION_SET:
LAST_ERROR_NUMBER: 0LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:001 row in set (0.00 sec)
57 www.percona.com
SLAVE STATUS
• Состояние SQL Threadmysql> select * from replication_applier_status
-> join replication_applier_status_by_coordinator using(channel_name)\G*************************** 1. row ***************************
CHANNEL_NAME:SERVICE_STATE: ON
REMAINING_DELAY: NULLCOUNT_TRANSACTIONS_RETRIES: 0
THREAD_ID: 22SERVICE_STATE: ON
LAST_ERROR_NUMBER: 0LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:001 row in set (0.00 sec)
58 www.percona.com
Диагностика для multi-threaded slave• Таблица replication_applier_status_by_worker
mysql> select * from replication_applier_status_by_worker\G*************************** 1. row ***************************
CHANNEL_NAME:WORKER_ID: 1THREAD_ID: 25
SERVICE_STATE: ONLAST_SEEN_TRANSACTION:
LAST_ERROR_NUMBER: 0LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00*************************** 2. row ***************************
CHANNEL_NAME:WORKER_ID: 2THREAD_ID: 26
SERVICE_STATE: ONLAST_SEEN_TRANSACTION: d0753e78-14ec-11e5-b3fb-28b2bd7442fd:770
LAST_ERROR_NUMBER: 0LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
59 www.percona.com
Диагностика GTID
• RECEIVED_TRANSACTION_SETв таблице replication_connection_status
• LAST_SEEN_TRANSACTIONв таблицеreplication_applier_status_by_worker
• Новые инструменты• memory• wait• stage
60 www.percona.com
Инструментация переменных• Переменные
• global_variables• session_variables• user_variables_by_thread• variables_by_thread
• Статус• global_status• session_status• status_by_[account|host|thread|user]
• show_compatibility_56 = 062 www.percona.com
Глобальные и сессионные переменные
• Таже информация, что и в• SHOW [GLOBAL] STATUS• I_S.GLOBAL_VARIABLES• I_S.SESSION_VARIABLES
• Но без дублирования• В таблице session_variables толькосессионные переменные
• Удобно просматривать изменения всессии
63 www.percona.com
Статусные переменные
• Таже информация, что и в
• SHOW [GLOBAL] STATUS
• I_S.GLOBAL_VARIABLES
• I_S.SESSION_VARIABLES
• Но без дублирования
64 www.percona.com
Статусные переменныеmysql> select * from session_status where variable_value > 0;+––––––––––––––––––––––––––+––––––––––––––––+| VARIABLE_NAME | VARIABLE_VALUE |+––––––––––––––––––––––––––+––––––––––––––––+| Bytes_received | 3887 || Bytes_sent | 224066 || Created_tmp_disk_tables | 1 || Created_tmp_tables | 6 || Handler_external_lock | 15 || Handler_read_first | 1 || Handler_read_key | 1 || Handler_read_rnd_next | 2950 || Handler_write | 477 || Last_query_cost | 34.399000 || Last_query_partial_plans | 1 || Open_tables | 102 || Queries | 82627 || Questions | 104 || Select_scan | 14 || Ssl_default_timeout | 500 |...
65 www.percona.com
Возможна разбивка по параметрам
• variables_by_thread• status_by_
• account• host• thread• user
66 www.percona.com
Возможна разбивка по параметрам
• variables_by_thread
mysql> select * from variables_by_thread where variable_name=’tx_isolation’;+–––––––––––+–––––––––––––––+–––––––––––––––––+| THREAD_ID | VARIABLE_NAME | VARIABLE_VALUE |+–––––––––––+–––––––––––––––+–––––––––––––––––+| 71 | tx_isolation | REPEATABLE-READ || 83 | tx_isolation | REPEATABLE-READ || 84 | tx_isolation | SERIALIZABLE |+–––––––––––+–––––––––––––––+–––––––––––––––––+3 rows in set, 3 warnings (0.00 sec)
• status_by_
66 www.percona.com
Возможна разбивка по параметрам
• variables_by_thread
• status_by_
mysql> select * from status_by_thread where variable_name=’Handler_write’;+–––––––––––+–––––––––––––––+––––––––––––––––+| THREAD_ID | VARIABLE_NAME | VARIABLE_VALUE |+–––––––––––+–––––––––––––––+––––––––––––––––+| 71 | Handler_write | 94 || 83 | Handler_write | 477 | – Больше всего записей| 84 | Handler_write | 101 |+–––––––––––+–––––––––––––––+––––––––––––––––+3 rows in set (0.00 sec)
66 www.percona.com
Пользовательские переменные
• Сгрупирована по соединениям• Иногда можно выявить источникиподземных стуков при использованииpersistent connections
mysql> select * from user_variables_by_thread;+–––––––––––+–––––––––––––––+––––––––––––––––+| THREAD_ID | VARIABLE_NAME | VARIABLE_VALUE |+–––––––––––+–––––––––––––––+––––––––––––––––+| 71 | baz | boo || 84 | foo | bar |+–––––––––––+–––––––––––––––+––––––––––––––––+2 rows in set (0.00 sec)
67 www.percona.com
Улучшения настройки
• Память выделяется on demand
• Sys schema входит в стандартнуюпоставку MySQL
• Отключение статистики для хостаи/или пользователя
• Настройка размера SQL_DIGEST
69 www.percona.com
Performance Schema теперь дешёвая!
• Тесты показывают, чтопроизводительность при включённой ивыключенной Performance Schemaпрактически не отличается
70 www.percona.com
Работа с памятью в версии 5.6-
• Вся необходимая память выделяетсяпри старте
• Объём выделенной памяти никогда неувеличивается: если нет места втаблице, старые данные будут удаленыв независимости от настроек
• Объём выделенной памяти никогда неуменьшается
71 www.percona.com
Работа с памятью в версии 5.7• Память может быть выделена пристарте
• Память может быть выделена подоперацию
• Больше не нужно указывать• performance_schema_accounts_size• performance_schema_hosts_size• performance_schema_max_[instances|handles|stat|locks]• performance_schema_users_size
• Объём выделенной памяти никогда неуменьшается
72 www.percona.com
Sys Schema• Поставляется по умолчанию• Работать с ней намного проще, чем сraw таблицами
• Human-readable вывод• Сравните
mysql> select * from sys.memory_global_total – sys schema-> union-> select sum(CURRENT_NUMBER_OF_BYTES_USED)/(1024*1024)-> from memory_summary_global_by_event_name; – Performance Schema
+–––––––––––––––––+| total_allocated |+–––––––––––––––––+| 147.56 MiB || 147.583346366 |+–––––––––––––––––+2 rows in set (0.01 sec)
73 www.percona.com
Больше возможностей настроек
• Поле ENABLED в таблице setup_actors
mysql> select * from setup_actors;+––––––+–––––––+––––––+–––––––––+| HOST | USER | ROLE | ENABLED |+––––––+–––––––+––––––+–––––––––+| % | % | % | YES || % | sveta | % | NO | – Команды, запущенные пользователем sveta,+––––––+–––––––+––––––+–––––––––+ будут проигнорированы2 rows in set (0.00 sec)
74 www.percona.com
Конфигурируемый размер SQL Digest• Уникальный digest в таблицахevents_statements_* по умолчаниючитает только первые 1024 байта
• Он может не различить два большихзапроса
• Теперь этот размер конфигурируемый• Требуется перезагрузка!
mysql> select @@max_digest_length;+–––––––––––––––––––––+| @@max_digest_length |+–––––––––––––––––––––+| 1024 |+–––––––––––––––––––––+1 row in set (0.00 sec)
75 www.percona.com
Дополнительная информация
• Блог команды разработчиков
• Блог автора sys schema Mark Leith
• Официальное руководство
76 www.percona.com
Спасибо!
http://www.slideshare.net/SvetaSmirnova
https://twitter.com/svetsmirnova
78 www.percona.com