Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,751 views

Published on

Published in: Software
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Новые возможности отладки MySQL 5.7 на практике Света Смирнова Техническая поддержка MySQL 20 июня 2015 года
  2. 2. Общие улучшения Улучшения в оптимизаторе запросов Улучшения в InnoDB Другие улучшения Performance Schema Диагностика блокировок: MDL, table, index Диагностика памяти Диагностика хранимых процедур Диагностика prepared statements Репликация: новые таблицы, диагностика слейва, GTID Переменные в P_S Улучшения настройки, использования ресурсов P_S 2 www.percona.com
  3. 3. Общие улучшения 3 www.percona.com
  4. 4. Улучшения в оптимизаторе 4 www.percona.com
  5. 5. Расширения EXPLAIN всегда включены • Теперь не нужно писать • EXPLAIN EXTENDED • EXPLAIN PARTITIONS • SHOW WARNINGS всё ещё требуется 5 www.percona.com
  6. 6. Преобразование: EXPLAIN EXTENDED mysql> explain select count(*) from employees join titles using(emp_no) -> where title=’Senior Engineer’G *************************** 1. row *************************** ... mysql> show warningsG *************************** 1. row *************************** Level: Note Code: 1003 Message: /* 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
  7. 7. Разбиения: EXPLAIN PARTITIONS create 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: 1 select_type: SIMPLE table: employees_part partitions: p1,p2 type: index possible_keys: NULL key: PRIMARY key_len: 7 ref: NULL rows: 1 filtered: 100.00 Extra: Using where; Using index 1 row in set, 1 warning (0.00 sec) 7 www.percona.com
  8. 8. EXPLAIN FOR CONNECTION • Можно запускать EXPLAIN для соединения, котоое в данный момент выполняет запрос • Не нужно дожидаться окончания выполнения • Поддерживает SELECT/INSERT/UPDATE/DELETE • В случае, если соединение выполняет неподдерживаемую команду, будет возвращена ошибка 8 www.percona.com
  9. 9. EXPLAIN FOR CONNECTION mysql> show processlistG *************************** 1. row *************************** Id: 7 ... Info: select count(*) from employees where hire_date > ’1995-01-01’ mysql> explain for connection 7G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: employees partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 299335 filtered: 100.00 Extra: Using where 1 row in set (0.00 sec) 9 www.percona.com
  10. 10. EXPLAIN FORMAT=JSON: что нового? • Total query cost • The cost per table • The amount of data processed 10 www.percona.com
  11. 11. 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
  12. 12. 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
  13. 13. EXPLAIN FORMAT=JSON: пример • MySQL Bug #77340 • 13.78 vs 0.10 sec • Почему такая разница? 13 www.percona.com
  14. 14. Обычный 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‘ = 85260 AND (t1.f3 = 85260 AND t2.f2 IS NULL)G ... *************************** 3. row *************************** id: 1 select_type: SIMPLE table: t3 partitions: NULL type: ref possible_keys: f3,f1 key: f3 key_len: 9 ref: const rows: 3 filtered: 100.00 Extra: Using where 14 www.percona.com
  15. 15. Обычный 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‘ = 85260 AND (t1.f3 = 85260 AND t2.f2 IS NULL)G ... *************************** 3. row *************************** id: 1 select_type: SIMPLE table: t3 partitions: NULL type: ref possible_keys: f1 key: f1 key_len: 1032 ref: test.t1.id,const rows: 21 filtered: 100.00 Extra: Using where 15 www.percona.com
  16. 16. 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
  17. 17. 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
  18. 18. Улучшения в InnoDB 18 www.percona.com
  19. 19. UPDATE_TIME для InnoDB • INFORMATION_SCHEMA.TABLES • SHOW TABLE STATUS • Теперь мы можем пользоваться запросами вида: SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA WHERE UPDATE_TIME > DATE_OF_LAST_BACKUP 19 www.percona.com
  20. 20. До версии 5.7 mysql> show table status like ’employees’G *************************** 1. row *************************** Name: employees Engine: InnoDB ... Create_time: 2015-06-15 04:25:01 Update_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
  21. 21. В версии 5.7 mysql> show table status like ’employees’G *************************** 1. row *************************** Name: employees Engine: InnoDB ... Create_time: 2015-06-15 01:39:32 Update_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
  22. 22. 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. 23. Другие улучшения 23 www.percona.com
  24. 24. SHOW SLAVE STATUS • Теперь неблокирующий • Ранее команда STOP SLAVE приводила к "зависанию"SHOW SLAVE STATUS • Как следствие было много багов типа "Deadlock between SHOW SLAVE STATUS and ..." • Работа не зависит от того, что происходит внутри слэйва 24 www.percona.com
  25. 25. Stacked diagnostic area • GET STACKED DIAGNOSTICS • Используется • При вызове хранимых процедур • Внутри HANDLER • При вызове RESIGNAL • Доступна только внутри HANDLER в хранимых процедурах 25 www.percona.com
  26. 26. 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
  27. 27. 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 r +–––––––––+––––––+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 1 row in set (0.00 sec) • В версии 5.6 мы ничего не узнаем о первой ошибке 27 www.percona.com
  28. 28. 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 r +–––––––––+––––––+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 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
  29. 29. Нововведения журналирования • log_error_verbosity - выбирайте, что хотите видеть в логе: ERRORS, WARNINGS, NOTES • log_syslog* - писать ли в системный лог, также доступны настройки. • log_timestamps - какую timezone использовать для записи в логи • log_throttle_queries_not_using_indexes - ограничивает количество запросов, не использующих индексы в Slow Query Log 28 www.percona.com
  30. 30. Улучшения в Performance Schema 29 www.percona.com
  31. 31. Диагностика блокировок 30 www.percona.com
  32. 32. MDL • Таблица METADATA_LOCKS • Что ждёт блокировку • Что держит блокировку • Не только таблицы: GLOBAL, SCHEMA, TABLE, FUNCTION, PROCEDURE, EVENT, COMMIT, USER LEVEL LOCK, TABLESPACE 31 www.percona.com
  33. 33. 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: TABLE lock_type: EXCLUSIVE lock_status: PENDING – ждёт source: mdl.cc:3263 *************************** 2. row *************************** processlist_id: 5 object_type: TABLE lock_type: SHARED_READ lock_status: GRANTED – держит source: sql_parse.cc:5707 32 www.percona.com
  34. 34. Табличные блокировки • Таблица TABLE_HANDLES • Не только блокировки, но и информация об открытых таблицах • FLUSH TABLES удаляет данные из таблицы 33 www.percona.com
  35. 35. Табличные блокировки: пример mysql1> select count(*) from employees where first_name like ’Svet%’; • Пока здесь ждём, в параллельном клиенте: mysql2> select * from table_handlesG *************************** 1. row *************************** OBJECT_TYPE: TABLE OBJECT_SCHEMA: employees OBJECT_NAME: employees OBJECT_INSTANCE_BEGIN: 140544885988272 OWNER_THREAD_ID: 23 OWNER_EVENT_ID: 818320 INTERNAL_LOCK: NULL EXTERNAL_LOCK: READ EXTERNAL – Табличная блокировка! 1 row in set (0.00 sec) 34 www.percona.com
  36. 36. Табличные блокировки: пример mysql1> select count(*), sleep(10) from employees where emp_no=10001; • В параллельном клиенте: mysql2> select * from table_handlesG *************************** 1. row *************************** OBJECT_TYPE: TABLE OBJECT_SCHEMA: employees OBJECT_NAME: employees OBJECT_INSTANCE_BEGIN: 140544885988272 OWNER_THREAD_ID: 23 OWNER_EVENT_ID: 1011419 INTERNAL_LOCK: NULL EXTERNAL_LOCK: NULL – Всё нормально, выборка по индексу 1 row in set (0.00 sec) 35 www.percona.com
  37. 37. Диагностика памяти 36 www.percona.com
  38. 38. Почему это моё любимое улучшение? • До версии 5.7 понять куда утекает память из MySQL сервера было невозможно • Выделенные буферы? • Временные таблицы? • Внутренние структуры, никак не контролируемые пользователем? • Утечки нет, просто система не показывает память как свободную? 37 www.percona.com
  39. 39. Диагностика памяти до версии 5.7 • free • top • vmstat • Косвенные данные • Узнать на что конкретно память выделена было нельзя 38 www.percona.com
  40. 40. Диагностика памяти до версии 5.7 • free $free total used free shared buffers cached Mem: 16149184 6223916 9925268 317536 1048 3655160 -/+ buffers/cache: 2567708 13581476 Swap: 2110460 0 2110460 • top • vmstat • Косвенные данные 38 www.percona.com
  41. 41. Диагностика памяти до версии 5.7 • free • top $top Tasks: 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 s KiB Mem: 16149184 total, 6231688 used, 9917496 free, 1048 buffers KiB Swap: 2110460 total, 0 used, 2110460 free. 3670752 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1914 mysql 20 0 670m 95m 1296 S 0.7 1.2 2:42.14 mysqld • vmstat • Косвенные данные 38 www.percona.com
  42. 42. Диагностика памяти до версии 5.7 • free • top • vmstat $vmstat -t 5 3 procs –––––––––––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
  43. 43. Диагностика памяти до версии 5.7 • free • top • vmstat • Косвенные данные • Размер буферов • Количество временных таблиц • Количество параллельных соединений 38 www.percona.com
  44. 44. Диагностика памяти в версии 5.7 mysql> 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 | root@127.0.0.1 | 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
  45. 45. Возможна статистика по thread-ам mysql> select * from sys.memory_by_thread_by_current_bytes -> order by current_allocated descG *************************** 1. row *************************** thread_id: 152 user: lj@127.0.0.1 current_count_used: 325 current_allocated: 36.00 GiB current_avg_alloc: 113.43 MiB current_max_alloc: 36.00 GiB total_allocated: 37.95 GiB ... • Легко найти соединение, использующее слишком много памяти 40 www.percona.com
  46. 46. 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
  47. 47. Пользователи в таблицах sys.memory_* • NAME@HOST - обычный пользователь • Системные пользователи • sql/main • innodb/* • ... • Берутся из таблицы THREADS 42 www.percona.com
  48. 48. Диагностика хранимых процедур 43 www.percona.com
  49. 49. Новые инструменты 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
  50. 50. Диагностика хранимых процедур • Что происходит внутри • Запросы, которые реально исполнялись • statement/sp/stmt 45 www.percona.com
  51. 51. Хранимые процедуры: пример • Тестовая процедура CREATE DEFINER=‘root‘@‘localhost‘ PROCEDURE ‘sp_test‘(val int) BEGIN DECLARE CONTINUE HANDLER FOR 1364, 1048, 1366 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(val); END • Выполнится ли HANDLER? 46 www.percona.com
  52. 52. Корректное значение 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
  53. 53. Вызов 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
  54. 54. Диагностика prepared statements 49 www.percona.com
  55. 55. Таблица prepared_statements_instances • Содержит текущие prepared statements • Статистика по • Какой thread использует • Сколько раз выполнен • Статистика оптимизации, аналогичная содержащейся в events_statements_* • Похоже она не обновляется 50 www.percona.com
  56. 56. Пример: 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
  57. 57. Пример: диагностика mysql2> select statement_name, sql_text, owner_thread_id, count_reprepare, -> count_execute, sum_timer_execute from prepared_statements_instancesG *************************** 1. row *************************** statement_name: stmt sql_text: select count(*) from employees where hire_date > ? owner_thread_id: 22 count_reprepare: 0 count_execute: 3 sum_timer_execute: 4156561368000 1 row in set (0.00 sec) mysql1> drop prepare stmt; Query OK, 0 rows affected (0.00 sec) mysql2> select * from prepared_statements_instancesG Empty set (0.00 sec) 52 www.percona.com
  58. 58. Репликация 53 www.percona.com
  59. 59. Основные улучшения • Данные из SHOW SLAVE STATUS доступны в таблицах replication_* • Поддержка Replication Channels (Multi-threaded slave) • Больше инструментов для работы с GTID 54 www.percona.com
  60. 60. 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
  61. 61. SLAVE STATUS • Конфигурация mysql> select * from replication_connection_configuration -> join replication_applier_configuration using(channel_name)G *************************** 1. row *************************** CHANNEL_NAME: HOST: 127.0.0.1 PORT: 13000 USER: root NETWORK_INTERFACE: AUTO_POSITION: 1 SSL_ALLOWED: NO SSL_CA_FILE: ... SSL_CRL_PATH: CONNECTION_RETRY_INTERVAL: 60 CONNECTION_RETRY_COUNT: 10 HEARTBEAT_INTERVAL: 60.000 CHANNEL_NAME: DESIRED_DELAY: 0 1 row in set (0.00 sec) 56 www.percona.com
  62. 62. SLAVE STATUS • Состояние IO Thread mysql> select * from replication_connection_statusG *************************** 1. row *************************** CHANNEL_NAME: GROUP_NAME: SOURCE_UUID: d0753e78-14ec-11e5-b3fb-28b2bd7442fd THREAD_ID: 21 SERVICE_STATE: ON COUNT_RECEIVED_HEARTBEATS: 17 LAST_HEARTBEAT_TIMESTAMP: 2015-06-17 15:49:08 RECEIVED_TRANSACTION_SET: LAST_ERROR_NUMBER: 0 LAST_ERROR_MESSAGE: LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00 1 row in set (0.00 sec) 57 www.percona.com
  63. 63. SLAVE STATUS • Состояние SQL Thread mysql> select * from replication_applier_status -> join replication_applier_status_by_coordinator using(channel_name)G *************************** 1. row *************************** CHANNEL_NAME: SERVICE_STATE: ON REMAINING_DELAY: NULL COUNT_TRANSACTIONS_RETRIES: 0 THREAD_ID: 22 SERVICE_STATE: ON LAST_ERROR_NUMBER: 0 LAST_ERROR_MESSAGE: LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00 1 row in set (0.00 sec) 58 www.percona.com
  64. 64. Диагностика для multi-threaded slave • Таблица replication_applier_status_by_worker mysql> select * from replication_applier_status_by_workerG *************************** 1. row *************************** CHANNEL_NAME: WORKER_ID: 1 THREAD_ID: 25 SERVICE_STATE: ON LAST_SEEN_TRANSACTION: LAST_ERROR_NUMBER: 0 LAST_ERROR_MESSAGE: LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00 *************************** 2. row *************************** CHANNEL_NAME: WORKER_ID: 2 THREAD_ID: 26 SERVICE_STATE: ON LAST_SEEN_TRANSACTION: d0753e78-14ec-11e5-b3fb-28b2bd7442fd:770 LAST_ERROR_NUMBER: 0 LAST_ERROR_MESSAGE: LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00 59 www.percona.com
  65. 65. Диагностика GTID • RECEIVED_TRANSACTION_SET в таблице replication_connection_status • LAST_SEEN_TRANSACTION в таблице replication_applier_status_by_worker • Новые инструменты • memory • wait • stage 60 www.percona.com
  66. 66. Переменные в P_S 61 www.percona.com
  67. 67. Инструментация переменных • Переменные • global_variables • session_variables • user_variables_by_thread • variables_by_thread • Статус • global_status • session_status • status_by_[account|host|thread|user] • show_compatibility_56 = 0 62 www.percona.com
  68. 68. Глобальные и сессионные переменные • Таже информация, что и в • SHOW [GLOBAL] STATUS • I_S.GLOBAL_VARIABLES • I_S.SESSION_VARIABLES • Но без дублирования • В таблице session_variables только сессионные переменные • Удобно просматривать изменения в сессии 63 www.percona.com
  69. 69. Статусные переменные • Таже информация, что и в • SHOW [GLOBAL] STATUS • I_S.GLOBAL_VARIABLES • I_S.SESSION_VARIABLES • Но без дублирования 64 www.percona.com
  70. 70. Статусные переменные 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
  71. 71. Возможна разбивка по параметрам • variables_by_thread • status_by_ • account • host • thread • user 66 www.percona.com
  72. 72. Возможна разбивка по параметрам • 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
  73. 73. Возможна разбивка по параметрам • 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
  74. 74. Пользовательские переменные • Сгрупирована по соединениям • Иногда можно выявить источники подземных стуков при использовании 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
  75. 75. Улучшения настройки 68 www.percona.com
  76. 76. Улучшения настройки • Память выделяется on demand • Sys schema входит в стандартную поставку MySQL • Отключение статистики для хоста и/или пользователя • Настройка размера SQL_DIGEST 69 www.percona.com
  77. 77. Performance Schema теперь дешёвая! • Тесты показывают, что производительность при включённой и выключенной Performance Schema практически не отличается 70 www.percona.com
  78. 78. Работа с памятью в версии 5.6- • Вся необходимая память выделяется при старте • Объём выделенной памяти никогда не увеличивается: если нет места в таблице, старые данные будут удалены в независимости от настроек • Объём выделенной памяти никогда не уменьшается 71 www.percona.com
  79. 79. Работа с памятью в версии 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
  80. 80. 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
  81. 81. Больше возможностей настроек • Поле 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
  82. 82. Конфигурируемый размер 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
  83. 83. Дополнительная информация • Блог команды разработчиков • Блог автора sys schema Mark Leith • Официальное руководство 76 www.percona.com
  84. 84. Место для вопросов ??? 77 www.percona.com
  85. 85. Спасибо! http://www.slideshare.net/SvetaSmirnova https://twitter.com/svetsmirnova 78 www.percona.com

×