85
Новые возможности отладки MySQL 5.7 на практике Света Смирнова Техническая поддержка MySQL 20 июня 2015 года

Новые возможности отладки MySQL 5.7 на практике

Embed Size (px)

Citation preview

Новые возможности отладки MySQL 5.7на практикеСвета Смирнова

Техническая поддержка MySQL20 июня 2015 года

Общие улучшенияУлучшения в оптимизаторе запросовУлучшения в InnoDBДругие улучшения

Performance SchemaДиагностика блокировок: MDL, table, indexДиагностика памятиДиагностика хранимых процедурДиагностика prepared statementsРепликация: новые таблицы, диагностика слейва, GTIDПеременные в P_SУлучшения настройки, использования ресурсов P_S

2 www.percona.com

Общие улучшения

3 www.percona.com

Улучшения в оптимизаторе

4 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

Улучшения в InnoDB

18 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

Другие улучшения

23 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

Улучшения в Performance Schema

29 www.percona.com

Диагностика блокировок

30 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

Диагностика памяти

36 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

Диагностика хранимых процедур

43 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

49 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

Репликация

53 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

Переменные в P_S

61 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

Улучшения настройки

68 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

Место для вопросов

???

77 www.percona.com

Спасибо!

http://www.slideshare.net/SvetaSmirnova

https://twitter.com/svetsmirnova

78 www.percona.com