カテゴリー: mysql

MySQL バイナリログ取得設定

デフォルトの状態ではバイナリログは出力されていないので設定しておく。

ロールフォワードリカバリにも利用できる。

設定ファイルを変更する

#vim /etc/my.cnf

[mysqld]
log-bin
expire_logs_days = 14

「expire_logs_days」でとりあえず2週間で削除されるように設定しておく。
※ロールフォワードリカバリするた為には別途都度バックアップをとっておく必要がある。

保存したらmysqlの再起動

設定が反映されているか確認する。

[(none)] 10:04 am> show master logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| mysqld-bin.000001 |       126 |
| mysqld-bin.000002 |       126 |
| mysqld-bin.000003 |       107 |
+-------------------+-----------+
3 rows in set (0.00 sec)

[(none)] 10:04 am> show global variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 14    |
+------------------+-------+
1 row in set (0.00 sec)

バイナリログの中身を確認する
今回の設定だと「/var/lib/mysql」以下にファイルができる
ファイルの中身はもちろんバイナリなので「mysqlbinlog」ユーティリティ
を利用する。

# pwd
/var/lib/mysql
# mysqlbinlog -D mysqld-bin.000001

参考URL

MySQLバイナリログの仕様

MySQL バイナリログの管理

MySQL バイナリログの削除

知って得する!MySQL のリカバリ

MySQL: SHOW PROCESSLIST まとめてプロセス消す

CIのトランザクションがこけてロックがかかったときに
自分のMySQLのプロセスだけを一気に消したくなったので調べた。

ちょっぴり上行く SHOW PROCESSLIST の使い方

↑ここに詳しく書かれている。

SHOW PROCESSLIST;

↑が↓と同じ意味ということなので

SELECT * FROM information_schema.PROCESSLIST;

自分の場合はこんな感じで。

> SELECT group_concat(id) FROM information_schema.PROCESSLIST WHERE User='name';
+--------------------------------------------------------------+
| group_concat(id)                                             |
+--------------------------------------------------------------+
| 508,506,503,502,500,400,399,398,397,372,299,297,279,261,66,2 |
+--------------------------------------------------------------+
1 row in set (0.00 sec)

ワンライナーで消すのにビビったので以下の方法で。
※この方法にする為にgroup_concat()使ったという・・・。

$ mysqladmin kill 508,506,503,502,500,400,399,398,397,372,299,297,279,261,2 -u name -p

参考
プロセスを強制的に停止する(mysqladmin)

MySQL GROUP_CONCAT関数

いつも思い出せなくて困るやつ。

GROUP_CONCAT関数

この関数は、グループからの連結された非 NULL 値を伴うストリング結果を戻します。
非 NULL 値がない場合は NULL を戻します。

GROUP BY ( 集約 ) 関数

こことか

[mysql]group_concat 問い合わせ結果を配列化

GROUP_CONCAT関数の便利さは異常

1対多の関係を持つテーブルで主キーで検索した時に結果が複数行になることは

かなり頻繁にあります。そのとき「GROUP_CONCAT」関数を使うと複数行の結果のうち

特定の列の値をカンマ区切りで一つの列にまとめることができる。

例はここがわかりやすいかも。

MySQL 1対他のデータをGROUP_CONCATで取得

便利なのでメモ。

 

Specified key was too long; max key length is 767 bytes のエラーが出た。

MySQLでCREATE文作って流し込もうとしたら以下のエラーが出た。

ERROR 1071 (42000) at line xx: Specified key was too long; max key length is 767 bytes

ちなみに流し込もうとしたSQLは以下

CREATE  TABLE IF NOT EXISTS `xxx`.`tag_type` (
  `id` INT NOT NULL ,
  `type` VARCHAR(256) NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) ),
  UNIQUE INDEX `type_UNIQUE` (`type` ASC) )
ENGINE = InnoDB
COMMENT = 'xxxx';

そもそもtype列をUNIQUEにしなくて良かったのでUNIQUEの指定を外して
エラーがでなくなったのだけど、気になったので少し調べたら色々でた。

MySQL:Specified key was too long; max key length is 767 bytes

■[mysql][memo]MySQLのUNIQUEなINDEXには長さ767byteまでしか使えない件と対策

要するにPRIMARY KEYとUNIQUE KEYが駄目で、767で駄目と言われてしまうのは
最大が767byteなの対してutf8のため1文字3byteとなり、合計で256*3=768byteになるかららしい。

MySQL6以降はutf8が4byteになるため

ということも書いてあるので「VARCHAR(255)」にする対応で完璧ということでは無さそうですね。