$30 off During Our Annual Pro Sale. View Details »

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

yoku0825
PRO
November 24, 2022

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

2022/11/16 db tech showcase 2022

yoku0825
PRO

November 24, 2022
Tweet

More Decks by yoku0825

Other Decks in Technology

Transcript

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

    View Slide

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

    1/94

    View Slide

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

    View Slide

  4. 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

    View Slide

  5. 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

    View Slide

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

    View Slide

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

    View Slide

  8. 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

    View Slide

  9. 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

    View Slide

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

    View Slide

  11. 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

    View Slide

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

    View Slide

  13. 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

    View Slide

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

    View Slide

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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

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

    View Slide

  19. 18/94

    View Slide

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

    View Slide

  21. 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

    View Slide

  22. 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

    View Slide

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

    View Slide

  24. 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

    View Slide

  25. 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

    View Slide

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

    View Slide

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

    View Slide

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

    27/94

    View Slide

  29. \こんにちわ/
    yoku0825@とある企業のDBA
    オラクれない

    ポスグれない

    マイエスキューエる

    生息域
    Twitter: @yoku0825

    Blog: 日々の覚書

    日本MySQLユーザ会

    MySQL Casual

    28/94

    View Slide

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

    View Slide

  31. まず
    30/94

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. SH2先生愛してる
    34/94

    View Slide

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

    View Slide

  37. だが
    36/94

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  47. MySQL 4.0と言えば
    varcharに文字コードという概念がない
    varcharのカラムにEUCとUTF-8とSJISの文字列が全部突っ込めちゃう()

    つまり実質varbinary

    timestamp型に突っ込んだ時刻が “YYYYMMDDHHNNSS” の14桁の数字で返って
    くる()
    何を言っているかわからねーと思うが(略)

    46/94

    View Slide

  48. こんなです
    47/94

    View Slide

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

    48/94

    View Slide

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

    View Slide

  51. 閑話休題
    50/94

    View Slide

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

    51/94

    View Slide

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

    View Slide

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

    53/94

    View Slide

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

    View Slide

  56. \(^o^)/
    55/94

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  62. DELETEしてFLUSH PRIVILEGESすると
    62/94

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  77. ここまでしても本番のダンプを入れようとすると入らない…
    $ 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

    View Slide

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

    View Slide

  79. 2022年のMySQLerが20年前のMySQL 4.0に触ると
    知らないことは案外いっぱいある…
    ブログを書いてくれる先人は偉大
    解決策まで書いてくれるkazeburoさんはとても偉大

    そのブログを維持してくれるサービスも偉大
    79/94

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  87. ところで気が付いたでしょうか?
    $ 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

    View Slide

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

    View Slide

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

    View Slide

  90. 当然こうなる
    90/94

    View Slide

  91. 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

    View Slide

  92. まとめ
    92/94

    View Slide

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

    View Slide

  94. Any Questions
    and/or
    Suggestions?
    94/94

    View Slide