目次
[さらに読む]認証がプラグイン化された最近のMySQL(5.5くらい?)の認証時のプロトコルをちゃんと理解してなかったので調べてみた。
基本的にはこんな感じ
クライアントが接続するとサーバー(mysqld)から次の内容のパケットが送られる:
- プロトコルバージョン: 現在のところ "10"
- サーバーバージョン: "8.0.27" とか
- スレッドID
- パスワードハッシュ化のためのデータ(チャレンジ)
- サーバーの機能(ケイパビリティ)
- サーバーのデフォルト文字コード(collation)
-
認証方式:
caching_sha2_passwordとか
それの応答としてクライアントが次のパケットを送る:
- クライアントフラグ …
PHP Conference Japan 2021 に参加しました。
参加といっても家族との兼ね合いだったりで、正直「自分のセッション以外はほぼほぼ不参加」でした(´・ω・`)
「オンラインxx」の「xx」が終わった瞬間に現実(?)に引き戻される感があるので、来年はオフラインでやれる状態になっていると良いですね。。
----
最初は応募しよう応募しようと思いつつ、 転職 もしたばっかで案外忙しい…と諦めていたんですが、アディショナルタイムのツイートを見ていてもたってもいられなくなり、結局応募しました。
…
[さらに読む]TL;DR
- リテラルと比較する条件のこと
- INNER JOINならONでもWHEREでもどっちでも同じ結果になる、マッチしない行は影も形も出てこない
- OUTER JOINならONに書いた時は「それにマッチしなければNULL詰めの行が返る」、WHEREに書いた場合は「それにマッチしない行は表示されない(= INNER JOINと一緒)」
- LEFT JOINの左右どちらのテーブルでもこうなるのはちょっと面白い(?)
- ゆっくり考えればわかるんだけど、2度見してしまった。。
CREATE TABLE t1 (num int);
INSERT INTO t1 VALUES (1), (2), (3);
-- INNER JOIN で WHERE
SELECT * FROM t1 JOIN t1 AS t2
ON t1.num = t2.num
WHERE t2.num IN (1, 3);
+------+------+
| num | num |
+------+------+
| …[さらに読む]
TL;DR
- 負荷をかけながらフェイルオーバーテストをするなら、負荷クライアント側で「どの書き込みが成功したのか」のログは必ず取っておく
- でないと、フェイルオーバー起因でデータロストが発生するのかしないのかのチェックができない
フェイルオーバーシナリオ
スイッチオーバー(手動での切り替え)を含めてざっと思いつくのはこれくらい。
- スイッチオーバー
- mysqldの正常終了
- mysqldの異常終了、特に、mysqld_safeやsystemdがmysqldを再起動させてしまう環境
- mysqldのハングアップ
- カーネルパニック
- ファイルシステムのハングアップ
- 電プチ
スイッチオーバー
…
[さらに読む]
他にも出る要因はあるはずだけど、今回は「トランザクション中に SET GLOBAL read_only =
1 」をやろうとして出た。
珍しかったので記念パピコ。
mysql80 25> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql80 25> SET GLOBAL read_only = 1;
ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction
実際には BEGIN で始めたわけじゃなくて、迂闊に autocommit = 0を指定したら出た。
TL;DR
-
レプリカにだけgenerated columnを足す構成 + binlog_format = ‘ROW’ かつgenerated columnを使ったインデックスがあると、そのインデックスの変更はレプリカでリプレイされない(インデックス上はgenerated columnのデータ型の暗黙のデフォルトになったり、リーフの数がそもそもおかしくなったり)
-
インデックス再作成、
ALTER TABLE .. ENGINE = InnoDBでも望む状態にはならなかった。- generated columnを削除して再作成も絡めないとダメ
5.7.27のレプリケーション構成を作って、マスターにテキトーなテーブルを作る。
binlog_format, binlog_row_image
はデフォルトのまま。
$ make_replication_sandbox …[さらに読む]
TL;DR
-
MySQL 5.6とそれ以前のはなし。5.7とそれ以降はこの初期設定は入っていない。
- MySQL 5.6でもインストール方法によっては存在しないし mysql_secure_installation を使った場合はこの設定は消されるし、MySQL 5.7とそれ以降だろうと5.6からインプレースアップグレードやmysqlスキーマまで含めたフルリストアでアップグレードした場合は設定は残っているだろう
-
昔のMySQLは
testというスキーマをmysql_install_dbで作ってしまって、しかもこのスキーマは全アカウントに対して(ストアド以外の)読み書き権限がある-
…
-