mita2 database life

主にMySQLに関するメモです

TiDB metadata lock 有効な場合の DDL の挙動

TiDB の DDL の挙動を確認した。 まとめ tidb_enable_metadata_lock が有効だと、DDLは先行のトランザクションによって待たされることがある metadata lock 待ちが発生していても、(MySQL と違って) DMLは影響を受けない metadata lock の状況は mysql.tidb_…

Aurora の wait_timeout の挙動が MySQL と違った

TL;DR MySQL は wait_timeout に設定した値ぴったりに、接続が切られる Aurora は wait_timeout の値 + 最大1分 に、接続が切られる エラーメッセージも違う wait_timeout とは wait_timeout はアイドルセッションに対するタイムアウトを指定するパラメータ…

MySQL Shell dumpInstance の分割ロジック その2

この記事は MySQL Advent Calendar 2023 の23日目の記事です。 MySQL Shell の dumpInstance の chunk ロジックの説明エントリーその2です。 前回の記事では、主キーが数値型以外のケースを説明しました。主キーが数値型以外では、LIMIT句を利用して線形に…

MySQL Shell dumpInstance の分割ロジック その1

この記事は MySQL Advent Calendar 2023 の21日目の記事です。 dumpInstance dumpInstance は論理バックアップを取得する mysqlsh のコマンドです。 テーブルを分割し、並列でSELECTし、高速にバックアップしてくれます。 このように、1つのテーブルが複数…

MySQL Shell 8.0.34 を CentOS7 でビルドする

MySQL Shell のソースコードを CentOS 7 でビルドするのはいろいろ面倒で、以前も記事を書きました。 いつのまにか依存関係が変わったようで、以前の手順ではビルドできなくなってました。 どんどん難易度が上がってく。。。 MySQL Server をビルドする MySQ…

MySQL のデータを BigQuery にサクっとインポートした

MySQL のデータを BigQuery にサクっとインポートしたメモ。 Big Query がサポートしている形式 Arvo ORC CSV Parquet JSON Arvo/ORC/Parquet は MySQL からそれぞれのデータ形式に簡単に変換する方法が見つからなかった。 CSVはカンマや改行などの特殊記号…

Aurora v2 に Upgrade Checker Utility を実行してみた

Aurora MySQL v2 (MySQL 5.7 互換) の EOL が 2024/10/31 ということで、そろそろソワソワし始めている方も多いのではないでしょうか。 Upgrade Checker Utility MySQL Shell には、MySQL 5.7 から 8.0 へアップグレードする際に問題になりそうな点を洗い出…

Aurora MySQL と MySQL Community Edition の performance_schema instruments 差分

メモです。performance_schema.setup_instruments テーブルの比較 MySQL Community Edition (v5.7.38) にしかない instruments $ diff setup_instruments_aurora.log setup_instruments_community.log | grep '^>' > wait/synch/mutex/sql/LOCK_slave_trans_…

最近の MySQL の Internal Temporary Table ステータスとチューニング観点まとめ (version 8.0.28 版)

以下のエントリーでは、最近の MySQL の Internal Temporary Table の動作についてまとめました。 mita2db.hateblo.jp 条件によっては、領域が ディスク上に確保される場合があり、その場合はパフォーマンスに影響がある可能性があります。 今回はMySQLのス…

MySQLのスロークエリログにはエラーになったクエリが含まれる?

以前、エラーになったクエリがスロークエリログに落ちるかどうか試しました。 mita2db.hateblo.jp このときは文法エラーも含め、エラー時もスロークエリログに記録されてましたが、MySQL 8.0.29, MySQL 5.7.38 で文法エラーは除外するよう挙動が変更されたよ…

最近の MySQL の Internal Temporary Table 動作まとめ (version 8.0.28 版)

8.0 のGA以降、Internal Temporary Table まわりは改良が重ねられきました・・・ ネットの記事では既に古い内容になってしまっているものもあり、改めて最新の挙動を確認して整理してみました*1。 なお、MySQL 8.0 の Internal Temporary Table の動作は @ke…

MySQL アメリカのサマータイムが恒久化されたらやることになる作業

サマータイムが終わらない? アメリカでサマータイムを恒久化する動きがあるようです。 どれぐらい現実化する可能性があるのかわかりませんが、仮に、決定された場合、どのような作業が必要になるのか調べておきます。 下院を通過してバイデン大統領が署名す…

MySQL collation_server を変えたつもりが変わってなかった話

character_set_server と collation_server これらのパラメータは、データベースを作成する際に、何もキャラクタセットや照合順序を明示的に指定しなかった場合に、採用されるキャラクタセット・照合順序です (ちなみにテーブル作成時に何も指定しなかった…

MySQL 8.0.28 で performance_schema に CPU_TIME が入った

MySQL 8.0.28 から performance_schema に CPU_TIME を記録できるようになりました。 これまでも実行時間は performance_schema から確認できていました。ただ、実行時間が長いだけでは、そのクエリが必ずしもCPUに負荷をかけているクエリとは言いきれません…

MySQL Illegal mix of collations エラーが出る・出ないまとめ

Illegal mix of collations Illegal mix of collations エラーは 異なる照合順序で結合や比較を行った場合に発生するエラーです。 mysql> SELECT CONCAT(_utf8mb4 'A' COLLATE utf8mb4_bin, _utf8mb4 'B' COLLATE utf8mb4_unicode_ci); ERROR 1267 (HY000): …

MySQL Shell のパラレルテーブルインポートの実装がスマートだった件

MySQL Shell のパラレルテーブルインポートの実装が興味深かった MySQL Shell のパラレルテーブルインポート MySQL Shell 8.0.17 で導入された MySQL Shell パラレルテーブルインポートユーティリティ util.importTable() は、大規模なデータファイルの MySQ…

MySQL mysql コマンドからシェルを呼び出せなくする小技

mysql コマンドでは ! や system によって、シェルを呼び出すことができます。 mysql> \! uname Linux mysql> system uname Linux 実装はシンプルで、標準ライブラリの system 関数が利用されています。 static int com_shell(String *buffer MY_ATTRIBUTE((…

MySQL 8.0 で謎のEXPLAIN結果が出なくなってた

時々、頭の中でMySQLの気持ちになって考えた実行計画と違うものが出力されるときがあるんですよね。 まぁ、実用上、問題になることはなかったので、「MySQL ヨクワカランなー」と思って、スルーしてました。 ところが、最近、MySQL 8.0 をいじってたら、イメ…

MySQL The client was disconnected by the server because of inactivity の対処方法

3ヶ月ブログをサボっておりました。。。リハビリがてらのエントリー。 The client was disconnected by the server because of inactivity エラー MySQL 8.0.24 からタイムアウト(wait_timeout / interactive_timeout)時のエラーメッセージがに変更になり…

MySQL Orchestrator RecoveryPeriodBlockSeconds と FailureDetectionPeriodBlockMinutes の違い

Orchestrator orchestrator は マスターの障害検知およびレプリカのマスター昇格(フェイルオーバー)を自動で行うソフトウェアです。 MySQLのマスター昇格といえば、MHAがデファクトスタンダードでしたが、MHAはメンテナンスモードになって久しい・・・とい…

MySQL 論理削除に関する個人的見解まとめ

技術顧問や講演の場で、論理削除について見解を聞かれる場面がよくあります。アプリケーション開発者の方にとって、身近なデータベースの疑問なんでしょうね。 しっかり言語化できてなかったので、ブログに書いておきます。 論理削除をどう考えるかは、諸派…

MySQL GISのSRID 0(直行座標)を理解する

MySQLで20年ほど遊んでいますが・・・知らないことも、まだまだあります。 GIS(Geographic Information System、地理・空間情報) はそのうちの1つです。ということで、ほとんど触れたことのない、GISを入門してみます。 なお、このエントリーは MySQL 8.0 …

MySQL 1レコード 8000バイトの壁を確認するSQL ROW_FORMAT=DYNAMIC 編

InnoDBのレコード長の限界 InnoDBのデフォルトのページサイズは、16Kです。この場合、最大レコード長は約8000バイトです。マニュアルで「約8000バイト」と曖昧な言い回しになっているのは、データの保存に使える領域以外にメタデータを保存する領域が必要だ…

MySQL Index dive の動きを観測してみた

Index dive とは range スキャンの場合に、オプティマイザーがその範囲に含まれる行数を正確に見積もるための仕組みです。 インデックスダイブは特に値の分布が偏っているデータに対して、効果を発揮します。 eq_range_index_dive_limit パラメータ インデッ…

MySQL バイナリログをマスキングするツールを作ってみた

このエントリーは MySQL Advent Calendar 2020 の 12/20 のエントリーです。 問題を再現させるためにバイナリログが必要 MySQL は OSS です。誰でも無料で自由に使うことができます。 一方、Oracle や Percona といったデータベースを専門とする会社にお願い…

日本MySQLユーザ会 望年LT大会2020に参加してきた

先週、MyNA(日本MySQLユーザ会) 忘年LT大会 2020に参加して、飲みながらLTをネタにワイワイしてきました。 自分からは、ここ最近取り組んでいた、MySQL Shell のバックアップ機能のバグについてLTしました。 実際にどうやってデバッグしたか*1 など、ワイワ…

MySQL 8.0 でも utf8mb4_general_ci を使い続けたい僕らは

このエントリーは MySQL Advent Calendar 2020 の 12/7 のエントリーです。 照合順序(COLLATION)とは 照合順序は文字列の比較やソート順のルールのことです。各キャラクタセットごとに照合順序が定義されています。 -- SHOW COLLATIONS で一覧が見れる mys…

MySQL ヒストグラムはバックアップされるか

MySQL 8.0 でヒストグラム統計が追加されました。従来、MySQLはデータが均等に分布していると仮定し、実行計画を組み立てていました。 ヒストグラムを使えば正確なデータの分布に基づいて、より最適な実行計画が選択されるようになります。 yakst.com ヒスト…

MySQL Lock wait timeout exceeded が発生している現場を押さえる

pt-stalk は、vmstat や psといったOSから見える情報や SHOW PROCESSLIST SHOW GLOBAL STATUSといったDBの情報など、MySQLのトラブルシュートに必要な情報をごっそり収集するツールです。 $ sudo ls -l /var/lib/pt-stalk total 1428 -rw-r--r--. 1 root roo…

MySQL 8.0 でパスワードのハッシュ値でユーザを作成する構文が変わってた

MySQL では、パスワードのハッシュ値を指定してユーザを作ることが出来ます。 mysql> SELECT authentication_string FROM mysql.user WHERE User = 'usr'; +-------------------------------------------+ | authentication_string | +---------------------…