MySQL
alter 前に見るページ
MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.12.1 オンライン DDL 操作
DO SLEEP
DO SLEEP(5) とかで5秒待てる、トランザクションの挙動確認とかで便利
SELECT SLEEP(5) でも良いけど結果は要らないので DO を使うと出力されなくて目にやさしい
AUTOCOMMIT 下で SELECT ... FOR UPDATE
いみない
Locking reads are only possible when autocommit is disabled (either by beginning transaction with START TRANSACTION or by setting autocommit to 0.
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
ギャップロックされた空間への INSERT
https://ichirin2501.hatenablog.com/entry/2015/08/23/191500
ギャップロックされた空間への INSERT はブロックされる
排他ロック
ロック開放されたら続きが走る MySQL ロック挙動確認
ギャップロック同士はブロックしない
互いに同じギャップをロックして INSERT しようとすると Deadlock する
テーブル名入れ替える
テーブル名入れ替えテク
Innodb 統計情報
ざっくりの行数を確認するのに
SELECT * FROM mysql.innodb_table_stats
SELECT * FROM mysql.innodb_table_stats WHERE table_name = 'hoge'
golang で Duplicate entry エラーを判定
エラーを mysql.MySQLError に変換してエラーコードを見る
大抵の場合 message 見れば良いかもしれない
code:duplicate.go
if err != nil {
if mysqlErr, ok := err.(*mysql.MySQLError); ok {
if mysqlErr.Number === 1062 {
...
}
}
}
その他エラーコードはこちら
MySQL :: MySQL 8.0 Reference Manual :: B.3.1 Server Error Message Reference
MessagePack のカラムを LIKE で SELECT する
SELECT * FROM table WHERE msgpack LIKE BINARY CONCAT('%key', UNHEX('a5'), 'value%)
A5 は MessagePack の str 型先頭の長さ情報
めんどい時は何かで pack したバイナリを hex で書き出して UNHEX でクエリに渡そう
show processlist
MySQL :: MySQL 8.0 Reference Manual :: 13.7.6.29 SHOW PROCESSLIST Syntax
time の単位は秒
クエリ全部見る SHOW FULL PROCESSLIST\G
MAX_EXECUTION_TIME
SELECT文をタイムアウト強制終了させる「MAX_EXECUTION_TIME」使ってる? - なからなLife
クエリにコメント /*+ {OPTIMIZER_HINT} */ の形で書ける
SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM table ... なら 1000ms で諦める
user * grant 一覧
code:all_grantree.sql
SELECT GRANTEE, GROUP_CONCAT(PRIVILEGE_TYPE ORDER BY PRIVILEGE_TYPE) FROM information_schema.user_privileges GROUP BY GRANTEE;
mysqldump に PROCESS 権限が必要になった
が、--no-tablespaces をつければ要らない
mysqldumpでPROCESS権限(PROCESS privilege)を要求される - いっさいがっさい
tablespace は CREATE TABLESPACE で作るやつ、つかってない
pager
mysqlコンソールをpagerで便利に - Qiita
pager COMMAND
pager grep -v Sleep などして show processlist すると Sleep を除外して見れる
nopager
INFORMATION_SCHEMA から殺すクエリを特定する
MySQL :: MySQL 8.0 リファレンスマニュアル :: 13.7.7.29 SHOW PROCESSLIST ステートメント
SELECT * FROM information_schema.PROCESSLIST ORDERBY TIME;
id に PID
user に接続ユーザー
info カラムにクエリが入っている
WHERE info LIKE 'SELECT %なんとか' など
確実に参照系だけを/ トランザクション外のものを 選択する方法はない?
LOWER(info) NOT LIKE '%insert%' AND LOWER(info) NOT LIKE '%update%' AND LOWER(info) NOT LIKE '%delete%' などである程度は...
time は実行時間(秒)
command
MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.14.2 スレッドのコマンド値
pt-kill — Percona Toolkit Documentation
トランザクションを張り続けているプロセスを特定してkillする - Qiita
INNODB_TRX
#dev #MySQL