LoginSignup
184
191

More than 5 years have passed since last update.

MySQLの運用で役立つコマンド集

Last updated at Posted at 2014-07-18

MySQLの運用で役立つコマンド集

書き留めておいたコマンド集。随時更新予定。

サーバー情報を見る

  • MySQLのバージョンを確認
SHOW VARIABLES LIKE 'version';
  • 使用できるストレージエンジンの確認
SHOW ENGINES;
  • 現在実行中のプロセスの確認
SHOW PROCESSLIST;
mysql5以降からSELECT文でも取得できるようになった。
SELECT * FROM information_schema.PROCESSLIST;
3秒以上かかっているクエリを取得
SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 3;

スキーマ

  • テーブルのCREATE文を表示
SHOW CREATE DATABASE `__SCHEMA_NAME__`\G
  • スキーマ毎に使用している容量を表示
SELECT
    TABLE_SCHEMA,
    round( sum( DATA_LENGTH ) / ( 1024 * 1024 ) , 2 ) AS DATA_SIZE,
    round( sum( INDEX_LENGTH ) / ( 1024 * 1024 ) , 2 ) AS INDEX_SIZE,
    round( round( sum( DATA_LENGTH ) + sum( INDEX_LENGTH ) ) / ( 1024 *1024 ) , 2 ) AS TOTAL_SIZE
FROM
    information_schema.TABLES
GROUP BY
    TABLE_SCHEMA
ORDER BY
    TOTAL_SIZE DESC;

テーブル

  • テーブル構造の確認
DESCRIBE `__TABLE_NAME__`;
DESC `__TABLE_NAME__`;
  • テーブルで使用しているのストレージエンジン表示
SELECT
    TABLE_NAME,
    ENGINE
FROM
    information_schema.TABLES
WHERE
    TABLE_SCHEMA LIKE '__SCHEMA_NAME__';
  • テーブルのCREATE文を表示
SHOW CREATE TABLE `__TABLE_NAME__`\G
  • テーブルのコピー
CREATE TABLE `__TO_TABLE_NAME__` LIKE `__FROM_TABLE_NAME__`;
INSERT INTO `__TO_TABLE_NAME__` SELECT * FROM `__FROM_TABLE_NAME__`;
  • テーブルの容量の一覧を表示
SELECT
    TABLE_NAME,
    round( DATA_LENGTH / ( 1024 * 1024 ) , 2 ) AS DATA_SIZE,
    round( INDEX_LENGTH / ( 1024 * 1024 ) , 2 ) AS INDEX_SIZE,
    round( round( DATA_LENGTH + INDEX_LENGTH ) / ( 1024 * 1024 ) , 2 ) AS TOTAL_SIZE
FROM
    information_schema.TABLES
WHERE
    TABLE_SCHEMA LIKE '__SCHEMA_NAME__'
ORDER BY
    TOTAL_SIZE DESC;

インデックス

  • テーブルのインデックスの情報を見る
SHOW INDEX FROM `__TABLE_NAME__`\G
  • 使用されていないインデックス情報を見る
MySQL5.5/5.6
SELECT
    OBJECT_SCHEMA,
    OBJECT_NAME,
    INDEX_NAME
FROM
    performance_schema.table_io_waits_summary_by_index_usage
WHERE
    INDEX_NAME IS NOT NULL
    AND INDEX_NAME NOT LIKE 'PRIMARY'
    AND COUNT_READ = 0;
MySQL5.7
SELECT * FROM `sys`.`schema_unused_indexes`;

ユーザー関係

  • ユーザー表示
SELECT user,host FROM mysql.user;
  • 全権限を持ったユーザーの追加
GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' IDENTIFIED BY '********' WITH GRANT OPTION;
  • ユーザーのパスワード変更
SET PASSWORD FOR 'user'@'localhost' = password('********');
  • レプリケーション用ユーザーの追加(マスタで実行)
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY 'password';
  • ユーザー削除
DROP USER 'repl'@'192.168.1.%';

クエリキャッシュ

  • クエリキャッシュ有効化
128MBの例
SET GLOBAL query_cache_size=128*1024*1024;
SET GLOBAL query_cache_type=1;
  • クエリキャッシュ無効化
SET GLOBAL query_cache_size=0;
SET GLOBAL query_cache_type=0;
  • クエリキャッシュのデフラグメント化
FLUSH QUERY CACHE;
  • クエリキャッシュの状況確認
SHOW STATUS LIKE 'Qcache%';

スロークエリ

  • スロークエリの秒数を設定
3秒
SET GLOBAL long_query_time=3;
  • スロークエリのファイル名を設定
SET GLOBAL slow_query_log_file=slow.log
  • スロークエリ取得開始
SET GLOBAL slow_query_log=ON;
  • スロークエリ取得終了
SET GLOBAL slow_query_log=OFF;

レプリケーション

  • マスターサーバーの状態を確認
SHOW MASTER STATUS;
  • バイナリログを消す
日付を指定して削除
PURGE MASTER LOGS BEFORE '2012-12-25';
ファイルを指定して削除
PURGE MASTER LOGS TO 'mysql-bin.001294';
  • バイナリログのリセット
RESET MASTER;
  • スレーブの状態を確認
SHOW SLAVE STATUS;
  • スレーブサーバーでレプリケーションが切断された時にエラーとなったクエリを読み飛ばす
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE ;
  • スレーブサーバーのマスターサーバー情報の変更
CHANGE MASTER TO
MASTER_HOST='192.168.1.1',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='PASSWORD',
MASTER_LOG_FILE='mysql-bin.001234',
MASTER_LOG_POS=79;

mysqldump

  • データベースのダンプを丸ごととる
mysqldump \
--databases データベース名 \
--flush-logs \
--hex-blob \
--opt \
--user=ユーザー名 \
-p > ファイル名
  • マスターサーバーでのダンプ
mysqldump \
--databases データベース名 \
--flush-logs \
--hex-blob \
--master-data
--opt \
--user=ユーザー名 \
-p > ファイル名
  • データベースの構造のみダンプをとる
mysqldump \
--databases データベース名 \
--opt \
--no-data \
--user=ユーザー名 \
-p > ファイル名
  • 特定のテーブルのダンプをとる
mysqldump \
--flush-logs \
--hex-blob \
--opt \
--user=ユーザー名 \
-p データベース名 テーブル名 > ファイル名
  • 特定のテーブルの特定のデータのダンプをとる
mysqldump \
--flush-logs \
--hex-blob \
--opt \
"--where=条件" \
--user=ユーザー名 \
-p データベース名 テーブル名 > ファイル名

その他

  • SQLの結果をCSVファイルに吐き出す
SELECT * FROM test INTO OUTFILE '/tmp/test.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';

上記を行うためにはmy.cnfに下記設定が必要

secure-file-priv = "/tmp/"
  • セッション統計情報の表示
SHOW STATUS;
フルインデックススキャンの回数
SHOW STATUS LIKE "Handler_read_first";
両方のテーブルで全件JOINした回数
SHOW STATUS LIKE "Select_full_join";
片方のテーブルで全件JOINした回数
SHOW STATUS LIKE "Select_full_range_join";
全件スキャンの回数
SHOW STATUS LIKE "Select_scan";
全件スキャンによるソートの回数
SHOW STATUS LIKE "Sort_scan";
現在までの最大同時接続数
SHOW STATUS LIKE "Max_used_connections";
現在の同時接続数
SHOW STATUS LIKE "Threads_connected";
  • セッション統計情報のクリア
FLUSH STATUS;
  • SQL実行結果にページャを設定
pager less -S
標準に戻す
pager stdout
184
191
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
184
191