Slide 1

Slide 1 text

2022年のMySQLerが20年前のMySQL 4.0に触 ると何が起きるか MySQL 4.0.30 (12 February 2007) 2022/11/16 日本MySQLユーザ会 yoku0825 db tech showcase 2022

Slide 2

Slide 2 text

おことわり MySQL 8.0の話題は思ったより出てきません 基本的にMySQL 4.0の話なので生活の役には立たないと思います ユーザー事例です() 当日のTwitterタイムラインをまとめていただきました dbts2022「2022年のMySQLerが20年前のMySQL 4.0に触ると何が起きるか」のセッション に関するツイートのまとめ \- Togetter ‐ 1/94

Slide 3

Slide 3 text

MySQL 4.0がやってきた! 2/94

Slide 4

Slide 4 text

2003年がどれくらい昔か Oracle Database 10g Release 1 PostgreSQL 7.4 SQL Server 2000 https://ja.wikipedia.org/wiki/ 2003%E5%B9%B4%E3%81%AE%E6%97%A5%E6%9C%AC 3/94

Slide 5

Slide 5 text

What is new in MySQL 4.0 • MySQL 4.0 implemented a query cache that can give a major speed boost to applications w ith repetitive queries. See Section 7.5.3, “The MySQL Query Cache”. 4/94

Slide 6

Slide 6 text

_人人人人人人人人人人人_ > クエリーキャッシュ <  ̄Y^Y^Y^Y^Y^Y^Y^ ̄ 5/94

Slide 7

Slide 7 text

What Is New in MySQL 8.0 The query cache was removed. 6/94

Slide 8

Slide 8 text

What is new in MySQL 4.0 • MySQL 4.0 further increased the speed of MySQL Server in a number of areas, such as bu lk INSERT statements, searching on packed indexes, full-text searching (using FULLTEXT in dexes), and COUNT(DISTINCT) 7/94

Slide 9

Slide 9 text

What is new in MySQL 4.0 • InnoDB storage engine as standard • The InnoDB storage engine began to be offered as a standard feature of the MySQL serv er. This provided full support for ACID transactions, foreign keys with cascading UPDAT E and DELETE, and row-level locking as standard features. See Section 13.2, “The InnoD B Storage Engine” 8/94

Slide 10

Slide 10 text

What is new in MySQL 4.0 MySQL Server added support for the UNION statement, a standard SQL feature. 9/94

Slide 11

Slide 11 text

What is new in MySQL 4.0 Starting with version 4.0, MySQL runs natively on Novell NetWare 6.0 and higher. See Sec tion 2.7, “Installing MySQL on NetWare” 10/94

Slide 12

Slide 12 text

_人人人人人_ > NetWare <  ̄Y^Y^Y^ ̄ 11/94

Slide 13

Slide 13 text

What is new in MySQL 4.0 Features to simplify migration from other database systems to MySQL Server include TRUN CATE TABLE (as in Oracle) and identity as a synonym for automatically incremented keys (a s in Sybase). 12/94

Slide 14

Slide 14 text

_人人人人人人人_ > Identity!? <  ̄Y^Y^Y^Y^ ̄ 13/94

Slide 15

Slide 15 text

MySQL 8.0にもまだあった… https://dev.mysql.com/doc/refman/8.0/en/server-system- variables.html#sysvar_identity 14/94

Slide 16

Slide 16 text

What is new in MySQL 4.0 German-speaking users should note that MySQL 4.0 added support for a new character set, l atin1_de, which ensures that words with umlauts are sorted in the same order as in Germ an telephone books. 15/94

Slide 17

Slide 17 text

What is new in MySQL 4.0 As of version 4.0, most mysqld parameters (startup options) can be set without taking do wn the server. This is a convenient feature for database administrators. See Section 12. 4.4, “SET Syntax”. 16/94

Slide 18

Slide 18 text

What is new in MySQL 4.0 Multiple-table DELETE and UPDATE statements were added. 17/94

Slide 19

Slide 19 text

18/94

Slide 20

Slide 20 text

MySQL 8.0でも健在 https://dev.mysql.com/doc/refman/8.0/en/delete.html 19/94

Slide 21

Slide 21 text

What is new in MySQL 4.0 On Windows, symbolic link handling at the database level was enabled by default. On Uni x, the MyISAM storage engine added support for symbolic linking at the table level (and n ot just the database level as before). 20/94

Slide 22

Slide 22 text

What is new in MySQL 4.0 • The addition of the SQL_CALC_FOUND_ROWS and FOUND_ROWS() [815] functions made it poss ible to find out the number of rows a SELECT query that includes a LIMIT clause would ha ve returned without that clause. 21/94

Slide 23

Slide 23 text

_人人人人人人人人人_ >SQL_CALC_FOUND_ROWS<  ̄Y^Y^Y^Y^Y^ ̄ 22/94

Slide 24

Slide 24 text

What is new in MySQL 8.0 The SQL_CALC_FOUND_ROWS query modifier and accompanying FOUND_ROWS() function are depre cated. See the FOUND_ROWS() description for information about an alternative strategy. 23/94

Slide 25

Slide 25 text

What is new in MySQL 4.0 The embedded server library added in this release can easily be used to create standalo ne and embedded applications. The embedded server provides an alternative to using MySQ L in a client/server environment. 24/94

Slide 26

Slide 26 text

_人人人人人人_ > libmysqld <  ̄Y^Y^Y^Y^ ̄ 25/94

Slide 27

Slide 27 text

What is new in MySQL 8.0 The libmysqld embedded server library is removed, 26/94

Slide 28

Slide 28 text

もしかして MySQL 8.0は4.0時代に実装された過去の負債を返却しているところなのであろう か… ま、15年くらい前のですしね… ‐ 27/94

Slide 29

Slide 29 text

\こんにちわ/ yoku0825@とある企業のDBA オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter: @yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会 ‐ MySQL Casual ‐ 28/94

Slide 30

Slide 30 text

2022年のMySQLerが 20年前のMySQL 4.0 に触ると何が起きるか 29/94

Slide 31

Slide 31 text

まず 30/94

Slide 32

Slide 32 text

mysqldが手に 入らない() 31/94

Slide 33

Slide 33 text

mysqldが手に入らない() https://downloads.mysql.com/archives/community/ 32/94

Slide 34

Slide 34 text

MySQL Archives(非公式) https://dbstudy.info/mysqlarchives/ 33/94

Slide 35

Slide 35 text

SH2先生愛してる 34/94

Slide 36

Slide 36 text

ちなみにソースコードはGitHubからもダウンロードできる() https://github.com/mysql/mysql-server/releases/tag/mysql-4.0.30 35/94

Slide 37

Slide 37 text

だが 36/94

Slide 38

Slide 38 text

コンパイルできない() 37/94

Slide 39

Slide 39 text

SH2先生のところからもらってきたrpmファイルで入れると動く… 38/94

Slide 40

Slide 40 text

(これを「動く」と 呼んで良いのかどう かはわからない) 39/94

Slide 41

Slide 41 text

むしろCentOS 6.xまでコンパイルできていたことがすごいのかも知れない http://web.archive.org/web/20101106013039/http://www.mysql.com/ support/supportedplatforms/database.html 40/94

Slide 42

Slide 42 text

2022年のMySQLerが20年前のMySQL 4.0に触ると その環境で動くことだけで実はありがたいことなのかもしれない MySQL 5.0から先はArchiveにも残っているというのに… 41/94

Slide 43

Slide 43 text

さて、こんな古の環境と は一刻も早くオサラバし たいのでマイグレーショ ンを計画する 42/94

Slide 44

Slide 44 text

マイグレーション計画 43/94

Slide 45

Slide 45 text

マイグレーション計画 44/94

Slide 46

Slide 46 text

マイグレーション計画 45/94

Slide 47

Slide 47 text

MySQL 4.0と言えば varcharに文字コードという概念がない varcharのカラムにEUCとUTF-8とSJISの文字列が全部突っ込めちゃう() ‐ つまり実質varbinary ‐ timestamp型に突っ込んだ時刻が “YYYYMMDDHHNNSS” の14桁の数字で返って くる() 何を言っているかわからねーと思うが(略) ‐ 46/94

Slide 48

Slide 48 text

こんなです 47/94

Slide 49

Slide 49 text

2022年のMySQLerが20年前のMySQL 4.0に触ると 「 sql_mode = STRICT_TRANS_TABLES にしていないと絵文字とその後ろが切れ る!」なんてかわいい方 プロトコルより上位のレベルで戻ってくるモノが変わったのってこのタイムスタン プくらいしか知らない mysql コマンドラインクライアントの --binary-as-hex くらいか…? ‐ 48/94

Slide 50

Slide 50 text

mysqlコマンドラインクライアントの --binary-as-hex も大概だと思う 49/94

Slide 51

Slide 51 text

閑話休題 50/94

Slide 52

Slide 52 text

というわけでvarcharと timestampの在り処だ けは突き止めておかない と 51/94

Slide 53

Slide 53 text

information_schemaが無い() performance_schmea は5.5から(実用は5.6から)、 information_schema は5.0の 途 中 から、 sys は5.7から… しかも test スキーマあるしな…懐かしい 52/94

Slide 54

Slide 54 text

2022年のMySQLerが20年前のMySQL 4.0に触ると SHOW DATABASES のシンプルさに二度見する そのあと、いつも information_schema で一覧していた情報を泥臭くスクリプトで 引っこ抜かなければならないことに気が付いて面倒になる… いろんなものがSQLで情報取れるのは良いこと… ‐ 53/94

Slide 55

Slide 55 text

さてじゃあまずはログイン用のアカウントを… 54/94

Slide 56

Slide 56 text

\(^o^)/ 55/94

Slide 57

Slide 57 text

2022年のMySQLerが20年前のMySQL 4.0に触ると 「MySQLのユーザーはGRANTで作った」 「いや俺も5.6まではそうしてたけど、むしろ前からCREATE USERで作っておけ ば良かったのに」 「CREATE USERがないバージョンのMySQLがあった」 「マ!?」 56/94

Slide 58

Slide 58 text

GRANT USAGEで作ってGRANT SELECTを… 57/94

Slide 59

Slide 59 text

匿名アカウント… ホスト名が先行評価されるので、localhostからの接続は優先的に ''@localhost に吸い 込まれる罠… しかもSHOW GRANTSは無い 59/94

Slide 60

Slide 60 text

HELPステートメントも無かった 60/94

Slide 61

Slide 61 text

DROP USERも無いじゃん… 61/94

Slide 62

Slide 62 text

DELETEしてFLUSH PRIVILEGESすると 62/94

Slide 63

Slide 63 text

ようやく作ったアカウントでログインできるようになる… 63/94

Slide 64

Slide 64 text

さてじゃあ作業用サーバーからさっきのアカウントでログイン… 5.6のmysqlコマンドラインクライアントは --secure-auth=0 にすれば繋がるけど むしろ5.6(2013年GA, 4.0から10年間)互換性を保っていたことに感謝すべきか 64/94

Slide 65

Slide 65 text

2022年のMySQLerが20年前のMySQL 4.0に触ると これは10年前に通った罠……をもう一度踏みなおせる() 無いステートメントが思ったより多くてびっくり… これだけ時間が経っていると(普段、1つ2つバージョンを跨ぐくらいじゃ caching_sha2_password以外では 意識しない)プロトコル非互換の洗礼を食らう 65/94

Slide 66

Slide 66 text

mysqldump –help --first-slave なんて初めて聞いたと思ったら -x ということは今の --lock-all- tables と一緒? 66/94

Slide 67

Slide 67 text

mysqldump –help どうやら4.0までは本名(?)が --first-slave, 5.0で --lock-all-tables に変わって5.5 で後方互換性を打ち切られたらしい… 67/94

Slide 68

Slide 68 text

mysqldump –master-data まだこの時代では1とか2とか指定できずにON, OFFの2択みたい 68/94

Slide 69

Slide 69 text

mysqldump –master-data This automatically enables --first-slave. ( ゚д゚) 69/94

Slide 70

Slide 70 text

mysqldump –master-data どうやらマジらしい 70/94

Slide 71

Slide 71 text

先人の偉大な知恵 レプリケーション作成を簡単にする mysql40dump という mysqldump の wrapper を作った話 - blog.nomadscafe.jp 71/94

Slide 72

Slide 72 text

これでmysqldumpは無事に取れた… 72/94

Slide 73

Slide 73 text

そのまま5.0にぶっこむとやはり絵文字は壊れる… timestampは “YYYYMMDDhhmmss” の14桁整数でも文句言わない、これはMySQL 8.0でも一緒。 73/94

Slide 74

Slide 74 text

そういえば5.0も(というか5.7まで)デフォルトはlatin1だった… 74/94

Slide 75

Slide 75 text

ダンプファイルを手で編集するも、utf8mb4はMySQL 5.5から 75/94

Slide 76

Slide 76 text

回避策() 4.0が実質varbinaryなんだから5.0でvarbinaryで突っ込んじゃえば良いじゃん事案 76/94

Slide 77

Slide 77 text

ここまでしても本番のダンプを入れようとすると入らない… $ mysql50 < 20221102_yoku0825_schema.sql Warning: /usr/mysql/5.0.96/bin/mysql: unknown variable 'loose-binary-as-hex=0' ERROR 1005 (HY000) at line 102: Can't create table './d1/t22.frm' (errno: 150) $ perror 150 MySQL error code MY-000150 (handler): Foreign key constraint is incorrectly formed 77/94

Slide 78

Slide 78 text

先人の偉大な知恵 レプリケーション作成を簡単にする mysql40dump という mysqldump の wrapper を作った話 - blog.nomadscafe.jp 78/94

Slide 79

Slide 79 text

2022年のMySQLerが20年前のMySQL 4.0に触ると 知らないことは案外いっぱいある… ブログを書いてくれる先人は偉大 解決策まで書いてくれるkazeburoさんはとても偉大 ‐ そのブログを維持してくれるサービスも偉大 79/94

Slide 80

Slide 80 text

ちなみにこの時代、プロセスが 生きてるのに間違えてまた mysqldを起動しようとすると ソケットファイルが消える() 80/94

Slide 81

Slide 81 text

何が悪くてCHANGE MASTER TOできないのかを教えてくれないのは健在 81/94

Slide 82

Slide 82 text

この頃はまだ SLAVE STOP (Not STOP SLAVE )も使えた 82/94

Slide 83

Slide 83 text

SHOW SLAVE STATUSのサッパリした感 Seconds_Behind_Source なんてものは無い 83/94

Slide 84

Slide 84 text

レプリケーションをエラーにすればちゃんと表示はされる 3.23が確か何も表示してくれなくてエラーログにしか出さなかった記憶… 84/94

Slide 85

Slide 85 text

2022年のMySQLerが20年前のMySQL 4.0に触ると レプリケーションは案外今と同じ構文で動く binlog_format の導入は5.1なので全部ステートメントベースだけど、「これをし たら壊れる」的なのも現代とほぼ一緒 RESET SLAVE ALL がまだ無いので、昇格させた後にも SHOW SLAVE STATUS の出力が 残っちゃうけどこれは知ってた 85/94

Slide 86

Slide 86 text

無事に4.0から5.0へのレプリケーションも成功 86/94

Slide 87

Slide 87 text

ところで気が付いたでしょうか? $ mysql50 < 20221102_yoku0825_schema.sql Warning: /usr/mysql/5.0.96/bin/mysql: unknown variable 'loose-binary-as-hex=0' ERROR 1005 (HY000) at line 102: Can't create table './d1/t22.frm' (errno: 150) $ perror 150 MySQL error code MY-000150 (handler): Foreign key constraint is incorrectly formed 87/94

Slide 88

Slide 88 text

4.0のInnoDBはMyISAMよりゴツい 88/94

Slide 89

Slide 89 text

何故ならば innodb_file_per_table はMySQL 4.1から… 89/94

Slide 90

Slide 90 text

当然こうなる 90/94

Slide 91

Slide 91 text

2022年のMySQLerが20年前のMySQL 4.0に触ると MySQL 4.0のInnoDBはMyISAMよりタチが悪い側面がある… 「MyISAM、ぐわあ」は今まで何度もあったけど、「InnoDB、ぐわあ」は初めて遭遇した ‐ Fast Index CreationもOnline ALTER TABLEも、pt-online-schema-changeも使 えないとInnoDBはなかなか運用がつらい 91/94

Slide 92

Slide 92 text

まとめ 92/94

Slide 93

Slide 93 text

まとめ MySQL 8.0で消えゆく機能が追加された時代のMySQL 4.0 RDBMSでも20年熟成させるといろんな壁にぶち当たる 過去の知識は意外と10年経っても思い出せる 過去(=現在はいつか過去になります)の知見をブログに残してくれる人は最高 レプリケーションはやはりよく枯れている… 93/94

Slide 94

Slide 94 text

Any Questions and/or Suggestions? 94/94