MySQL status

表題について。

■ 環境

  • MySQL 5.6.36

■ status

mysql-clientで接続し、`status`と実行すると下記を得られる。

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.6.36, for Linux (x86_64) using  EditLine wrapper

Connection id:        594250
Current database:    withsin
Current user:        withsin@192.168.10.33
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.6.35-log MySQL Community Server (GPL)
Protocol version:    10
Connection:        withsin.XXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:        3306
Uptime:            34 days 1 hour 4 min 9 sec

Threads: 23  Questions: 43251214  Slow queries: 0  Opens: 5329  Flush tables: 1  Open tables: 1857  Queries per second avg: 14.704
--------------

mysql>

RDSで起動しているMySQLに接続して実行してみた。接続しているユーザとか基本的な設定とか見られるんだな、ということを知ったのでメモしておく。

以上。

MySQL疎通確認

表題を定期的にスクリプトで行いたい。

■ 環境

  • MySQL 5.6.36
  • Amazon Linux

■ mysqladmin

`mysql`コマンドで適当なSQLを実行するなり、`show status`等を実行したりするというのもあるが、`mysqladmin`で疎通確認ができるらしい。下記のように実行した。

$ mysqladmin ping -u[user] -h[host] -p[password]
Warning: Using a password on the command line interface can be insecure.
mysqld is alive
$

5.6“から上記のようなメッセージが出るようだが、一応MySQLが生きているという結果を得られた。

以上。

auto_incrementのカラムにデータ投入すると次の値は?

表題の件について、どうなるんだっけ?と分からなくなってしまったので確認する。

■ 環境

  • MySQL 5.7.17

■ auto_increment

下記のテーブルを用意した。データはまだ投入していない。

mysql> show create table test;
+-------+-----------------------------------+
| Table | Create Table                      |
+-------+-----------------------------------+
| test  | CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> select * from test;
Empty set (0.01 sec)

mysql>

このテーブルに1件データを投入すると、”auto_increment“で”1“が投入される。

mysql> insert into test values (null, 'test1');
Query OK, 1 row affected (0.08 sec)

mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
+----+-------+
1 row in set (0.01 sec)

mysql>

この時の`auto_increment`の値は”2″になっていた。

mysql> show create table test;
+-------+-----------------------------------+
| Table | Create Table                      |
+-------+-----------------------------------+
| test  | CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 |
+-------+-----------------------------------+
1 row in set (0.00 sec)

mysql>

続いて”id“カラムに”3“を投入する。

mysql> insert into test values (3, 'test1');
Query OK, 1 row affected (0.02 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  3 | test1 |
+----+-------+
2 rows in set (0.00 sec)

mysql> show create table test;
+-------+-----------------------------------+
| Table | Create Table                      |
+-------+-----------------------------------+
| test  | CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 |
+-------+-----------------------------------+
1 row in set (0.00 sec)

mysql>

なるほど。”auto_increment“の値は必ず”最大値+1“以上になってくれるようである。

以上。

■ 確認

auto_incrementの現在値

MySQLについて表題を知りたい。該当のカラムの最大値を取れば良い?とか思ったがそれでは不確実である。

■ 環境

  • MySQL 5.7.17

■ show table status

mysql> show table status like 'test%' \G
*************************** 1. row ***************************
           Name: test
         Engine: InnoDB
  :
Auto_increment: 1320
  :
1 row in set (0.01 sec)

mysql>

`like`で対象を絞らないと全テーブルのステータスが取得できてしまう。

■ show create table

mysql> show create table test \G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  :
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1320 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)

mysql>

AUTO_INCREMENT=1320“が取得できる。他にも手段があるかもしれないが、この方法が簡単な気がする。

以上。

■ 関連

MySQLのコネクション数を取得

表題の通り。接続コネクション数がMaxConnectionsに達してエラーが出てしまった。その後、コネクション数を監視していて何が多く接続しているのかを確認したかった。

■ 環境

  • AWS RDS
  • MySQL 5.6.23

■ show processlist

下記で取得することができる。

mysql> show processlist;
+--------+----------+--------------------+--------------------+---------+-------+-------+------------------+
| Id     | User     | Host               | db                 | Command | Time  | State | Info             |
+--------+----------+--------------------+--------------------+---------+-------+-------+------------------+
|  31660 | rdsadmin | localhost:40321    | mysql              | Sleep   |     3 |       | NULL             |
  :
+--------+----------+--------------------+--------------------+---------+-------+-------+------------------+
18 rows in set (0.00 sec)

mysql>

rdsadmin“はRDSで起動しているからであろう。これは問題ない。それ以外のプロセスで”State“が”Sleep“で”Time“が異様に長いものは下記でプロセスを落としてしまう。

mysql> kill 137798;
Query OK, 0 rows affected (0.01 sec)

mysql>

以上。

■ 関連