Slide 1

Slide 1 text

MySQL Parameters の裏側 MySQL Parameters の裏側 日本MySQLユーザ会会 2020-11-25 とみたまさひろ 1

Slide 2

Slide 2 text

自己紹介 自己紹介 とみたまさひろ Ruby / メール / 文字化け https://twitter.com/tmtms https://tmtms.hatenablog.com https://zenn.dev/tmtms 2

Slide 3

Slide 3 text

MySQL Parameters MySQL Parameters MySQLのバージョン間の差分を見れる https://mysql-params.tmtms.net 3

Slide 4

Slide 4 text

mysqld のコマンドラインパラメータの値 mysql のコマンドラインパラメータの値 サーバー変数の値 ステータスの値 Character set 名 Collation 名 権限名 関数名 information_schema のテーブル名とカラム名 performance_schema のテーブル名とカラム名 エラーメッセージ 4

Slide 5

Slide 5 text

「MySQL Parameters の裏側」 「MySQL Parameters の裏側」 5

Slide 6

Slide 6 text

裏側は無い 裏側は無い 6

Slide 7

Slide 7 text

Vue.js の勉強で作り始めた Vue.js の勉強で作り始めた とみたまさひろ @tmtms Vue.jsの練習にMySQLのパラメータを表示するページを作 ってみた。バージョン間の比較もできる。とりあえず手元に あったバージョンだけ。 / “MySQL Parameters” htn.to/fJxJikZ4zru 2:16 AM · Feb 22, 2018 5 See とみたまさひろ ’s other Tweets 7

Slide 8

Slide 8 text

Vue.js Vue.js Vue.js(ヴュージェイエス)またはVueは、Webアプリ ケーションにおけるユーザーインターフェイスを構築す るための、オープンソースのJavaScriptフレームワーク である。他のJavaScriptライブラリを使用するプロジェ クトへの導入において、容易になるように設計されてい る。一方で高機能なシングルページアプリケーション (SPA)を構築することも可能である。 https://ja.wikipedia.org/wiki/Vue.js 8

Slide 9

Slide 9 text

全部 JavaScript で処理 全部 JavaScript で処理 9

Slide 10

Slide 10 text

フロントエンドのみ フロントエンドのみ 10

Slide 11

Slide 11 text

裏側(バックエンド)は無い 裏側(バックエンド)は無い 11

Slide 12

Slide 12 text

裏側はないけど前処理はある 裏側はないけど前処理はある 12

Slide 13

Slide 13 text

仕組み 仕組み 13

Slide 14

Slide 14 text

データは JSON データは JSON バージョン情報 { "8.0.22": "json/8.0.22.json", "8.0.21": "json/8.0.21.json", "8.0.20": "json/8.0.20.json", ... } https://mysql-params.tmtms.net/mysqld/json/version.json 14

Slide 15

Slide 15 text

mysqld の 8.0.22 のパラメータと値 { "abort-slave-event-count": "0", "activate-all-roles-on-login": "FALSE", "admin-address": "(No default value)", ... } https://mysql-params.tmtms.net/mysqld/json/8.0.22.json 15

Slide 16

Slide 16 text

メニューからバージョンが選択されたときに JSON を取得して JavaScript でテーブルを作成 差分表示も JavaScript で JSON の差分を確認 16

Slide 17

Slide 17 text

サーバーサイドは静的コンテンツだけなので GitHub Pages でホスティング 17

Slide 18

Slide 18 text

メニューからバージョンを選択したときに URL を変更 ↓↑ URL を変更したときにバージョンの選択状態を変更 自前で history.pushState とかでやってるけど Vue のルーティングを使うとも っと簡単にできそうな気がする 18

Slide 19

Slide 19 text

データの作り方 データの作り方 19

Slide 20

Slide 20 text

Linux Generic 64bit バイナリを使用 mysql-8.0.22-linux-glibc2.12-x86_64.tar.xz インストール先は /usr/local/mysql に統一 ホスト名は hostname に統一 ちゃんと初期設定しないとちゃんと表示できない scripts/mysql_install_db --no-defaults bin/mysqld --initialize 20

Slide 21

Slide 21 text

mysqld --help -v Variables (--variable-name=value) and boolean options {FALSE|TRUE} Value (after re ------------------------------------------------------------ ------------- abort-slave-event-count 0 activate-all-roles-on-login FALSE admin-address (No default val admin-port 33062 admin-ssl TRUE admin-ssl-ca (No default val admin-ssl-capath (No default val admin-ssl-cert (No default val admin-ssl-cipher (No default val admin-ssl-crl (No default val admin-ssl-crlpath (No default val ... 21

Slide 22

Slide 22 text

mysqld --help -v と show variables は異なるので それぞれ出力 22

Slide 23

Slide 23 text

権限の取得 権限の取得 xxxx_priv から xxxx を取得 DESC mysql.user; Field Type Null Key Default Extra Host char(255) NO PRI User char(32) NO PRI Select_priv enum('N','Y') NO N Insert_priv enum('N','Y') NO N Update_priv enum('N','Y') NO N Delete_priv enum('N','Y') NO N Create_priv enum('N','Y') NO N Drop_priv enum('N','Y') NO N Reload_priv enum('N','Y') NO N ... 23

Slide 24

Slide 24 text

結果は見てなくて PROXY 権の有無を確認してるだけ DESC mysql.proxies_priv; Field Type Null Key Default Extra Host char(255) NO PRI User char(32) NO PRI Proxied_host char(255) NO PRI Proxied_user char(32) NO PRI With_grant tinyint(1) NO 0 Grantor varchar(288) NO MUL 24

Slide 25

Slide 25 text

8.0 なら DESC mysql.user の代わりにこれだけでいい CREATE USER test IDENTIFIED BY "xxxxxx"; GRANT ALL ON *.* TO test WITH GRANT OPTION; SHOW GRANTS FOR test; 25

Slide 26

Slide 26 text

SHOW GRANTS の違い SHOW GRANTS の違い 5.7 8.0 GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT O GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROC ESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORA RY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CR EATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, T RIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `test`@`%` WIT H GRANT OPTION GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BIN LOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GRO UP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIS T_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_ GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSIO N_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_AD MIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `test`@`%` WITH GRAN T OPTION 26

Slide 27

Slide 27 text

関数 関数 最初は help functions から mysql> help functions You asked for help about help category: "Functions" For more information, type 'help ', where is one of the follo wing categories: Aggregate Functions and Modifiers Bit Functions Cast Functions and Operators Comparison Operators Control Flow Functions Date and Time Functions ... mysql> help Aggregate Functions and Modifiers You asked for help about help category: "Aggregate Functions and Modifier s" For more information, type 'help ', where is one of the follo wing topics: AVG BIT_AND BIT_OR BIT_XOR ... 27

Slide 28

Slide 28 text

今は mysql.help_category & mysql.help_topic から mysql> select help_category_id,name,parent_category_id from mysql.help_cat egory; +------------------+---------------------------------+-------------------- + | help_category_id | name | parent_category_id | +------------------+---------------------------------+-------------------- + | 0 | Contents | 0 | | 1 | Help Metadata | 0 | | 2 | Data Types | 0 | | 3 | Administration | 0 | | 4 | Functions | 0 | ... mysql> select help_topic_id,name,help_category_id from mysql.help_topic; +---------------+----------------------------+------------------+ | help_topic_id | name | help_category_id | +---------------+----------------------------+------------------+ | 0 | HELP_DATE | 1 | | 1 | HELP_VERSION | 1 | | 2 | AUTO_INCREMENT | 2 | | 3 | HELP COMMAND | 3 | 28

Slide 29

Slide 29 text

関数っぽいカテゴリからトピックの名前を抽出 バージョンごとにカテゴリが変わったりする select t.name from mysql.help_topic t join mysql.help_category c using (help_category_i d) where c.name rlike "functions|operators|geometry (c onstructors|relations)|properties|mbr|wkt|wkb|xml|gti d" and c.name != "user-defined functions" and t.name not rlike "definition" 29

Slide 30

Slide 30 text

エラーメッセージ エラーメッセージ /usr/local/mysql/include/mysqld_error.h から エラー番号を取得 //#define OBSOLETE_ER_HASHCHK 1000 //#define OBSOLETE_ER_NISAMCHK 1001 #define ER_NO 1002 #define ER_YES 1003 #define ER_CANT_CREATE_FILE 1004 #define ER_CANT_CREATE_TABLE 1005 #define ER_CANT_CREATE_DB 1006 #define ER_DB_CREATE_EXISTS 1007 #define ER_DB_DROP_EXISTS 1008 //#define OBSOLETE_ER_DB_DROP_DELETE 1009 #define ER_DB_DROP_RMDIR 1010 //#define OBSOLETE_ER_CANT_DELETE_FILE 1011 30

Slide 31

Slide 31 text

エラー番号で perror コマンドを実行 % perror 1002 MySQL error code MY-001002 (ER_NO): NO % perror 1003 MySQL error code MY-001003 (ER_YES): YES % perror 1004 MySQL error code MY-001004 (ER_CANT_CREATE_FILE): Ca n't create file '%-.200s' (errno: %d - %s) % perror 1005 MySQL error code MY-001005 (ER_CANT_CREATE_TABLE): Ca n't create table '%-.200s' (errno: %d - %s) % perror 1006 MySQL error code MY-001006 (ER_CANT_CREATE_DB): Can't create database '%-.192s' (errno: %d - %s) 31

Slide 32

Slide 32 text

だいたいこんな感じで3ヶ月毎に処理してます テキトーに作り始めてかなりごちゃごちゃしてるんで Vuetify.js とかで作り直したい 32

Slide 33

Slide 33 text

おわり おわり 33