端的にいうと
-
SELECTのWHEREの条件の「右辺」に、RAND()やSYSDATE()のような非決定性関数を使うと、想定外のことが起こる。
- 戻ってくる行数が想定と異なる。
- Indexが効かなくなる。(テーブルフルスキャン走る)
どっちもなかなかのインパクトです。
追記:2019/05/30
PostgreSQLもMySQLと同じ挙動でした。(9.6と10系で確認)
Oracleは、MySQLや …
TL;DR
MY-010956 と MY-010957
がぼこぼこエラーログに吐かれることがある
2019-05-20T14:25:17.121864+09:00 5 [Warning] [MY-010956] [Server] Invalid replication timestamps: original commit timestamp is more recent than the immediate commit timestamp. This may be an issue if delayed replication is active. Make sure that servers have their clocks set to the correct time. No further message will be emitted until after timestamps become valid again.
2019-05-20T14:25:17.177804+09:00 5 [Warning] [MY-010957] [Server] The replication timestamps have returned to normal values.
TL;DR
information_schema.tables ( SHOW TABLE
STATUS はここから値を持って生きている)の値は information_schema_stats_expiry 秒間更新されない
SET SESSION information_schema_stats_expiry =
0 とかするとほぼ今まで通りの挙動になる
空っぽのテーブルを用意する。
mysql80 111566> SHOW TABLE STATUS\G
*************************** 1. row ***************************
Name: t1
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0 …[さらに読む]
TL;DR
NOT ENFORCED なんてオプションが “MySQLっぽい”
最初のFeature Requestから15年、ついにMySQL 8.0.16にCHECK制約が実装された。
アルファベットしか入ってほしくない val カラムに対して、ひらがなの “さん”
とかが入力されるのを制限できる、みたいなヤーツ。 …
TL;DR
SET GLOBAL, SET PERSIST
には値をセットするためのバリデーター(各サーバー変数ごとにある)が用意されているが、 SET
PERSIST_ONLY はそのバリデーターを通らないため、不正な値を突っ込んでもエラーになってくれない
mysqld を再起動しようとした時に、 mysqld-auto.cnf
( SET PERSIST, SET PERSIST_ONLY
の保管先)に不正な値が突っ込んであるとそれを適用できなくて mysqld が起動してくれない
TL;DR
--postpone-cut-over-flag-file でテキトーなファイルを指定する
RENAME TABLE .. (gh-ostの cut-over
フェーズ)をしても良いタイミングになったら、「指定したファイルを消す」または 「 Interactive commands の
unpostpone コマンドを放り込む」
gh-ost …
[さらに読む]
とある原稿を書いていて、トランザクションまわりをチト調べている私です。
あまり深みに入らなければ、4つのトランザクション分離レベルと、それぞれのアノーマリを説明して、はい、終わり、ということにしたいのですが、私には以前気づいてしまった以下の記事があり「あれ、四つ多くない?」を細かく調べることなく放置していたのでした。
Web開発者が知っておくべき八つの分離レベル
しかし、ここで調べなければもやもやは晴れないですし、
神林さんがシリアライズでもパフォーマンスに問題のないRDBMSの実装が終わり、
…
gh-ost には interactive-command なるものが用意されている。 これは
gh-ost を 起動しちゃった後
、後からオプションを変更したりする機能を提供しているっぽい。 デフォルトではソケットファイルのみオープンする。デフォルトのパスは
/tmp/gh-ost.<スキーマ名>.<テーブル名>.sock 。
パスを変えたかったりTCP経由も受け付けてほしい時は gh-ost
--serve-socket-file=/tmp/hoge や gh-ost
--serve-tcp-port=9999 とかで設定できる。
$ gh-ost --database=mysqlslap --table=t1 --alter="ADD KEY (intcol1)" --host=127.0.0.1 --port=21801 --user=msandbox …[さらに読む]