TL;DR
- パラメーターの組み合わせを間違えた場合、本来Abortして起動しないもの(ここまでは意図的)がAbortの処理に失敗してクラッシュする
- “Not a Bug”, 仕様だということらしいので、気にせず正しい組み合わせで起動してやれば良いだけのはず
- skip-grant-tablesしたい時はmy.iniに一緒にshared-memoryを書いてね!
MySQL 8.0では skip-grant-tables を設定した時に自動で skip-networking も設定されるようになった。
これ自体は、「権限テーブル無視してノーガード状態(どこからでもroot相当の権限でノーパスワードでログインできる)のMySQLを守る」ためなので妥当な変更だと思う。
が、Linuix系のMySQLはskip-networkingでもソケット接続が自動(?)で残るので問題ないが、WindowsのMySQLはデフォルトではTCP/IP接続しか使えない = skip-networkingだけを指定するとアクセス方法が全断するのでAbortする。
↓クラッシュしない8.0.19のAbortのログ。
C:\Users\yoku0825\Downloads\mysql-8.0.19-winx64\mysql-8.0.19-winx64>bin\mysqld --console --skip-grant-tables
2022-08-30T02:13:13.537027Z 0 [System] [MY-010116] [Server] C:\Users\yoku0825\Downloads\mysql-8.0.19-winx64\mysql-8.0.19-winx64\bin\mysqld.exe (mysqld 8.0.19) starting as process 11792
2022-08-30T02:13:14.070774Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2022-08-30T02:13:14.086299Z 0 [System] [MY-010931] [Server] C:\Users\yoku0825\Downloads\mysql-8.0.19-winx64\mysql-8.0.19-winx64\bin\mysqld.exe: ready for connections. Version: '8.0.19' socket: '' port: 0 MySQL Community Server - GPL.
2022-08-30T02:13:14.086409Z 0 [ERROR] [MY-010131] [Server] TCP/IP, --shared-memory, or --named-pipe should be configured on NT OS
2022-08-30T02:13:14.086814Z 0 [ERROR] [MY-010119] [Server] Aborting
2022-08-30T02:13:14.271648Z 0 [Warning] [MY-011311] [Server] Plugin mysqlx reported: 'All I/O interfaces are disabled, X Protocol won't be accessible'
2022-08-30T02:13:15.239054Z 0 [System] [MY-010910] [Server] C:\Users\yoku0825\Downloads\mysql-8.0.19-winx64\mysql-8.0.19-winx64\bin\mysqld.exe: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.
Windowsで非TCP/IP通信をするには shared-memory (これは俺使ったことある)または named-pipe (なんか使うのに失敗して以来使ってない) を「明示的に」my.iniに追加しないといけない。
追加していない場合、 [ERROR] [MY-010131] [Server] TCP/IP, --shared-memory, or --named-pipe should be configured on NT OS
(skip-networkingによって)TCP/IPも有効じゃないし、shared-memoryもnamed-pipeも1つも有効になってないよ(少なくとも1つは有効にしろよ)とエラーになって起動に失敗する( [MY-010119] [Server] Aborting
)
ここまでは良いのだが、8.0.20とそれ以降ではこのAbort処理に失敗して( [ERROR] [MY-013183] [InnoDB] Assertion failure
)バックトレースを吐く。
PS C:\Users\yoku0\Downloads\mysql-8.0.30-winx64\mysql-8.0.30-winx64> bin\mysqld --console --skip-grant-tables
2022-08-26T16:11:22.498164Z 0 [System] [MY-010116] [Server] C:\Users\yoku0\Downloads\mysql-8.0.30-winx64\mysql-8.0.30-winx64\bin\mysqld.exe (mysqld 8.0.30) starting as process 20292
2022-08-26T16:11:22.519344Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2022-08-26T16:11:22.803359Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2022-08-26T16:11:22.970565Z 0 [Warning] [MY-011311] [Server] Plugin mysqlx reported: 'All I/O interfaces are disabled, X Protocol won't be accessible'
2022-08-26T16:11:23.124791Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2022-08-26T16:11:23.125007Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2022-08-26T16:11:23.137076Z 0 [System] [MY-010931] [Server] C:\Users\yoku0\Downloads\mysql-8.0.30-winx64\mysql-8.0.30-winx64\bin\mysqld.exe: ready for connections. Version: '8.0.30' socket: '' port: 0 MySQL Community Server - GPL.
2022-08-26T16:11:23.137232Z 0 [ERROR] [MY-010131] [Server] TCP/IP, --shared-memory, or --named-pipe should be configured on NT OS
2022-08-26T16:11:23.137332Z 0 [ERROR] [MY-010119] [Server] Aborting
2022-08-26T16:11:25.018791Z 0 [ERROR] [MY-013183] [InnoDB] Assertion failure: trx0sys.cc:643:UT_LIST_GET_LEN(trx_sys->mysql_trx_list) == 0 thread 8748
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
16:11:25 UTC - mysqld got exception 0x16 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
Thread pointer: 0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
7ff752740858 mysqld.exe!my_print_stacktrace()[stacktrace.cc:429]
7ff7518de92b mysqld.exe!print_fatal_signal()[signal_handler.cc:130]
7ff7518de6f3 mysqld.exe!my_server_abort()[signal_handler.cc:241]
7ff7527247fa mysqld.exe!my_abort()[my_init.cc:263]
7ff75296ca99 mysqld.exe!ut_dbg_assertion_failed()[ut0dbg.cc:99]
7ff752951d0e mysqld.exe!trx_sys_close()[trx0sys.cc:643]
7ff752903f81 mysqld.exe!srv_shutdown()[srv0start.cc:3240]
7ff75281cb6a mysqld.exe!innodb_shutdown()[ha_innodb.cc:1603]
7ff7516add5b mysqld.exe!ha_finalize_handlerton()[handler.cc:726]
7ff7516e9754 mysqld.exe!plugin_deinitialize()[sql_plugin.cc:1121]
7ff7516ef199 mysqld.exe!reap_plugins()[sql_plugin.cc:1190]
7ff7516ede10 mysqld.exe!plugin_shutdown()[sql_plugin.cc:2090]
7ff7516866b9 mysqld.exe!clean_up()[mysqld.cc:2581]
7ff75169aa5a mysqld.exe!unireg_abort()[mysqld.cc:2444]
7ff75169941f mysqld.exe!setup_conn_event_handler_threads()[mysqld.cc:3280]
7ff75169d196 mysqld.exe!win_main()[mysqld.cc:8120]
7ff7516954b5 mysqld.exe!mysql_service()[mysqld.cc:8215]
7ff751695adb mysqld.exe!mysqld_main()[mysqld.cc:8431]
7ff752de4cb4 mysqld.exe!__scrt_common_main_seh()[exe_common.inl:288]
7ffa9f2554e0 KERNEL32.DLL!BaseThreadInitThunk()
7ffa9fee485b ntdll.dll!RtlUserThreadStart()
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
明らかにクラッシュはしているものの、直すのは大変だからこのまま(だったらStatusは “Not a Bug” ではなく “Won’t fix” では? とは思うけど)らしいので、この事象にあたった人が焦らないようにこの情報をここに書き残しておきます。
MySQL Bugs: #108304: mysqld.exe crashes --skip-grant-tables without --shared-memory or --named-pipe
skip-grant-tablesしたい時はmy.iniに一緒にshared-memoryを書いてね!
完全な余談。
これ、起動時に起こるクラッシュながら、見えるバックトレースは完全に「終了シーケンスの中でのクラッシュ」なのがちょっと面白かった。Abort処理の中でおかしくなってる(たぶん、InnoDBの初期化が終わってないのにInnoDBの終了処理をしているのがいけない)から終了シーケンスの中でのクラッシュなんだけど、逆にそれが「起動時…だよね…?」とバックトレースに目を取られて [MY-010131] [Server] TCP/IP, --shared-memory, or --named-pipe should be configured on NT OS
を見落とさないように注意。