2017年10月30日月曜日

MySQL 8.0.0で予約語だったROLEが8.0.1ではキーワードになっていたはなし

TL;DR

  • hmatsu47 さんに MySQLのキーワードと予約語 の中で「ROLEは予約語じゃなくてキーワード」と教えてもらった
  • 予約語とキーワードの違いは、 role_or_ident_keyword にリストされているかどうか? (ちなみに5.7だと単に keyword ってリストになってる)

シンボルのリスト

ラベルのリスト

ほげってみる

$ diff -c1 sql/sql_yacc.yy.orig sql/sql_yacc.yy
*** sql/sql_yacc.yy.orig        2017-09-19 20:33:50.000000000 +0900
--- sql/sql_yacc.yy     2017-10-30 16:23:04.657625949 +0900
***************
*** 13343,13345 ****
          | RESTORE_SYM           {}
-         | ROLE_SYM              {}
          | ROLLBACK_SYM          {}
--- 13343,13344 ----

$ make && make install

mysql80 8> SELECT @@version;
+--------------------+
| @@version          |
+--------------------+
| 8.0.3-rc-debug-log |
+--------------------+
1 row in set (0.00 sec)

mysql80 8> CREATE TABLE t1 (role int);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'role int)' at line 1
転けるようになった。

なんというか

予約語のキーワードと非予約語のキーワードの境目って案外大したことなかった…。 これを機に色々ゴニョって遊んでみ(ない

2017年10月4日水曜日

ファイルを吐かないtarコマンドの進捗を確認する

ファイルを吐かないというのは、MySQLのdatadirをtarボールに固めながら圧縮してS3にアップロードするようなケース(なんて限定的)
$ tar -C /var/lib -c mysql | pzstd -qc | aws s3 cp - s3://...
S3さん、アップロード終わるまで状況が見えないので、保管先のファイルサイズから全体をざっくり見積もることができなかった。俺のやり方が悪いだけかも知れない。
取り敢えず lsof で今掴んでいるファイルを見ることくらいまではぱっと思い付いた。
$ ps auxww | grep tar
root      1181  0.0  0.4 289208  4800 ?        Ssl  23:15   0:00 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc --runtime-args --systemd-cgroup=true
yoku0825  3259  0.3  0.1 123344  1232 pts/0    S+   23:22   0:00 tar c data
yoku0825  3263  0.0  0.0 112644   968 pts/1    R+   23:22   0:00 grep --color=auto tar

$ lsof -p 3259
COMMAND  PID     USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
..
tar     3259 yoku0825    0u   CHR  136,0       0t0         3 /dev/pts/0
tar     3259 yoku0825    1w  FIFO    0,8       0t0     28213 pipe
tar     3259 yoku0825    2u   CHR  136,0       0t0         3 /dev/pts/0
tar     3259 yoku0825    3r   DIR  253,0      4096  71088914 /usr/mysql/5.7.19/data
tar     3259 yoku0825    4r   REG  253,0  21091934  68051378 /usr/mysql/5.7.19/data/bin.000011
たとえば今は bin.000011 を掴んでる、というところまではわかる。
が、 tar コマンドってファイルをどういう順番で掴むのかがわからず、bin.000011 が全体で何番目のファイルなのかよくわからない。 経験則として、 tar cvf とか tar xvf でファイル名だだーっと流している時でも、少なくともファイルパスでソートされているようには見えない。
困った時のソースコード。
ディレクトリーをターゲットにtarボールを作る時には create_archivedump_filedump_file0dump_dirget_directory_entries と来て、その中からgnulibstreamsavedir を呼び出している。
streamsavedir がやってることは単に readdir しているだけで、この時の並び順は特に決まった規則がある訳ではないらしい。
ところで readdir したものをそのままといえば、ls のソート無しオプションである -f な訳で、
$ ls -fl 
total 239212
drwxr-x---  9 yoku0825 yoku0825     4096 Oct  3 23:10 .
drwxrwxr-x 11 yoku0825 yoku0825      148 Jul 18 15:13 ..
-rw-r-----  1 yoku0825 yoku0825 79691776 Oct  3 23:10 ibdata1
-rw-r-----  1 yoku0825 yoku0825       56 Jul 18 15:12 auto.cnf
drwxr-x---  2 yoku0825 yoku0825     4096 Aug 22 18:29 mysql
...
drwxr-x---  2 yoku0825 yoku0825     4096 Aug 10 15:10 i_s
drwxr-x---  2 yoku0825 yoku0825     8192 Aug 10 15:10 p_s
-rw-r-----  1 yoku0825 yoku0825  3818805 Aug 18 18:52 bin.000006
-rw-r-----  1 yoku0825 yoku0825 21091934 Aug 24 18:41 bin.000011
-rw-r-----  1 yoku0825 yoku0825 48221936 Sep  6 12:44 bin.000012
-rw-r-----  1 yoku0825 yoku0825    86553 Sep 15 15:47 bin.000017
-rw-r-----  1 yoku0825 yoku0825    10626 Sep 20 16:30 bin.000024
-rw-r-----  1 yoku0825 yoku0825      169 Aug 22 14:26 relay.000001
-rw-r-----  1 yoku0825 yoku0825      209 Sep 12 13:16 bin.000015
-rw-r-----  1 yoku0825 yoku0825      227 Sep 19 20:49 bin.000022
大体残り50MBくらいかなあと。ディレクトリー階層があるところなら親ディレクトリーがどの場所に並んでて、そのディレクトリーの中でファイルが何番目に位置しているか…とか丁寧に調べれば大体今何%のところにあるかは出せるような気がする。
とはいえまあ pipe viewer 使えばいいよねとは思う。
$ tar -C /var/lib -c mysql | pv | pzstd -qc | aws s3 cp - s3://...
 247MiB 0:00:04 [50.2MiB/s] [         <=>
pv 使うの忘れた時とかcronからキックされた時用かな。