-
Microsoft Store から WinDbg Preview をダウンロードする
にした -
MySQLにミニダンプを吐かせるのはLinuxと同じでmy.iniの
[mysqld]
セクションにcore-file
を追加- 今回は確実にクラッシュが再現できるものが手元にあったので
mysqld.exe --console --core-file
で起動しただけだけど- ちなみに8.0.32で直された これ …
- 今回は確実にクラッシュが再現できるものが手元にあったので
TL;DR
- MySQL 8.0なら
SET gtid_next=..
,COMMIT
,SET gtid_next= AUTOMATIC
ってやらなくてもSET GLOBAL gtid_purged = '+..'
でスキップさせられる - MySQL :: MySQL 8.0 Reference Manual :: 17.1.7.3 Skipping Transactions
とはいえそもそもSQL
Threadが止まってイベントをスキップしなければならないような事態になったら、レプリカを真っ新に作り直した方が良いというのは相変わらず思っている。
MySQL 8.0ならCloneプラグインもあるしね。
TL;DR
- MySQL 8.0なら ibd2sdi の結果から判断がつく
- Foeign Key制約によって暗黙に作成されたINDEXとは何ぞや、という人は↓
(num, val) を持ったテーブルが2つ、numはどちらでもPKE、valはt1でだけUNIQUE KEY。
mysql80 46> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`num` bigint unsigned NOT NULL AUTO_INCREMENT,
`val` varchar(32) DEFAULT NULL,
UNIQUE KEY `num` (`num`),
UNIQUE KEY `val` (`val`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 …
[さらに読む]
プライベートでは基本的に誰の役にも立たないプログラムを作ってるんだけど、たまにうっかり MySQL Parameters みたいな役に立つものを作ってしまう。
MySQL Parameters は5年くらい前に Vue.js の勉強のために作ってみたんだけど、結局そのまま Vue.js は触らず放置状態だった。MySQL の新しいバージョンが出るたびにデータは更新してたけど。
ruby.wasm で Ruby が WebAssembly 上で動くようになり、ブラウザ上で JavaScript の代わりに使えるようになったんで、MySQL Parameters を Ruby で作り直してみた。
ruby.wasm
ruby.wasm のページに載ってるけど、これだけでブラウザ上で Ruby が動く。簡単。
<html> …[さらに読む]
TL;DR
-
TempTableストレージエンジンがDisk落ちした時とInnoDB Temporary tableで「同じストレージあふれ」でも微妙にエラー内容が違う
-
前者は
ERROR 14 (HY000): Can't change size of file (OS errno 28 - No space left on device)
, エラーログ出力なし -
後者は
ERROR 1114 (HY000): The table '#sqlXXXXX' is full
でエラーログ出力もあり -
ちなみにMyISAMは
ERROR 126 (HY000): Incorrect key file for table '/mytmp/#sqlXXXXX.MYI'; try to repair it
、これ少なくとも5.7からは変わってない
-
実験用に100MBくらいのファイルにxfsを作ってマウントする。
$ dd …
[さらに読む]
TL;DR
-
SET GLOBAL gtid_purged = '+?'
のプラス付きの記法は、既存のgtid_executed
と1つたりともカブってはいけない。-
RESET MASTER
ができず、既存のgtid_executed
に足したい場合は差分を取って+
記号で足してやらないといけない
-
-
gtid_executed
が空でない時に+
記号なしのSET GLOBAL gtid_purged = ?
した時のエラーが5.7と8.0で変わってた
SET GLOBAL gtid_purged = ?
した時に出ることがある ERROR
3546 (HY000): @@GLOBAL.GTID_PURGED cannot be changed
,
よく見たら実は3種類くらいあるっぽかった。
perror
で調べてみると、確かに ERROR 3546 (HY000):
@@GLOBAL.GTID_PURGED cannot be …
日々の覚書: 複合プライマリーキー vs サロゲートキーでInnoDB読み取りページ数の比較 の続き。
毎回innodb_metricsを眺める方法だとサンプル数が余程限られている状態でもない限りスケールしないので、もうちょっと機械的にやる方法を考える。
思いついたのはPercona Serverのスローログでやる方法。
取り敢えずオリジナル側でサンプルにするためにスローログを取っておく。本番から期間を絞って取れれば取り敢えず良いだろうか。
mysql> SET GLOBAL slow_query_log = ON, long_query_time = 0;
/* サンプルクエリを取る */
mysql> SET GLOBAL long_query_time = ?; -- もとの値に戻す
…
[さらに読む]
TL;DR この考察の単位は ページ数
であって
パフォーマンスじゃない
。パフォーマンスを考える時はこれにさらにバッファプールヒット率が関連するはず
- COUNT(*)に関してはページあたりのインデックスレコードの充填数が多いサロゲートキーの方が読むページが少ない
-
カバリングインデックスの効くCOUNT(*)に関してはナチュラルキーのサイズの大きさはほとんど関係なさそう
-
行本体を読まなければいけない(=カバリングインデックスで済まない)select_lsitになるとサロゲートキーの充填数の差は目立たなくなる
-
ナチュラルキーの左端でレンジスキャンする時がページ読み取り数は最小
- …
TL;DR
-
セカンダリーキーは意外とログ書き込みに響く。無駄なやつをなるべく消したりマージできたりするといいかも。
-
ナチュラルキーを使うのは書き込み面では誤差か。
- 読み取りで差が出るといいなと思うけれど今日はやらない。
table | size | size_vs_t1 | lsn | lsn_vs_t1 | comment |
---|---|---|---|---|---|
t1 | 13,631,488 | 1.00 | 31,977,682 | 1.00 | auto_increment PK + 0 key |
t2 | 17,825,792 | 1.31 | …