kdoc - MySQL

  • 作成日:2014-01-22 14:30:26
  • 修正日:2017-04-17 11:04:43

コマンドライン上で

↑ページトップへ

   
Ctrl+a 行頭へ移動
Ctrl+e 行末へ移動
Ctrl+b 1文字前へ移動
Ctrl+f 1文字後ろへ移動
Ctrl+[(もしくはEsc) -> b 1単語前へ移動
Ctrl+[(もしくはEsc) -> f 1単語後ろへ移動
Ctrl+w カーソルより前の1単語を削除
Ctrl+[(もしくはEsc) -> d カーソルより後ろの1単語を移動
Ctrl+k カーソルから行末まで削除
Ctrl+l 画面クリア
\c 途中まで入力したけどやっぱりやめる
\G 行末「;」の代わりに「\G」で結果を横じゃなく縦に出力

ふつうの

↑ページトップへ

# 起動
$ mysql -u ユーザー名 -p

# データベース一覧
> show databases;

# データベース選択(末尾コロン不要)
> use データベース名

# テーブル一覧
> show tables;

# データベースを指定して起動
$ mysql -u ユーザー名 -D データベース名 -p

# 終了
> \q

# コマンド入力を途中でキャンセル
> \c

# ステータス
> status
--------------
mysql  Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1

Connection id:          38025143
Current database:       my_database
Current user:           u5@192.168.10.6
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.45-log Source distribution
Protocol version:       10
Connection:             192.168.10.37 via TCP/IP
Server characterset:    sjis
Db     characterset:    sjis
Client characterset:    sjis
Conn.  characterset:    sjis
TCP port:               3306
Uptime:                 2036 days 23 hours 29 min 48 sec

Threads: 5  Questions: 2212901386  Slow queries: 4451263  Opens: 9090  Flush tables: 1  Open tables: 335  Queries per second avg: 12.574
--------------

# テーブル内容表示いろいろ
> show full columns from テーブル名;
> desc テーブル名;
> show create table テーブル名;

# データベース毎のサイズをMB単位で
mysql> SELECT table_schema, SUM(data_length+index_length) /1024 /1024 as MB FROM information_schema.tables GROUP BY table_schema;

# データベース毎のサイズをGB単位で
> SELECT table_schema, SUM(data_length+index_length) /1024 /1024/1024 as GB FROM information_schema.tables GROUP BY table_schema;

# カレントのデータベースのサイズを
> USE database1;
> SELECT table_schema, SUM(data_length+index_length) /1024 /1024 as MB FROM information_schema.tables WHERE table_schema = database();

# テーブルごとなら
> show table status;

# データディレクトリを調べて…
mysql> show global variables like 'datadir';

# 実データ 物理データ量
$ ls -l /var/lib/mysql/

ダンプ系

↑ページトップへ

select文からテキスト出力

# タブ区切りでOKなら
SELECT * FROM users INTO OUTFILE '/tmp/users.txt';

# オプション指定すると以下
SELECT * FROM users
INTO OUTFILE '/tmp/users.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"';

ダンプ

# 全データベース
$ mysqldump -u root --all-databases > dump.sql

# ちゃんとロックかけるならxオプション(--single-transactionもオフとなる)
$ mysqldump -u root -x --all-databases > dump.sql

# 特定のデータベースのみ
$ mysqldump -u root データベース名 > dump.sql

# 特定のデータベースのいくつかのテーブルのみ
$ mysqldump -u root データベース名 テーブル名1 テーブル名2 > dump.sql

# 特定のテーブルのINSERT文のみ
$ mysqldump -u root -t データベース名 テーブル名 > dump.sql

# 特定条件のみ(複数テーブルある場合、すべてのテーブルに同条件)
$ mysqldump -u root --where 'is_delete = 0' データベース名 > dump.sql

# トランザクション制御
$ mysqldump -u root --single-transaction データベース名 > dump.sql

# データなし(create tableのみ)(-dでいいのだけどあえて--no-data)
$ mysqldump -u root --no-data データベース名 > dump.sql

# create tableな.sqlとタブ区切りな.txtを出力
$ mysqldump -u root -T データベース名 > dump.sql

# --ignore-tableというオプションもある

復元

↑ページトップへ

# 全データベース
$ mysql -u root -p < dump.sql

# 特定データベースのみ
$ mysql -u root データベース名 < dump.sql
# インポート時に、どこまで進んだか見てみる(INSERT文が覗ける)
mysql> SHOW PROCESSLIST;

# 件数が見たいなら -A オプション付きで起動して
$ mysql -u root -p -A
mysql> use データベース名
mysql> show table status;

障害時

auto increment

↑ページトップへ

初期値を設定する。

テーブル作成時

mysql> CREATE TABLE table (
  INT UNSIGNED AUTO_INCREMENT NOT NULL,
  ...
);
AUTO_INCREMENT = 1001;

あとで

mysql> ALTER TABLE table AUTO_INCREMENT=1001;

初期化の場合(ゼロじゃなくて1)

mysql> ALTER TABLE テーブル名 AUTO_INCREMENT=1;

確認

mysql> SHOW TABLE STATUS WHERE name = 'table';

Perl

↑ページトップへ

トランザクション

DBI

$dbh->{AutoCommit} = 0; # オートコミットしない

# あるいは、AutoCommitをオフにする代わりに…
$dbh->begin_work;

$dbh->{RaiseError} = 1; # エラー時にdieするように
eval {
    aaa() # INSERTとかUPDATEとか…
    $dbh->commit; # コミット
};
if ($@) {
    warn "だめでした!: $@";
    $dbh->rollback; # ロールバック
}

Teng

# オートコミットONで
my $teng = My::DB->new(connect_info => [
    'dbi:mysql:database=testdb', 'user', 'password',
    +{ RaiseError => 1, PrintError => 0, AutoCommit => 1, },
]);

# トランザクション開始(つまり $dbh->begin_work; =AutoCommitオフをしてる)
$teng->txn_begin;
# 処理処理処理…
$teng->txn_commit;

rootのパスワードを忘れてしまった

↑ページトップへ

# 起動しているMySQLを停止
service mysql stop

# MySQLをセーフモードで起動
mysqld_safe --skip-grant-tables &

# MySQLへrootでログイン
mysql -u root

# rootのパスワードのリセット
mysql> use mysql;
mysql> update user set password=NEW_PASSWORD where User='root';
mysql> flush privileges;

# MySQLからログアウト
mysql> quit

# セーフモードのMySQLを停止
service mysqld stop

# 通常モードでMySQL起動
service mysqld start

もろもろ

↑ページトップへ

データディレクトリの中身