MySQL

LocalMySQLの作り方

使い捨てmysqlをdocker で作成して、javaで接続してみる

MySQL のdocekrImageをpull

$ docker pull mysql:5.7

確認

$ docker images

先ほどダウンロードしたimageを使ってコンテナを起動する ※ MYSQL_ROOT_PASSWORDを適当に設定

$ docker run \
    --name my-mysql \
    -e MYSQL_ROOT_PASSWORD=admin \
    -p 3306:3306 \
    -d mysql:5.7

terminalから先ほどのdatabaseに接続してみる(ちょっと起動まで時間がかかる)

$ mysql -uroot -psecret --port=33306 --host=127.0.0.1

全てのデータベースのサイズを確認する

MB単位

select table_schema, sum(data_length+index_length) /1024 /1024 as MB from information_schema.tables  group by table_schema order by sum(data_length+index_length) desc;

+--------------------------+---------------+
| table_schema             | MB                  |
+--------------------------+---------------+
| database1                 | 5579.89978790| 
| database2                 | 3658.48437786| 
+--------------------------+---------------+

GB単位

select table_schema, sum(data_length+index_length) /1024 /1024/1024 as GB from information_schema.tables  group by table_schema order by sum(data_length+index_length) desc;

+--------------------------+----------------+
| table_schema             | GB                |
+--------------------------+----------------+
| database1                  | 5.449120886624|  
| database2                  | 3.572738650255| 
+--------------------------+----------------+

特定のデータベースのサイズを確認する

use database1;
select table_schema, sum(data_length+index_length) /1024 /1024 as MB from information_schema.tables where table_schema = database();

もしくは

select table_schema, sum(data_length+index_length) /1024 /1024 as MB from information_schema.tables where table_schema = 'databaseName';

+-----------------+---------------+
| table_schema | MB            |
+-----------------+---------------+
| database1      | 5579.89978790| 
+-----------------+---------------+

テーブル単位でサイズを確認する

use databaseName;
select table_name, engine, table_rows as tbl_rows, avg_row_length as rlen,  floor((data_length+index_length)/1024/1024) as allMB,  #総容量floor((data_length)/1024/1024) as dMB,  #データ容量floor((index_length)/1024/1024) as iMB   #インデックス容量from information_schema.tables  where table_schema=database()  order by (data_length+index_length) desc; 

+------------------------------+--------+----------+------+-------+------+------+
| table_name                | engine     | tbl_rows  | rlen | allMB | dMB | iMB |
+------------------------------+--------+----------+------+-------+------+------+
| table1                 | MyISAM   |   156382     | 3738 |   570 |  557 |   12 | 
| table2                 | MyISAM   |   185280     | 1624 |   311 |  287 |   24 | 
| table3                 | MyISAM   |   208823     |  394  |   103 |   78  |   24 | 
+------------------------------+--------+----------+------+-------+------+------+

MySQLコマンド

データベースに接続

mysql -u root -p
-u ----- 「ユーザを指定する」というオプション
-u root ----- 「rootユーザで」みたいな意味
-p ----- 「パスワードを指定してログインする」というオプション

データベース一覧の表示

SHOW DATABASES;

現在のデータベース確認

SELECT DATABASE();

データベースの中身を確認

SHOW DATABASES;

データベースの作成

CREATE DATABASE [データベース名];

  データベースの削除

DROP DATABASE [データベース名];

使用するデータベースの選択

USE [データベース名];

テーブル一覧の表示

SHOW TABLES;

テーブルの作成

CREATE TABLE [テーブル名] (
    column1 [データ型] [その他オプション],
    column2 [データ型] [その他オプション],
    column3 [データ型] [その他オプション],
);

例)

CREATE TABLE `posts`(
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `user_id` int(10) unsigned NOT NULL,
   `post` varchar(512) NOT NULL,
   PRIMARY KEY (`id`)
);

CREATE TABLE文を確認

SHOW CREATE TABLE [テーブル名];

テーブルにデータを挿入(INSERT)

INSERT INTO `users`(`id`, `name`, `address`, `tel`) VALUES(1, 'nishide', 'Cebu', '080-xxxx-oooo');

例) postsテーブルにサンプルデータをインサート

INSERT INTO `posts`(
    `user_id`,
    `post`
) VALUES (
    1,
    'hogehoge fugafuga なんやで'
);

テーブルからデータを取得(SELECT)

SELECT * FROM `users`;

抽出するデータを一部にする

SELECT `id`, `name` FROM `users`;

条件つきでデータを取得

SELECT * FROM `users` WHERE id = 2;

複数の条件で絞り込んでデータを取得

SELECT * FROM `users` WHERE id > 3 and id < 6;

並べ替えてデータを取得

SELECT * FROM `users` ORDER BY id ASC;
SELECT * FROM `users` ORDER BY id DESC;

データを更新

UPDATE [テーブル名] SET [COLUMN名] = '新しい値'

データを削除

DELETE FROM [テーブル名] WHERE [条件]

MySQLでコマンドから直接クエリを実行 mysqlコマンドを実行して、中にはいってからSQLを実行しても良いんだけど、ちょっとした事だったら面倒くさいし、シェルでワンライナーでいけるならそっちのが良いっていうときには -eオプションを使うと直接クエリを実行することができる。

$mysql -u root DBNAME -e "クエリ"

これと、 into outfile を併用することでテーブルの中身をCSVファイルとして書き出すことができる。 例) 

$mysql -u root DBNAME -e
"select * from table into outfile '/tmp/output.csv'
fields terminated by ',' enclosed by '\"'"
例) 
 mysql -u root -e "select user,host from mysql.user;"

MySQL 性能試験 mysql ---> telegraf ---> influxdb ---> Grafana

Version確認

mysqladmin -u root -p version

現在の接続しているスレッド数

mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 3     |
+-------------------+-------+
1 row in set (0.00 sec)

あるいは SELECT文 で

SELECT * FROM information_schema.PROCESSLIST;

プロセスリスト(処理中の接続)を表示する

mysql> show processlist;
+------+------+-----------------+---------------------------+---------+------+-------+------------------+
| Id   | User | Host            | db                        | Command | Time | State | Info             |
+------+------+-----------------+---------------------------+---------+------+-------+------------------+
|   68 | root | localhost:36562 | hogehogehogehogehogehogeh | Sleep   |   30 |       | NULL             |
|   69 | root | localhost:36563 | NULL                      | Sleep   |   40 |       | NULL             |
| 2268 | root | localhost       | hogehogehogehogehogehogeh | Query   |    0 | init  | show processlist |
+------+------+-----------------+---------------------------+---------+------+-------+------------------+
3 rows in set (0.00 sec)

不要なコネクションをkill

mysql> kill 69;
Query OK, 0 rows affected (0.00 sec)

60秒以上経過しているコネクションを抽出 RDS の場合'rdsadmin'は除外

mysql> SELECT * FROM information_schema.PROCESSLIST WHERE time >= 60 and user != 'rdsadmin';

そのIDをカンマ区切りで抽出

mysql> SELECT GROUP_CONCAT(id) FROM information_schema.PROCESSLIST WHERE time >= 60 and user != 'rdsadmin';

まとめて kill

$ mysqladmin kill xx,xx,xx -h host -u user -p

(おまけ)起動してからの累積接続数

mysql> show status like 'Conn%'; 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections   | 85    |
+---------------+-------+
1 row in set (0.01 sec)

(おまけ)プライマリ/レプリカの判別

SHOW GLOBAL VARIABLES LIKE 'innodb_read_only';

プライマリは OFF, レプリカは ON

MySQLのデータベースの場所を調べたり、ディレクトリ変更したりのメモ MySQLmysql Ver 14.14 Distrib 5.1.58, for debian-linux-gnu (x86_64) using readline 6.2) データベースの場所を調べる

mysql -u root -p#パスワード入力> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+1 row in set (0.00 sec)

ユーザの確認

mysql> select Host, User, Password from mysql.user;
+-----------+----------+-------------------------------------------+
| Host      | User     | Password                                  |
+-----------+----------+-------------------------------------------+
| %         | admin    | *6B5EDDE567F4F29018862811195DBD14B8ADDD2A |
| localhost | dev      | *6B5EDDE567F4F29018862811195DBD14B8ADDD2A |
| localhost | rdsadmin | *6FE95FED37F22C2C8E3910CE6AD0D9144D1E600B |
+-----------+----------+-------------------------------------------+
3 rows in set (0.02 sec)