Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Dive into MySQL Error

Avatar for yoku0825 yoku0825
September 21, 2018
2.1k

Dive into MySQL Error

2018/09/21 db tech showcase Tokyo 2018
https://www.db-tech-showcase.com/dbts/tokyo

Avatar for yoku0825

yoku0825

September 21, 2018
Tweet

More Decks by yoku0825

Transcript

  1. 2002: CR_CONNECTION_ERROR ERROR 2002 (HY000): Can't connect to local MySQL

    server through socket '/tmp/mysql.sock' (2) 29/81
  2. 2002: CR_CONNECTION_ERROR ERROR 2002 (HY000): Can't connect to local MySQL

    server through s ocket '/tmp/mysql.sock' (2) $ perror 2 OS error code 2: No such file or directory MySQL error code MY-000002: Error reading file '%s' (OS errno %d - %s) 31/81
  3. 2000番台゚ラヌの特城 perror コマンドでは調べられ ない パッケヌゞ的にサヌバヌの付属ナヌティリティヌだから、だず思う ‐ MySQL :: MySQL 8.0

    Reference Manual :: 4.8.2 perror — Explain Error Codes ‐ OS゚ラヌコヌドは perror コマンドで匕ける ‐ OS゚ラヌコヌドはたたにMySQLサヌバヌの゚ラヌコヌドずカブるの で芋倱わないように  ‐ perror に぀いおはあずで詳しく ‐ 32/81
  4. 2003: CR_CONN_HOST_ERROR $ mysql -h10.0.0.1 ERROR 2003 (HY000): Can't connect

    to MySQL server on '10.0.0.1' (110) $ perror 2003 110 Illegal error code: 2003 OS error code 110: Connection timed out 33/81
  5. 誰埗 mysql80 32> SELECT 1 FROM t1; ERROR 1046 (3D000):

    No database selected mysql80 32> SET lc_messages= 'ja_JP'; Query OK, 0 rows affected (0.01 sec) mysql80 32> SELECT 1 FROM t1; ERROR 1046 (3D000): デヌタベヌスが遞択されおいたせん。 share/errmsg-utf8.txt から “jpn” で始たっおる行を探すず 出おきたす 最近増えた゚ラヌコヌドは網矅されおいないのでコントリビュヌト チャンスですね :D ‐ 52/81
  6. perrorコマンド $ perror 1046 MySQL error code MY-001046 (ER_NO_DB_ERROR): No

    database selected $ perror ER_NO_DB_ERROR MySQL error code MY-001046 (ER_NO_DB_ERROR): No database selected 53/81
  7. perrorコマンド さっきから䜕床か出おきおいる perror コマンド パッケヌゞ的には mysql-server 系に付属しおいる 匕数に゚ラヌコヌドを受けお、゚ラヌメッセヌゞのフォヌ マットを出力する ゚ラヌ番号からだけでも゚ラヌメッセヌゞを掚枬できる

    ‐ ゚ラヌ番号からマクロ名が取り出せるのでgrepが捗る ‐ マクロ名しか曞いおないこずはたずないず思うけどから゚ラヌ番 号ずメッセヌゞが取れる ‐ MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.8.1 perror — ゚ラヌコヌドの説明 54/81
  8. perrorコマンド 䞀番嬉しいのは、 どこたでが決め打ちメッセヌゞな のか がわかるフォヌマットを芋られるこず たずえば 1593: ER_SLAVE_FATAL_ERROR は Slave

    I/O: The slave I/O thread stops because master and slave ha ve equal MySQL server ids; these ids must be different for replic ation to work (or the --replicate-same-server-id option must be u sed on slave but this does not always make sense; please check th e manual before using it), Error_code: 1593 Slave I/O: The slave I/O thread stops because SET @master_heartbe at_period on master failed. Error: , Error_code: 1593 Slave SQL: Fatal error: Failed to initialize the master info stru cture, Error_code: 1593 55/81
  9. じゃあどこでこのバリ゚ヌションが生たれるのか ゚ラヌマクロが分かっおればgrepは簡単 $ grep -r -A1 ER_SLAVE_FATAL_ERROR . ... ./sql/log_event.cc:

    rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ./sql/log_event.cc: ER_THD(thd, ER_SLAVE_FATAL_ERROR), ./sql/log_event.cc- "Invalid character set for User var event"); -- ./sql/rpl_slave.cc: mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ./sql/rpl_slave.cc: ER(ER_SLAVE_FATAL_ERROR), ./sql/rpl_slave.cc- "Failed to flush master info."); -- ./sql/log_event.cc: rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ./sql/log_event.cc: ER_THD(thd, ER_SLAVE_FATAL_ERROR), ./sql/log_event.cc- "Binlog version not supported"); ... 57/81
  10. 慣れおくるず mi は master_info のこずでI/Oスレッド関連 rli は relay_log_info のこずでSQLスレッド関連 それぞれ

    report は SHOW SLAVE STATUS で衚瀺されるような バッファず゚ラヌログに蚘録するためのメ゜ッド $ grep -r -A1 ER_SLAVE_FATAL_ERROR . ... ./sql/log_event.cc: rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ./sql/log_event.cc: ER_THD(thd, ER_SLAVE_FATAL_ERROR), ./sql/log_event.cc- "Invalid character set for User var event"); -- ./sql/rpl_slave.cc: mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ./sql/rpl_slave.cc: ER(ER_SLAVE_FATAL_ERROR), ./sql/rpl_slave.cc- "Failed to flush master info."); -- ./sql/log_event.cc: rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ./sql/log_event.cc: ER_THD(thd, ER_SLAVE_FATAL_ERROR), ./sql/log_event.cc- "Binlog version not supported"); ... 58/81
  11. C怖くないよ 2496 char query_buf[]= "SELECT @@GLOBAL.SERVER_UUID"; .. 2525 if (!mysql_real_query(mysql,

    STRING_WITH_LEN(query_buf)) && 2526 (master_res= mysql_store_result(mysql)) && 2527 (master_row= mysql_fetch_row(master_res))) 2528 { 2529 if (!strcmp(::server_uuid, master_row[0]) && 2530 !mi->rli->replicate_same_server_id) 2531 { 2532 errmsg= "The slave I/O thread stops because master and slave have equ al " 2533 "MySQL server UUIDs; these UUIDs must be different for " 2534 "replication to work."; 2535 mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ER(ER_SLAVE_FATAL_ERROR ), 2536 errmsg); 2537 // Fatal error 2538 ret= 1; 2539 } sql/rpl_slave.cc 60/81
  12. なんずなく わかりたせん 2496 char query_buf[]= "SELECT @@GLOBAL.SERVER_UUID"; .. 2525 if

    (!mysql_real_query(mysql, STRING_WITH_LEN(query_buf)) && 2526 (master_res= mysql_store_result(mysql)) && 2527 (master_row= mysql_fetch_row(master_res))) 2528 { 2529 if (!strcmp(::server_uuid, master_row[0]) && 2530 !mi->rli->replicate_same_server_id) 2531 { 2532 errmsg= "The slave I/O thread stops because master and slave have equ al " 2533 "MySQL server UUIDs; these UUIDs must be different for " 2534 "replication to work."; 2535 mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ER(ER_SLAVE_FATAL_ERROR ), 2536 errmsg); 2537 // Fatal error 2538 ret= 1; 2539 } sql/rpl_slave.cc 61/81
  13. もう1぀の芖点 これは grep -r "UUIDs must be different" . でもたどり着

    ける 2496 char query_buf[]= "SELECT @@GLOBAL.SERVER_UUID"; .. 2525 if (!mysql_real_query(mysql, STRING_WITH_LEN(query_buf)) && 2526 (master_res= mysql_store_result(mysql)) && 2527 (master_row= mysql_fetch_row(master_res))) 2528 { 2529 if (!strcmp(::server_uuid, master_row[0]) && 2530 !mi->rli->replicate_same_server_id) 2531 { 2532 errmsg= "The slave I/O thread stops because master and slave have equal " 2533 "MySQL server UUIDs; these UUIDs must be different for " 2534 "replication to work."; 2535 mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ER(ER_SLAVE_FATAL_ERROR), 2536 errmsg); 2537 // Fatal error 2538 ret= 1; 2539 } sql/rpl_slave.cc 63/81
  14. もう1぀の芖点 grep -r "No database selected" . だずテストケヌスずマ クロの定矩郚分しか出おこない それはそれで楜しいんですけどね

    :D ‐ ... ./include/mysqld_ername.h:{ "ER_NO_DB_ERROR", 1046, "No database selected" }, ./mysql-test/r/alter_table.result:ERROR 3D000: No database select ed ./mysql-test/r/create.result:ERROR 3D000: No database selected ./mysql-test/t/information_schema.test:# Bug#38916 Select from I_ S.ROUTINES results in "No database selected" error ./mysql-test/t/sp.test:# Bug#28551 "The warning 'No database sele cted' is reported when calling ... 64/81
  15. MySQLの゚ラヌログずは実は freopen を䜿っおstderrずstdoutを向けおいるだけ 1772 do { 1773 errors = 0;

    1774 if (!my_freopen(filename, "a", stderr)) errors++; 1775 if (!my_freopen(filename, "a", stdout)) errors++; 1776 } while (retries-- && errors); 1777 sql/log.cc 66/81
  16. lsofで開いおいるファむルディスクリプタヌを芋るだけで もわかったりする $ lsof -p $(pidof mysqld) .. mysqld 20980

    yoku0825 0r CHR 1,3 0t0 1028 /dev/null mysqld 20980 yoku0825 1w REG 253,0 52083 137048897 /usr/mysql/8.0.12/data/error.log mysqld 20980 yoku0825 2w REG 253,0 52083 137048897 /usr/mysql/8.0.12/data/error.log mysqld 20980 yoku0825 3u REG 253,0 65 149633590 /usr/mysql/8.0.12/data/bin.index mysqld 20980 yoku0825 4u REG 253,0 4077 149596931 /usr/mysql/8.0.12/data/innodb_status.20980 .. 67/81
  17. stdoutずstderrが繋がっおいるだけなので プラグむンの䞭で fprintf(stderr, ..) ずかやるずフツヌに ゚ラヌログに出る printデバッグする機䌚があれば憶えおおいお損はないはず ;) ‐ InnoDB

    Monitor( CREATE TABLE innodb_monitor ずか SET GLOBAL innodb_status_output = 1 )がなんでデフォルトで ゚ラヌログに曞かれるのか  InnoDBからするず゚ラヌログに曞いおる぀もりはなくお、単に暙準 ゚ラヌ出力に曞いおいるだけ ‐ ロガヌプロセスみたいなのがいるわけではない 68/81
  18. stdoutずstderrが繋がっおいるだけなので おもむろに゚ラヌログの曞匏をガン無芖したInnoDBのログ に遭遇したこずっおありたせん タむムスタンプずかログレベルずか䞀切ないや぀ ‐ 180731 13:29:08 [Note] InnoDB: 5.5.61

    started; log sequence numbe r 1625977 InnoDB: Error: page 1234 log sequence number InnoDB: is in the future! Current system log sequence number 1625 977 InnoDB: Your database may be corrupt or you may have copied the I nnoDB InnoDB: tablespace but not the InnoDB log files. See" InnoDB: https://dev.mysql.com/../forcing-innodb-recovery.html InnoDB: for more information. 69/81
  19. stdoutずstderrが繋がっおいるだけなので 553 fprintf(stderr, 554 " InnoDB: Error: page %lu log

    sequence number" 555 " %llu\n" 556 "InnoDB: is in the future! Current system " 557 "log sequence number %llu.\n" 558 "InnoDB: Your database may be corrupt or " 559 "you may have copied the InnoDB\n" 560 "InnoDB: tablespace but not the InnoDB " 561 "log files. See\n" 562 "InnoDB: " REFMAN "forcing-innodb-recovery.html\n" 563 "InnoDB: for more information.\n", 564 (ulong) mach_read_from_4(read_buf 565 + FIL_PAGE_OFFSET), 566 mach_read_from_8(read_buf + FIL_PAGE_LSN), 567 current_lsn); 5 storage/innobase/buf/buf0buf.c 70/81
  20. 有名なアレ mysqld got signal 11; This could be because you

    hit a bug. It is also possible that this binary or one of the libraries it was linked against is corrupt, improperly built, or misconfigured. This error can also be caused by malfunctioning hardware. We will try our best to scrape up some info that will hopefully help diagnose the problem, but since we have already crashed, something is definitely wrong and this may fail. key_buffer_size=67108864 read_buffer_size=2093056 max_used_connections=0 max_connections=3000 threads_connected=0 It is possible that mysqld could use up to key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = 30773512 K bytes of memory Hope that's ok; if not, decrease some variables in the equation. 73/81
  21. 実はこのメッセヌゞはハヌドコヌド 115 my_safe_printf_stderr("%s", 116 "This could be because you hit

    a bug. It is also " 117 "possible that this binary\n" 118 "or one of the libraries it was linke d against is " 119 "corrupt, improperly built,\n" 120 "or misconfigured. This error can als o be caused by " 121 "malfunctioning hardware.\n"); sql/signal_handler.cc 74/81
  22. あず、䜕かの名残 5.1, 5.5, 5.6にはこんな分岐があった 未実装のたた5.7からは消えおる ‐ 1154 switch (error_log_printer) {

    1155 case LOG_FILE: 1156 error_log_handler_list[0]= file_log_handler; 1157 error_log_handler_list[1]= 0; 1158 break; 1159 /* these two are disabled for now */ 1160 case LOG_TABLE: 1161 DBUG_ASSERT(0); 1162 break; 1163 case LOG_TABLE|LOG_FILE: 1164 DBUG_ASSERT(0); 1165 break; 1166 } sql/log.cc 77/81
  23. それを蚀い出すずmysqld_safeの゚ラヌログ これもシェルスクリプトの䞭で各コマンドの暙準出力ず暙準 ゚ラヌ出力をリダむレクトでファむルに向けおいるだけ mysqldのログがsyslogに吐けるようになったのは最近だけ どmysqld_safeのログが昔っから吐けたのは単にloggerコマ ンドを䜿えば良かったから mysqldの方はログを曞き蟌む関数を呌ばずにあちこちたちたちに曞い おたのでそれを統合するずころから始たったんだず思う ‐ そんなのもあっおログ甚の関数はメゞャヌバヌゞョンのたびにガリガ

    リ曞き換わっおるので、ストレヌゞ゚ンゞンずかで真面目にそこを呌 んでいるお行儀の良いや぀はマクロで倧倉な気がする ‐ 78/81