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

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

yoku0825
November 24, 2022

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

2022/11/16 db tech showcase 2022

yoku0825

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

    \- Togetter ‐ 1/94
  3. MySQL 4.0がやってきた! 2/94

  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
  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
  6. _人人人人人人人人人人人_ > クエリーキャッシュ <  ̄Y^Y^Y^Y^Y^Y^Y^ ̄ 5/94

  7. What Is New in MySQL 8.0 The query cache was

    removed. 6/94
  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
  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
  10. What is new in MySQL 4.0 MySQL Server added support

    for the UNION statement, a standard SQL feature. 9/94
  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
  12. _人人人人人_ > NetWare <  ̄Y^Y^Y^ ̄ 11/94

  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
  14. _人人人人人人人_ > Identity!? <  ̄Y^Y^Y^Y^ ̄ 13/94

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

  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
  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
  18. What is new in MySQL 4.0 Multiple-table DELETE and UPDATE

    statements were added. 17/94
  19. 18/94

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

  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
  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
  23. _人人人人人人人人人_ >SQL_CALC_FOUND_ROWS<  ̄Y^Y^Y^Y^Y^ ̄ 22/94

  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
  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
  26. _人人人人人人_ > libmysqld <  ̄Y^Y^Y^Y^ ̄ 25/94

  27. What is new in MySQL 8.0 The libmysqld embedded server

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

  29. \こんにちわ/ yoku0825@とある企業のDBA オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter:

    @yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会 ‐ MySQL Casual ‐ 28/94
  30. 2022年のMySQLerが 20年前のMySQL 4.0 に触ると何が起きるか 29/94

  31. まず 30/94

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

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

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

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

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

  37. だが 36/94

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

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

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

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

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

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

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

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

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

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

    くる() 何を言っているかわからねーと思うが(略) ‐ 46/94
  48. こんなです 47/94

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

    mysql コマンドラインクライアントの --binary-as-hex くらいか…? ‐ 48/94
  50. mysqlコマンドラインクライアントの --binary-as-hex も大概だと思う 49/94

  51. 閑話休題 50/94

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

  53. information_schemaが無い() performance_schmea は5.5から(実用は5.6から)、 information_schema は5.0の 途 中 から、 sys は5.7から…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    SHOW SLAVE STATUS の出力が 残っちゃうけどこれは知ってた 85/94
  86. 無事に4.0から5.0へのレプリケーションも成功 86/94

  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
  88. 4.0のInnoDBはMyISAMよりゴツい 88/94

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

  90. 当然こうなる 90/94

  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
  92. まとめ 92/94

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

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