MySQL基礎コマンド チートシート(随時更新)
忘れがちなMySQL基礎コマンドをまとめてみました。
先頭に「mysql> 」が付いたものはmysqlログイン後、ついていないものはログイン前に実施する。 ちなみに値を入れるときは’‘ではなく``でいれるので注意。
基本操作
サーバ起動
$ service mysqld start //centos7以降 $ systemctl start mysqld //centos6以前
サーバ停止
$ mysqladmin -uroot -p shutdown
サーバ接続開始
$ mysql -h[ホスト名orIP] -u[ユーザー名] -p[パスワード] $ mysql -h[ホスト名orIP] -u[ユーザー名] -p[パスワード] -e “[実行コマンド]” //コマンド直接実行 $ mysql -h[ホスト名orIP] -u[ユーザー名] -p[パスワード] DB名 < input.sql //特定ユーザで接続し外部SQLファイルを投入する場合 $ mysql -h[ホスト名orIP] -u[ユーザー名] -p[パスワード] DB名 > output.sql //特定ユーザで接続しやりとりを外部SQLファイルに記録
サーバ接続終了
$ mysql> exit
パスワード設定
$ mysql> set password for ‘ユーザ名’@’接続元ホスト’=’パスワード’; 初回ログイン時は、$ mysql> set password for ‘root’@’localhost’=’testpassword’;の要領でパスワード設定 以下メッセージが出たらok。 Query OK, 0 rows affected (0.07 sec)
設定情報確認
MySQLバージョン確認
$ mysql -V 以下のような画面が表示されたらok $ mysql Ver 14.14 Distrib 5.5.34, for Linux (x86_64) using readline 5.1
アクティブプロセス一覧
$ mysql> show full processlist;
サマリー取得(MySQL Version/currentUser/connectionID/Threads/Query Per Sec …)
$ mysql> STATUS;
登録済ユーザー・権限一覧
- 登録済ユーザー一覧 $ mysql> select host,user from mysql.user;
- グローバルレベルの権限情報一覧 $ mysql> select * from information_schema.user_privileges;
- DBスキーマレベルの権限情報一覧 $ mysql> select * from information_schema.schema_privileges;
- テーブルレベルの権限情報一覧 $ mysql> select * from information_schema.table_privileges;
- カラムレベルの権限情報一覧 $ mysql> select * from information_schema.column_privileges;
- アクセス許可 grant all privileges on . to ‘ユーザー名’@’ホスト名’ identified by ‘’ with grant option;
環境変数の確認
- MySQLで扱う環境変数は以下2種類がある。 セッション変数:一時設定。現在の接続だけが影響する。
- $ mysql> show session variables; グローバル変数:恒久設定。変数設定後のすべての接続が影響する。
- $ mysql> show global variables; 絞り込み表示したい場合は以下 $ mysql> show variables like ‘キーワード’ %はアスタリスク的な使い方が出来るので’%キーワード%’のように囲むとあいまい検索が可能 $ mysql> show variables like ‘%character_set%’‘
統計情報の確認
$ mysql> show global status; 例)過去の最大コネクション数 $ mysql> show status like ‘%Max_used%’; 例)現在のコネクション数 $ mysql> show status like ‘%Threads_connected%’;
現在のINNODBの状態確認
$ mysql> show engine innodb status;
MySQLプラグイン一覧確認
$ mysql> show plugins;
エラー一覧
$ mysql> show warnings;
各DBの全テーブルのストレージエンジンの一覧取得
$ mysql> SELECT table_name,engine from information_schema.tables where table_schema=’データベース名’;
ユーザー操作
ユーザー作成
$ mysql> create user ユーザー名
@接続元ホスト
IDENTIFIED BY パスワード
;
ちなみに全ホストへのアクセス許可は*
ではなく%
なので注意。
$ mysql> create user ‘ユーザー名’@’%’ IDENTIFIED BY ‘パスワード’;
ユーザー削除
$ mysql> drop user ‘ユーザー名’@’接続元ホスト’;
ユーザー毎の権限情報確認
$ mysql> show grants for ‘ユーザー名’@’接続元ホスト’;
ユーザーへの権限追加
**$ GRANT 権限 ON DB名.テーブル名 TO ユーザー名@ホスト名 **
管理者ユーザを作りたい
$ GRANT ALL ON . TO 管理ユーザ名@’%’ IDENTIFIED BY ‘パスワード’ WITH GRANT OPTION;
ユーザーへの権限削除
$ REVOKE 権限 ON DB名.テーブル名 FROM ユーザー名@ホスト名; $ REVOKE ALL ON testdb.* FROM ‘testuser’@’testhost’; $ 要注意 ユーザーの追加、削除、権限操作の後は必ずFLUSH PRIVILEGESで反映が必要。
ユーザー毎の権限情報確認
$ mysql> grant all privileges on [DB2名].[テーブル名] to ‘ユーザー名’@’接続元ホスト’ WITH GRANT OPTION;
DB操作
作成済DBの一覧表示
$ mysql> show databases;
作成済DBの作成用SQL出力(文字コードを確認)
$ mysql> show create database DB名;
DB作成
$ mysql> create database DB名; 以下メッセージが出たらok $ Query OK, 1 row affected (0.00 sec)
DB削除
$ mysql> drop database DB名; 以下メッセージが出たらok。 $ Query OK, 0 rows affected (0.13 sec) ※show databasesで消えている事を確認。
使用するDBの指定
$ mysql> use DB名; 以下メッセージが出たらok。 Database changed
指定したDBへの特定ユーザーの権限付与
$ mysql> grant all on DB名.テーブル名 to ‘ユーザー名’;
テーブル関連
作成済テーブルの一覧表示
$ mysql> show tables;
作成済テーブルの作成用SQL出力(文字コードを確認)
$ mysql> show create table テーブル名;
テーブル定義の確認
$ mysql> desc テーブル名; ※descはdescriptionの略
テーブル作成
$ mysql> create table テーブル名 -> ( -> id INT(10), -> name VARCHAR(30) -> ); $ Query OK, 0 rows affected (0.09 sec)
- テーブル削除 $ mysql> drop table テーブル名;
テーブルの中身を全て表示
$ mysql> select * from テーブル名;
テーブルの中身の追加
$ mysql> insert into テーブル名 フィールド名 values フィールドの値; 例) $ mysql> insert into table (field1,field2,field3) values (value1,value2,value3); 例) $ mysql> insert into テーブル名 VALUES(‘AAA’,’佐藤’,’40);
テーブルの中身の削除
$ mysql> delete from テーブル名 where 条件文; 例) $ mysql> delete from table1 where id=3;
テーブルの中身の全消去
$ mysql> truncate テーブル名; 例) $ mysql> truncate table1;
テーブルの中身の更新
$ mysql> update テーブル名 set フィールド名 where 条件; 例) $ mysql> update table1 set (field1=1) where (field2=4);
テーブルのロック/アンロック
$ mysql> lock tables テーブル名 ロック種類(write/read) 例) $ mysql> lock tables testtable1 write; 例) $ mysql> lock tables testtable2 read; $ mysql> unlock tables;
テーブルの最適化
$ mysql> analize table テーブル名; 例) $ mysql> analize table table1;
バックアップ
全DBのバックアップ
- データ + 定義情報
- mysqldump -u’ユーザー名’ -p’パスワード’ –all-databases > backup.sql
- 定義情報のみ
- mysqldump -u’ユーザー名’ -p’パスワード’ -d –all-databases > backup.sql
特定DBのバックアップ
- データ + 定義情報
- mysqldump -u’ユーザー名’ -p’パスワード’ DB名 > backup.sql
- 定義情報のみ
- mysqldump -u’ユーザー名’ -p’パスワード’ -d DB名 > backup.sql
実行時にエラーが出た場合
以下エラーが出た場合はmy.cnfを修正 「mysqldump: unknown variable ‘symbolic-links=0’」 変更箇所
- MySQLの設定ファイル「my.cnf」にて「symbolic-links」をコメントアウト
リストア
全DBのリストア
- mysql -u’ユーザー名’ -p’パスワード’ < backup.sql
特定DBのリストア
- mysql -u’ユーザー名’ -p’パスワード’ DB名 < backup.sql
レプリケーション
マスター稼働状況
- $ mysql> show master status \G
スレーブ稼働状況
- $ mysql> show slave status \G
運用のポイント
クライアントホスト名の不要なDNS名前解決を避ける
- /etc/my.cnfにskip-name-resolveオプションをつける
ファイルデータはテーブル単位で分割する
- /etc/my.cnfにinnodb_file_per_tableをつける
- 後々テーブル単位でファイル整理&容量削減出来るため
適切なインデックスをはる
適切なメモリサイジングをする
- こちらでかなり整理してまとめて頂いていたのでリンク
- http://masato.ushio.org/blog/index.php/2015/12/31/uco-tech_mysql-memory-usage/
- MySQLのメモリは、サーバ全体で使用する「GlobalBuffer」と、各接続毎に確保される「ThreadBuffer」の2種類がある。
- 全体のメモリ容量 > GlobalBuffer一式 + (max_connections * ThreadBuffer一式)に収まるようにする。
select @@GLOBAL.INNODB_BUFFER_POOL_SIZE as GLOBAL_INNODB_BUFFER_POOL_SIZE, @@GLOBAL.INNODB_LOG_BUFFER_SIZE as GLOBAL_INNODB_LOG_BUFFER_SIZE, @@GLOBAL.KEY_BUFFER_SIZE as GLOBAL_MyISAM_KEY_BUFFER_SIZE, @@GLOBAL.TMP_TABLE_SIZE as GLOBAL_TMP_TABLE_SIZE, @@GLOBAL.QUERY_CACHE_SIZE as GLOBAL_QUERY_CACHE_SIZE, @@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE as THREAD_BUFFER_SIZE, @@GLOBAL.MAX_CONNECTIONS as MAX_CONNECTIONS, @@GLOBAL.KEY_BUFFER_SIZE + @@GLOBAL.INNODB_BUFFER_POOL_SIZE + @@GLOBAL.INNODB_LOG_BUFFER_SIZE + @@GLOBAL.NET_BUFFER_LENGTH + (@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE) * @@GLOBAL.MAX_CONNECTIONS AS TOTAL_MEMORY_SIZE, (@@GLOBAL.KEY_BUFFER_SIZE + @@GLOBAL.INNODB_BUFFER_POOL_SIZE + @@GLOBAL.INNODB_LOG_BUFFER_SIZE + @@GLOBAL.NET_BUFFER_LENGTH + (@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE) * @@GLOBAL.MAX_CONNECTIONS)/1024 AS TOTAL_MEMORY_SIZE_kb, (@@GLOBAL.KEY_BUFFER_SIZE + @@GLOBAL.INNODB_BUFFER_POOL_SIZE + @@GLOBAL.INNODB_LOG_BUFFER_SIZE + @@GLOBAL.NET_BUFFER_LENGTH + (@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE) * @@GLOBAL.MAX_CONNECTIONS)/1024/1024 AS TOTAL_MEMORY_SIZE_mb, (@@GLOBAL.KEY_BUFFER_SIZE + @@GLOBAL.INNODB_BUFFER_POOL_SIZE + @@GLOBAL.INNODB_LOG_BUFFER_SIZE + @@GLOBAL.NET_BUFFER_LENGTH + (@@GLOBAL.SORT_BUFFER_SIZE + @@GLOBAL.MYISAM_SORT_BUFFER_SIZE + @@GLOBAL.READ_BUFFER_SIZE + @@GLOBAL.JOIN_BUFFER_SIZE + @@GLOBAL.READ_RND_BUFFER_SIZE) * @@GLOBAL.MAX_CONNECTIONS)/1024/1024/1024 AS TOTAL_MEMORY_SIZE_gb \G
- innodb_buffer_pool_size(80%程度), myisam_key_size(25%程度)で用途に応じて設定できているか
クエリキャッシュの利用を検討する
- 更新が多い場合は、キャッシュを切った方がよい場合もある。
- SELECT実行の度にSELECT文と結果をキャッシュに格納する。キャッシュ利用頻度が少ないのに格納のオーバーヘッドが多いので逆に負担になりかねない。
- http://qiita.com/muran001/items/14f19959d4723ffc29cc
- thread_cache_size = max_connections/3になっているか
- Treads_createdが目安
- クエリキャッシュヒット率 - =キャッシュヒット数 / クエリ発行総数 - =キャッシュヒット数 / (キャッシュヒット数+キャッシュミス数) - =Qcache_hits / ( Qcache_hit + Com_select)
- ヒット率が6割を下回るようであれば見直しをしたほうが良いかも。
クエリを最適化する
- EXPLAINで実行計画を立ててクエリを最適化しよう
- クエリは必ずWHERE句による対象絞り込みを行う。全件フェッチは行わない。
TCPIP接続を避ける(同一ホスト内の場合のみ)
- UNIXドメインソケット接続にする(–skip-networking)
MySQLの各ファイルの説明
- テーブル名.frm
- テーブル定義ファイル
- テーブル名.MYD
- MyISAMテーブルデータファイル
- テーブル名.MYI
- MyISAMテーブルインデックスファイル
- テーブル名.ibd
- InnoDBテーブルデータファイル
参考
- MySQL 運用時に便利なコマンド
- https://www.qoosky.io/techs/3a369dd466
- mysqldumpまとめ
- http://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c