mita2 database life

主にMySQLに関するメモです

MySQL

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 の 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 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 | +---------------------…

MySQL Shell 8.0 を CentOS7 上でソースからビルドする

前回のエントリーでMySQL Shellのバグについて書きました。バグの原因を調査するために、MySQL Shellをビルドしたんですが、ビルドに苦労しました、、、 MySQL Shell をビルドするために乗り越えた障害と対応を方法をメモしておきます。 まず、MySQL Shell …

MySQL Shell dumpInstance が一貫性の壊れたバックアップを生成するバグの件(修正済み)

このバグは MySQL Shell 8.0.23 で修正済みです。 前回のエントリーで MySQL Shell の dumpInstance にはバグがあると書きました。 今回は、そのバグについてです。 どんなバグか バックアップの一貫性が失われるバグです。一貫性が失われるている状態とは、…

MySQL Shell dumpInstance の仕組みと8.0.22 わいわい会

MySQL Release note でわいわい言う勉強会 8.0.22 でLTしてきました。 MySQL Shell の dumpInstance の仕組み MySQL Shell のバックアップ機能 dumpInstance がどのようにして、一貫性のあるバックアップを実現しているか説明しました。 8.0.21 までは FLUSH…

MySQL キャラクタセット(文字コード)の変換方法おさらい

ALTER TABLE xxx MODIFY 〜 でキャラクタセットを変換するのと、ALTER TABLE xxx CONVERT TO〜 で変換するのは、どう違うんだっけ? ってなったので、おさらい。 データベースのデフォルトキャラクタセット MySQL はカラム単位でキャラクタセット(文字コー…

MySQL Group Replication vs Percona XtraDB Cluster 〜DDLのKILL 編〜

MySQL のマルチマスターのソリューションである、PXC と Group Replication の比較記事が続きます・・・ PXC では DDL は KILL できない Percona XtraDB Cluster (Galera) では DDL実行中は、すべてのノードで更新が止まると、以前のエントリーで書きました…

MySQL Group Replication vs Percona XtraDB Cluster 〜フルデータコピー中のDDLブロック 編〜

フルデータコピーが行われるタイミング PXC や MySQL Group Replication では、新規にノードを追加したタイミングや、障害発生後、既存ノードからデータをコピーし、復旧する機能があります。 データコピー中のDDLの挙動の比較 フルデータコピーには非常に時…

MySQL Group Replication vs Percona XtraDB Cluster 〜DDLのロック編〜

Gelera Cluster / Percona XtraDB Cluster Galera Cluster for MySQL は フィンランドの会社が開発している、MySQL の fork (派生製品)の1つです。wsrep API と呼ばれる独自のレプリケーション機構を使った、マルチマスター型のHA構成を組むことができま…

Percona Playback で 本番 MySQLに流れているクエリを試験環境でリプレイする

データベースのバージョンアップの際、アプリケーションの網羅的なテストが可能であれば良いのですが、どうしても難しいケースがあります。 そのような場合、リプレイツールで本番環境に流れているクエリを、試験環境でリプレイ(再現)し、動作確認を取る方…