2017年6月21日水曜日

MySQL 5.6のmysqldumpでMySQL 5.7のサーバーに接続してダンプを取ろうとするとコア吐く件

TL;DR

  • MySQL 5.7.12とそれ以降のmysqldumpなら大丈夫
  • 実はバージョン依存ではなく sql_mode=ONLY_FULL_GROUP_BY 依存

別のものを調べている時に /var/log/messages を見てたら、なんかがコア吐いてるのに気が付いた。
Jun 20 04:26:42 archive_host kernel: mysqldump[28611]: segfault at 0 ip 00000030b152859a sp 00007fffd760a358 error 4 in libc-2.12.so[30b1400000+18b000]
Jun 20 04:26:42 archive_host abrtd: Directory 'ccpp-2017-06-20-04:26:42-28611' creation detected
Jun 20 04:26:42 archive_host abrt[28613]: Saved core dump of pid 28611 (/data01/mysqlbin/mysql-5.6.20-linux-glibc2.5-x86_64/bin/mysqldump) to /var/spool/abrt/ccpp-2017-06-20-04:26:42-28611 (2609152 bytes)
Jun 20 04:26:42 archive_host kernel: mysqldump[28615]: segfault at 0 ip 00000030b152859a sp 00007fffbd02f9d8 error 4 in libc-2.12.so[30b1400000+18b000]
Jun 20 04:26:42 archive_host abrt[28617]: Not saving repeating crash in '/data01/mysqlbin/mysql-5.6.20-linux-glibc2.5-x86_64/bin/mysqldump'
Jun 20 04:27:12 archive_host abrtd: 電子メールを送信しています... 
Jun 20 04:27:12 archive_host abrtd: 電子メールが送信されました: root@localhost
Jun 20 04:27:13 archive_host abrtd: Duplicate: UUID
Jun 20 04:27:13 archive_host abrtd: DUP_OF_DIR: /var/spool/abrt/ccpp-2017-01-31-00:25:08-30738
Jun 20 04:27:13 archive_host abrtd: Deleting problem directory ccpp-2017-06-20-04:26:42-28611 (dup of ccpp-2017-01-31-00:25:08-30738)
Jun 20 04:27:13 archive_host abrtd: No actions are found for event 'notify-dup'
mysqldumpさんがSEGVしてコア吐いてる。 しかもなんか今年1月から出てるみたいでDUP_OF_DIRとか言われた(こんな機能あったんですがabrtさん)
$ pwd
/var/spool/abrt/ccpp-2017-01-31-00:25:08-30738

$ file coredump
coredump: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/usr/local/mysql56/bin/mysqldump --user=dev_backup --host=172.19.140.61 --port='
開発環境のダンプを取るmysqldumpだった。パスからわかるようにmysqldumpはMySQL 5.6のもの。
$ gdb /usr/local/mysql56/bin/mysqldump coredump
..
(gdb) bt
#0  0x00000030b152859a in __strcmp_sse42 () from /lib64/libc.so.6
#1  0x000000000040e90f in dump_tablespaces (ts_where=0x0)
    at /export/home/pb2/build/sb_0-12734909-1405700492.82/mysql-5.6.20/client/mysqldump.c:4026
#2  0x0000000000416312 in dump_all_tablespaces (argc=0, argv=0x246f1a8)
    at /export/home/pb2/build/sb_0-12734909-1405700492.82/mysql-5.6.20/client/mysqldump.c:3893
#3  main (argc=0, argv=0x246f1a8) at /export/home/pb2/build/sb_0-12734909-1405700492.82/mysql-5.6.20/client/mysqldump.c:5853
刺さったのは ここ
直前で初期化してる buf[0] がマズいとは考えにくいので、その手前 で組み立てられているクエリーを眺めてみる。
…あれ、俺これなんか見たことあるような気がするぞ………?
$ /usr/local/mysql56/bin/mysql --user=xxx --host=172.19.140.61 --port=3309 --execute="SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE ORDER BY LOGFILE_GROUP_NAME"

ERROR 1055 (42000) at line 1: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'information_schema.FILES.TOTAL_EXTENTS' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
うん、 sql_mode=ONLY_FULL_GROUP_BY にやられて転けるやつ。
しかしなんでこれが mysql_query(mysql, sqlbuf.str) で0(=成功) 以外が返ってifの中に落ち込まないのかがよくわからない。
(gdb) p mysql->net.last_errno
$4 = 0
なんなんだろうなあ。。 しかしこれどっかで調べた気がするんだよなあ。。どこだったっけなあ。。

0 件のコメント :

コメントを投稿