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

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

Upload: sveta-smirnova

Post on 30-Jul-2015

215 views

Category:

Software


0 download

TRANSCRIPT

Новые возможности отладки 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