Rabbit Slide Show

MySQLの始め方

Description

MySQLの始め方

Text

Page: 1

MySQLの始め方
とみたまさひろ
NSEG #49 MySQL Talk in 長野
2014-03-15
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 2

自己紹介
とみた まさひろ
プログラマー (Ruby & C)
http://tmtms.hatenablog.com
http://twitter.com/tmtms
https://github.com/tmtm
日本MySQLユーザ会代表
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 3

MySQL徹底入門 (の一部)
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 4

MySQL辞典 (の一部)
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 5

OSS貢献者賞
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 6

MySQLとは
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 7

「世界でもっとも普及している
オープンソースデータベース」
http://www-jp.mysql.com/ より
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 8

オープンソース(GPL)なRDBMS
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 9

商用版もあり
MySQL Enterprise Edition
by ORACLE
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 10

バージョン
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 11

バージョン
X.Y.Z
最新安定版は 5.6.16
X.Y がバージョン
Z はリリース毎に増加
X.Y.0 が正式リリースではない
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 12

使ってみよう
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 13

たいていの Linux には含まれてる
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 14

でもちと古い
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 15

今から始めるなら5.6.x
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 16

公式バイナリがおすすめ
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 17

Linux
Windows
OS X
Solaris
FreeBSD
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 18

ダウンロード
http://dev.mysql.com/downloads/mysql/
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 19

インストール
#
#
#
#
#
#
#
MySQLの始め方
cd /usr/local
tar xf /tmp/mysql-5.6.16-linux-glibc2.5-i686.tar.gz
mv mysql-5.6.16-linux-glibc2.5-i686 mysql
cd mysql
./scripts/mysql_install_db
useradd -r mysql
chown -R mysql:mysql .
Powered by Rabbit 2.1.2

Page: 20

起動する前に
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 21

設定ファイル
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 22

my.cnf
この順番に読まれてマージ(重複は後勝ち)
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf (公式バイナリ)
$MYSQL_HOME/my.cnf
--defaults-extra-file で指定したもの
$HOME/.my.cnf
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 23

思わぬものを読んでることも!
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 24

指定したものだけ読む
--defaults-file
コマンドライン引数の先頭に指定
途中に書いてもエラー
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 25

一旦起動すると後で変更するのが
面倒なパラメータもあるので注意
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 26

my.cnf
[mysqld]
user = mysql
character-set-server = utf8
log-error = /var/log/mysqld.err
skip-name-resolve
innodb-file-per-table
sql-mode = TRADITIONAL
[mysql]
default-character-set = utf8
show-warnings
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 27

起動
# /usr/local/mysql/bin/mysqld &
# /usr/local/mysql/bin/mysqld_safe &
# /usr/local/mysql/support-files/
mysql.server start
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 28

停止
% /usr/local/mysql/bin/mysqladmin
-u root shutdown
# /usr/local/mysql/support-files/
mysql.server stop
# kill <PID of mysqld>
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 29

kill -9
ダメ!絶対!
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 30

MySQLはネットワークサーバー
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 31

サーバーとクライアント
サーバー
mysqld
クライアント
mysql
mysqladmin
mysqldump
その他各種アプリ
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 32

待ち受けポート
TCP/IP 3306
UNIXソケット /tmp/mysql.sock
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 33

アクセスするためには認証が必要
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 34

ユーザー管理
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 35

OSのユーザーとは (ほぼ) 無関係
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 36

username@client
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 37

初期状態で
root@localhost
root@127.0.0.1
root@::1
root@ホスト名
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 38

全部パスワードなし
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 39

パスワード設定
% mysql -u root
[自分自身のパスワード]
mysql> set password = password('hogehoge');
[他のユーザーのパスワード]
mysql> set password for root@'127.0.0.1' =
password('fugafuga');
mysql> Ctrl-D
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 40

パスワード設定後
% mysql -u root
% ERROR 1045 (28000): Access denied for user
'root'@'localhost' (using password: NO)
% mysql -u root -p
Enter password:
mysql>
% mysql -u root -phogehoge (-pの後に空白不要)
mysql>
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 41

匿名ユーザー
ユーザー登録してなくてもアクセス可能
% mysql -u tommy
mysql> show databases;
+--------------------+
| Database
|
+--------------------+
| information_schema |
| test
|
+--------------------+
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 42

ユーザー一覧
% mysql -u root
mysql> select user,host from mysql.user;
+------+-----------+
| user | host
|
+------+-----------+
| root | 127.0.0.1 |
| root | ::1
|
|
| localhost |
| root | localhost |
|
| x220
|
| root | x220
|
+------+-----------+
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 43

mysql_secure_installation
root のパスワード設定
匿名ユーザーの削除
リモートからの root アクセス拒否
test データベース削除
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 44

mysql_secure_installation
% mysql_secure_installation
...
% mysql -u root
mysql> select user,host from mysql.user;
+------+-----------+
| user | host
|
+------+-----------+
| root | 127.0.0.1 |
| root | ::1
|
| root | localhost |
+------+-----------+
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 45

不要ユーザーの削除
% mysql -u root
mysql> drop user
mysql> drop user
mysql> drop user
mysql> drop user
mysql> drop user
MySQLの始め方
root@'127.0.0.1';
root@'::1';
root@ホスト名;
''@localhost;
''@ホスト名;
Powered by Rabbit 2.1.2

Page: 46

ユーザー作成
% mysql -u root -p
mysql> create user hoge@localhost
identified by 'パスワード';
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 47

権限付与
mysql> grant 権限 on DB名.TBL名
to user@client;
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 48

権限
All | Alter | Alter routine | Create | Create
routine | Create tablespace | Create
temporary tables | Create user | Create
view | Delete | Drop | Event | Execute | File
| Grant option | Index | Insert | Lock tables
| Process | Proxy | References | Reload |
Replication client | Replication slave |
Select | Show databases | Show view |
Shutdown | Super | Trigger | Update | Usage
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 49

権限
システム全体
データベース
テーブル
カラム
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 50

たいていはこれで事足りるかも
特定のDBに対して全権付与
mysql> grant all on DB名.*
to user@client;
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 51

権限剥奪
mysql> revoke 権限 on DB名.TBL名
from user@client;
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 52

localhost と 127.0.0.1 は違う!
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 53

localhost と 127.0.0.1
初心者はだいたいハマる
localhost は UNIXソケット
/tmp/mysql.sock
mysql -u root -h localhost
127.0.0.1 は TCP/IP
mysql -u root -h 127.0.0.1
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 54

日本語
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 55

文字コード
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 56

初心者は黙ってutf8
(utf8mb4でも可)
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 57

my.cnf
[mysqld]
user = mysql
character-set-server = utf8
log-error = /var/log/mysqld.err
skip-name-resolve
innodb-file-per-table
sql-mode = TRADITIONAL
[mysql]
default-character-set = utf8
show-warnings
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 58

charset と collation
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 59

charset
コードと文字との対応 (「あ」= E3 81 82)
utf8mb4 : 4バイトUTF-8(MySQL 5.5から)
utf8 : 3バイトUTF-8
eucjpms, cp932, ...
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 60

charset
mysql> show charset;
+----------+-----------------------------+---------------------+--------+
| Charset | Description
| Default collation
| Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5
| Big5 Traditional Chinese
| big5_chinese_ci
|
2 |
| dec8
| DEC West European
| dec8_swedish_ci
|
1 |
| cp850
| DOS West European
| cp850_general_ci
|
1 |
| hp8
| HP West European
| hp8_english_ci
|
1 |
| koi8r
| KOI8-R Relcom Russian
| koi8r_general_ci
|
1 |
| latin1
| cp1252 West European
| latin1_swedish_ci
|
1 |
| latin2
| ISO 8859-2 Central European | latin2_general_ci
|
1 |
| swe7
| 7bit Swedish
| swe7_swedish_ci
|
1 |
| ascii
| US ASCII
| ascii_general_ci
|
1 |
| ujis
| EUC-JP Japanese
| ujis_japanese_ci
|
3 |
| sjis
| Shift-JIS Japanese
| sjis_japanese_ci
|
2 |
| hebrew
| ISO 8859-8 Hebrew
| hebrew_general_ci
|
1 |
| tis620
| TIS620 Thai
| tis620_thai_ci
|
1 |
〜
| latin5
| ISO 8859-9 Turkish
| latin5_turkish_ci
|
1 |
| armscii8 | ARMSCII-8 Armenian
| armscii8_general_ci |
1 |
| utf8
| UTF-8 Unicode
| utf8_general_ci
|
3 |
| ucs2
| UCS-2 Unicode
| ucs2_general_ci
|
2 |
〜
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 61

collation
文字の照合規則
utf8_general_ci, utf8_bin,
utf8_unicode_ci, ...
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 62

collation
mysql> show collation;
+--------------------------+----------+-----+---------+----------+---------+
| Collation
| Charset | Id | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci
| big5
| 1 | Yes
| Yes
|
1 |
| big5_bin
| big5
| 84 |
| Yes
|
1 |
| dec8_swedish_ci
| dec8
| 3 | Yes
| Yes
|
1 |
| dec8_bin
| dec8
| 69 |
| Yes
|
1 |
| cp850_general_ci
| cp850
| 4 | Yes
| Yes
|
1 |
| cp850_bin
| cp850
| 80 |
| Yes
|
1 |
| hp8_english_ci
| hp8
| 6 | Yes
| Yes
|
1 |
| hp8_bin
| hp8
| 72 |
| Yes
|
1 |
| koi8r_general_ci
| koi8r
| 7 | Yes
| Yes
|
1 |
| koi8r_bin
| koi8r
| 74 |
| Yes
|
1 |
| latin1_german1_ci
| latin1
| 5 |
| Yes
|
1 |
| latin1_swedish_ci
| latin1
| 8 | Yes
| Yes
|
1 |
〜
| utf8_general_ci
| utf8
| 33 | Yes
| Yes
|
1 |
| utf8_bin
| utf8
| 83 |
| Yes
|
1 |
| utf8_unicode_ci
| utf8
| 192 |
| Yes
|
8 |
| utf8_icelandic_ci
| utf8
| 193 |
| Yes
|
8 |
| utf8_latvian_ci
| utf8
| 194 |
| Yes
|
8 |
| utf8_romanian_ci
| utf8
| 195 |
| Yes
|
8 |
〜
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 63

utf8_general_ci
charset utf8 のデフォルトの collation
ASCII/ラテン文字の大文字小文字を区別し
ない
A = a
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 64

utf8_bin
char(n) binary として宣言した時の
collation
すべての文字を区別する
A != a
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 65

utf8_unicode_ci
Unicode Collation Algorithm (UCA) による
collation
大文字/小文字/全角/半角/カタカナ/ひらが
な/濁音を区別しない
a=A=A(全角)
は=ば=ぱ=ハ=バ=パ=ハ
http://tmtm.org/tmp/mysql_unicode_collation.html
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 66

文字コードが関係するもの
クライアント
接続
データベース
テーブル
カラム
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 67

同じテーブルのカラム毎に異なる
文字コードを指定可能
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 68

クライアント-サーバー間で
自動変換
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 69

ハマりたくなかったらutf8に統一
(utf8mb4でも可)
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 70

ストレージエンジン
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 71

データをディスク (か何か) に保存&取
り出すレイヤ
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 72

SQLのことなんて (あんまり) 知らない
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 73

InnoDB / MyISAM / CSV /
BLACKHOLE / MEMORY /
MRG_MYISAM / ARCHIVE
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 74

InnoDB / MyISAM / CSV /
BLACKHOLE / MEMORY /
MRG_MYISAM / ARCHIVE
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 75

異なるストレージエンジン間で
JOIN / Sub SELECT も可
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 76

MyISAM
以前のデフォルトのストレージエンジン
システムテーブル(mysql.*)で使用
トランザクション、外部キー未対応
テーブルロック
全文検索(日本語不可)
位置情報
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 77

InnoDB
デフォルトのストレージエンジン
トランザクション
レコードロック
全文検索(日本語不可) (5.6 から)
位置情報 (5.0 から)
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 78

初心者は黙ってInnoDB
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 79

mroonga
コミュニティ版ストレージエンジン
高速日本語全文検索 groonga
位置情報
mroonga = groonga ストレージエンジン
毎月肉の日(29日)リリース
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 80

sql_mode
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 81

MySQL特有の 変な 挙動を変更
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 82

MySQL特有の挙動
カラム長を超えてもエラーにならない
不正な文字があってもエラーにならない
指定されたストレージエンジンがないと代替
を使う
日付 0000-00-00, 2014-00-01,
2014-04-31
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 83

MySQL特有の挙動
GROUP BY に指定されてないカラムを
SELECT, HAVING できる
"〜" が文字列リテラル
|| が論理和
等々
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 84

sql_mode
グローバル: my.cnf で指定
グローバル: set global sql_mode = XXXX;
セッション: set sql_mode = XXXX;
http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html
MySQLの始め方
Powered by Rabbit 2.1.2

Page: 85

まとめ
設定ファイルに注意
初期状態のアクセス権は危険
文字コードは utf8 or utf8mb4
ストレージエンジンは InnoDB
MySQL特有の挙動に気をつける
MySQLの始め方
Powered by Rabbit 2.1.2

Other slides