MySQL

2007/12/23更新

対応バージョン: 5.0.51

MySQLのユーザ(アカウント)はCREATE USERやGRANTにて行うのが一般的である。

ここでは例としてデータベースにアクセスする権限によって3種類のユーザを作成する。

super

localhost及び任意のホスト(%)からでもサーバに接続できる完全なスーパーユーザ。

パスワードあり
接続元となるホスト(localhost, %)毎に複数のユーザを作成する必要あり
mysql> GRANT ALL PRIVILEGES ON *.* TO 'super'@'localhost'
    -> IDENTIFIED BY '<パスワード>' WITH GRANT OPTION;

mysql> GRANT ALL PRIVILEGES ON *.* TO 'super'@'%'
    -> IDENTIFIED BY '<パスワード>' WITH GRANT OPTION;

mysql> SELECT user,password,host FROM user WHERE user = 'super';
+-------+-------------------------------------------+-----------+
| user  | password                                  | host      |
+-------+-------------------------------------------+-----------+
| super | *0D8825DC371A083787E8919946F4FFDECE2F4DDF | localhost | 
| super | *80E73635CAEDFEE27398D5CBCBAB02EB88BD3C9B | %         | 
+-------+-------------------------------------------+-----------+

admin

localhostからのみ接続できる管理者ユーザ。

パスワードあり
管理権限は「RELOAD」と「PROCESS」

この権限はmysqladmin reload、mysqladmin refresh、mysqladmin flush-xxx、mysqladmin processlistといった管理系のコマンドを実行できる。

mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost'
    -> IDENTIFIED BY '<パスワード>' WITH GRANT OPTION;

mysql> SELECT user,password,host FROM user WHERE user = 'admin';
+-------+-------------------------------------------+-----------+
| user  | password                                  | host      |
+-------+-------------------------------------------+-----------+
| admin | *C20003C6C9FA015E80D75D36F54C4450D98F7828 | localhost | 
+-------+-------------------------------------------+-----------+

guest

localhostからのみ接続できるゲストユーザ。

パスワードなし
管理権限は「USAGE」

この権限を設定すると全てのグローバル権限が「N」(権限なし)になる。

mysql> GRANT USAGE ON *.* TO 'guest'@'localhost';

mysql> SELECT user,password,host FROM user WHERE user = 'guest';
+-------+----------+-----------+
| user  | password | host      |
+-------+----------+-----------+
| guest |          | localhost | 
+-------+----------+-----------+

2007/12/23更新

対応バージョン: 5.0.51

SELECTなどでデータを参照する場合通常はカラムが横に並ぶが、-Eオプション付でmysqlコマンドを実行することによって1行につき1カラムを表示させることができる。

通常

# mysql test -u root -e "select * from pet;"
+----------+-------+------+------+------------+
| name     | owner | type | sex  | birth      |
+----------+-------+------+------+------------+
| Whistler | Bob   | bird | NULL | 2006-03-09 | 
| Lucker   | Alice | dog  | f    | 2003-03-30 | 
+----------+-------+------+------+------------+

-Eオプション付

# mysql test -u root -E -e "select * from pet;"
*************************** 1. row ***************************
 name: Whistler
owner: Bob
 type: bird
  sex: NULL
birth: 2006-03-09
*************************** 2. row ***************************
 name: Lucker
owner: Alice
 type: dog
  sex: f
birth: 2003-03-30

2007/12/19更新

対応バージョン: 5.0.51

テーブルの作成にはCREATE TABLE文を使う。

ここでは例として空のデータベースにペットに関するテーブルを作成する。

mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
    -> type VARCHAR(20), sex CHAR(1), birth DATE);
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| pet            | 
+----------------+

mysql> DESCRIBE pet;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | YES  |     | NULL    |       | 
| owner | varchar(20) | YES  |     | NULL    |       | 
| type  | varchar(20) | YES  |     | NULL    |       | 
| sex   | char(1)     | YES  |     | NULL    |       | 
| birth | date        | YES  |     | NULL    |       | 
+-------+-------------+------+-----+---------+-------+

続けて外部ファイルからデータを取り込んでみる。

まず/tmp/pet.txtというファイルを以下の内容で作成する。区切り文字はタブにし、NULLを挿入したいカラムは「\N」と記述する。

Whistler        Bob     bird    \N      2007-03-09      

次にこのファイルをLOAD DATA文で読み込む。

mysql> LOAD DATA INFILE "/tmp/pet.txt" INTO TABLE pet;
Query OK, 1 row affected (0.00 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0

読み込まれたかどうか確認する。

mysql> SELECT * FROM pet;
+----------+-------+------+------+------------+
| name     | owner | type | sex  | birth      |
+----------+-------+------+------+------------+
| Whistler | Bob   | bird | NULL | 2007-03-09 | 
+----------+-------+------+------+------------+

今度はSQL文でデータをインサートしてみる。

mysql> INSERT INTO pet
    -> VALUES ('Lucker','Alice','dog','f','2003-03-30');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM pet;
+----------+-------+------+------+------------+
| name     | owner | type | sex  | birth      |
+----------+-------+------+------+------------+
| Whistler | Bob   | bird | NULL | 2006-03-09 | 
| Lucker   | Alice | dog  | f    | 2003-03-30 | 
+----------+-------+------+------+------------+

2007/12/19更新

対応バージョン: 5.0.51

リストアはその目的に応じていろいろな方法があるが、ここでは代表的なものを示す。

テーブルのリストア

ある特定のテーブルについて、前回バックアップ取得時点までのリストアを行う場合はまずそのテーブルを再作成した後に全データをロードすればよい。

# mysql <DB> < <テーブル定義ファイル>
# mysql <DB> -e "LOAD DATA INFILE '<データファイル>' INTO TABLE <対象テーブル>;"

例) test.petテーブルをリストアする

# mysql test < pet.sql
# mysql test -e "LOAD DATA INFILE '/tmp/pet.txt' INTO TABLE pet;"

データベース全体のリストア

サーバダウンからの復旧

カーネルクラッシュやデータベースサーバの強制終了のような場合、データベースサーバを再起動すれば自動的にデータベースが復旧する可能性が高い。

(ログファイル)

071218 19:20:05  mysqld started
071218 19:20:05  InnoDB: Started; log sequence number 0 43655
071218 19:20:05 [Note] Recovering after a crash using mysql-bin
071218 19:20:05 [Note] Starting crash recovery...
071218 19:20:05 [Note] Crash recovery finished.
071218 19:20:05 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
Version: '5.0.51-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution

(*) ストレージエンジンはInnoDBとする。

自動的に復旧しない場合、次項のバックアップファイルからのリストアが必要となる。

ファイルシステムクラッシュからのリストア

ハードウェア障害等でファイルシステムがクラッシュしたような場合は自動的に復旧しないと考えられるのでバックアップファイルからのリストアが必要となる。

# mysql < <バックアップファイル>

さらにこのバックアップファイル以降のデータはインクリメンタルバックアップとしてログファイルに記録されているので、続けて以下の操作を行って直近の整合性が取れている状態までリストアする。

尚、この例ではバックアップファイル以降のインクリメンタルバックアップは以下の2ファイルとする。

# cd /usr/local/mysql/var
# mysqlbinlog mysql-bin.000007 mysql-bin.000008 | mysql

関連資料・記事

2014/11/01更新

対応バージョン: 5.1.73

MySQLのレプリケーションが何らかの原因で同期されなくなった場合の復旧方法を示す。

基本的には以下の資料にあるように最初からレプリケーションを行うのと同じ流れになる。

関連資料・記事

状態確認

まずスレーブの状態を確認する。

この例のように2つのRunningがともにYesでない場合、レプリケーションに失敗している。

mysql> show slave status\G
:
Slave_IO_Running: Yes
Slave_SQL_Running: No
:

復旧

復旧方法はまずスレーブ側でスレーブ機能を停止し、マスタのDBデータをexportしてそれを再度importすればよい。

スレーブ
mysql> stop slave;
mysql> show slave status\G
:
Slave_IO_Running: No
Slave_SQL_Running: No
:
マスタ

スレーブ側で指定する情報を確認した上でDBデータをファイルに出力する。

mysql> show master status\G
:
File: mysql-bin.000007
Position: 626148
:

mysql> flush tables with read lock;
mysql> exit
Bye

# mysqldump -u root -p --all-databases --lock-all-tables --events > /var/tmp/db.dump

このファイルをスレーブ側にコピーしてインポートし、レプリケーションを開始する。

スレーブ
# mysql -u root -p < /var/tmp/db.dump

# mysql -u root -p

mysql> change master to
master_host='xxx.xxx.xxx.xxx', <-------- マスタのIPアドレス
master_user='xxxxx', <------------------ レプリケーション用に作成したアカウント
master_password='********', <----------- 上記アカウントのパスワード
master_log_file='mysql-bin.xxxxxx', <--- マスタ側show master statusのFile
master_log_pos=xxxxx; <----------------- マスタ側show master statusのPosition

mysql> slave start;

mysql> show slave status\G
:
Master_Log_File: mysql-bin.000007
:
Read_Master_Log_Pos: 626148
:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
:

ログファイル名とログポジションがマスタと同じでRunningが両方Yesになっていればレプリケーションは正常に動作している。

2014/8/21更新

対応バージョン: 5.1.73

2台のMySQLサーバでレプリケーションを構成する手順を示す。

マスタ/スレーブで同じ作業を実施するものと別々の作業を実施するものがあるので注意すること。

レプリケーション用ポート開け(マスタ/スレーブとも)

レプリケーション用に3306/tcpポートを開ける。

# cd /etc/sysconfig
# cp -p iptables iptables.YYYYMMDD
# vi iptables

以下の行を追加
# MySQL Replication
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

設定を有効にするためにiptablesを再起動する。

# service iptables restart

my.cnf設定変更(マスタ側)

マスタを識別するための一意のIDを割り当てる。IDは任意の数字でよい。

# cd /etc
# cp -p my.cnf my.cnf.YYYYMMDD
# vi my.cnf

(以下の設定を追加)

[mysqld]
log-bin=mysql-bin <--- 固定
server-id=121 <------- マスタ識別ID

設定を有効にするためにmysqldを再起動する。

# service mysqld restart

スレーブ側から接続する為のアカウントを作成する。

# mysql -u root -p
mysql> grant replication slave on *.* to repl identified by '<パスワード>';

初期データ移行

マスタのデータをスレーブ側に一旦持っていく。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+

mysql> flush tables with read lock;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      471 |              |                  |
+------------------+----------+--------------+------------------+

ここで表示されたFileとPositionはスレーブ側の設定で使用するのでメモしておく。

いったん別端末を起動してデータをダンプし、スレーブにコピーする。

# mysqldump -u root -p --all-databases --lock-all-tables --events > /var/tmp/dbdump.db
# scp /var/tmp/db.dump root@<スレーブ側IPアドレス>:/var/tmp

コピーが終わったらロックを解除する。

mysql> unlock tables;

my.cnf設定変更(スレーブ側)

スレーブを識別するための一意のIDを割り当てる。IDは任意の数字でよい。

# cd /etc
# cp -p my.cnf my.cnf.YYYYMMDD
# vi my.cnf

(以下の設定を追加)

[mysqld]
server-id=122 <------- スレーブ識別ID

設定を有効にするためにmysqldを再起動する。

# service mysqld restart

先ほどマスタで作成したダンプデータを取り込む。

# mysql -u root -p < /var/tmp/db.dump
# mysql -u root -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+

マスタ情報を登録登録する(マスタ側のshow master statusの結果を使用)

mysql> change master to
master_host='xxx.xxx.xxx.xxx', <-------- マスタのIPアドレス
master_user='repl', <------------------- レプリケーション用に作成したアカウント
master_password='********', <----------- 上記アカウントのパスワード
master_log_file='mysql-bin.000001', <--- マスタ側show master statusのFile
master_log_pos=471; <------------------- マスタ側show master statusのPosition

スレーブを開始する。

mysql> start slave;
mysql> quit

テスト

マスタ側で作成したDBがスレーブ側にコピーされていることを確認する。

マスタ側

mysql> create database repltest;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| repltest           |
| test               |
+--------------------+

スレーブ側

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| repltest <---------|-- 作成されている
| test               |
+--------------------+

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.121
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 722
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 431
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 722
              Relay_Log_Space: 587
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:

2009/2/6更新

対応バージョン: 5.1.30

MySQLのrootのパスワードを忘れてしまった場合などに初期化する手順を示す。

ここではFedora 10にインストールしてあるMySQLの場合を示す。

サーバ停止

% sudo service mysql.server stop

--skip-grant-tablesオプション付でサーバ起動

これによりユーザ権限のチェックをスキップした状態でサーバが起動する。

% sudo /usr/local/mysql/bin/mysqld_safe -u root --skip-grant-tables &

パスワード初期化

サーバに接続し、rootのパスワードを初期化する。

% mysql mysql
mysql> UPDATE user SET Password='' WHERE Host='localhost' and User='root';
mysql> FLUSH PRIVILEGES;

設定後、内容を反映するため「FLUSH PRIVILEGES」を実行する。

この段階で以下のようにしてパスワードを設定してもよい。

mysql> UPDATE user SET Password=password('pwd123') WHERE Host='localhost' and User='root';

サーバ再起動

% sudo service mysql.server restart

サーバ接続

これでパスワードなしでサーバに接続できるようになる。上記でパスワードを設定した場合はパスワードを指定して接続する。

(パスワードを設定していない場合)

% mysql mysql -u root
mysql>

(既にパスワードを設定している場合)

% mysql mysql -u root -p
Enter password: <現在のパスワード>
mysql>

パスワード再設定

新たにパスワードを設定する場合はmysqladminが使用できる。

(パスワードを設定していない場合)

% mysqladmin password -u root <新しいパスワード>

(既にパスワードを設定している場合)

% mysqladmin password -u root -p <新しいパスワード>
Enter password: <現在のパスワード>

2007/12/19更新

対応バージョン: 5.0.51

当該サーバで定義されている全てのオブジェクトを表示するには以下のように3種類のINFORMATION_SCHEMAをUNION ALLで結合すればよい。

mysql> SELECT
    ->    TABLE_SCHEMA AS object_schema
    ->   ,TABLE_NAME   AS object_name
    ->   ,TABLE_TYPE   AS object_type
    -> FROM INFORMATION_SCHEMA.TABLES
    -> 
    -> UNION ALL
    -> 
    -> SELECT
    ->    ROUTINE_SCHEMA
    ->   ,ROUTINE_NAME
    ->   ,ROUTINE_TYPE
    -> FROM INFORMATION_SCHEMA.ROUTINES
    -> 
    -> UNION ALL
    -> 
    -> SELECT
    ->    TRIGGER_SCHEMA
    ->   ,TRIGGER_NAME
    ->   ,'TRIGGER'
    -> FROM INFORMATION_SCHEMA.TRIGGERS
    -> 
    -> ORDER BY object_schema, object_type, object_name;

+------------------+-------------------------------------+-----------+
|object_schema     |object_name                          |object_type|
+------------------+-------------------------------------+-----------+
|information_schema|CHARACTER_SETS                       |SYSTEM VIEW| 
|information_schema|COLLATIONS                           |SYSTEM VIEW| 
|information_schema|COLLATION_CHARACTER_SET_APPLICABILITY|SYSTEM VIEW| 
|information_schema|COLUMNS                              |SYSTEM VIEW| 
|information_schema|COLUMN_PRIVILEGES                    |SYSTEM VIEW| 
|information_schema|KEY_COLUMN_USAGE                     |SYSTEM VIEW| 
|information_schema|PROFILING                            |SYSTEM VIEW| 
|information_schema|ROUTINES                             |SYSTEM VIEW| 
|information_schema|SCHEMATA                             |SYSTEM VIEW| 
|information_schema|SCHEMA_PRIVILEGES                    |SYSTEM VIEW| 
|information_schema|STATISTICS                           |SYSTEM VIEW| 
|information_schema|TABLES                               |SYSTEM VIEW| 
|information_schema|TABLE_CONSTRAINTS                    |SYSTEM VIEW| 
|information_schema|TABLE_PRIVILEGES                     |SYSTEM VIEW| 
|information_schema|TRIGGERS                             |SYSTEM VIEW| 
|information_schema|USER_PRIVILEGES                      |SYSTEM VIEW| 
|information_schema|VIEWS                                |SYSTEM VIEW| 
|mysql             |columns_priv                         |BASE TABLE | 
|mysql             |db                                   |BASE TABLE | 
|mysql             |func                                 |BASE TABLE | 
|mysql             |help_category                        |BASE TABLE | 
|mysql             |help_keyword                         |BASE TABLE | 
|mysql             |help_relation                        |BASE TABLE | 
|mysql             |help_topic                           |BASE TABLE | 
|mysql             |host                                 |BASE TABLE | 
|mysql             |proc                                 |BASE TABLE | 
|mysql             |procs_priv                           |BASE TABLE | 
|mysql             |tables_priv                          |BASE TABLE | 
|mysql             |time_zone                            |BASE TABLE | 
|mysql             |time_zone_leap_second                |BASE TABLE | 
|mysql             |time_zone_name                       |BASE TABLE | 
|mysql             |time_zone_transition                 |BASE TABLE | 
|mysql             |time_zone_transition_type            |BASE TABLE | 
|mysql             |user                                 |BASE TABLE | 
|test              |pet                                  |BASE TABLE | 
|test              |test_proc                            |PROCEDURE  | 
|test              |test_trigger                         |TRIGGER    | 
|test              |test_view                            |VIEW       | 
+------------------+-------------------------------------+-----------+

関連資料・記事

2007/12/19更新

対応バージョン: 5.0.51

INFORMATION_SCHEMA(情報スキーマ)を利用するとデータベースメタデータへのアクセスが可能になる。

INFORMATION_SCHEMAはSQL:2003(ISO/IEC 9075:2003)で定められているシステムカタログへの標準インタフェースで、他のDBMSでも実装されつつある。

MySQLではこの標準に加えて独自の拡張項目があるが、ここでは触れない。

例えばすべてのデータベースのすべてのユーザテーブルを表示するには以下のクエリを実行する。

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS
    -> FROM INFORMATION_SCHEMA.TABLES
    -> WHERE TABLE_TYPE = "BASE TABLE"
    -> ORDER BY TABLE_SCHEMA, TABLE_NAME;
+--------------+---------------------------+------------+
| TABLE_SCHEMA | TABLE_NAME                | TABLE_ROWS |
+--------------+---------------------------+------------+
| mysql        | columns_priv              |          0 | 
| mysql        | db                        |          2 | 
| mysql        | func                      |          0 | 
| mysql        | help_category             |          0 | 
| mysql        | help_keyword              |          0 | 
| mysql        | help_relation             |          0 | 
| mysql        | help_topic                |          0 | 
| mysql        | host                      |          0 | 
| mysql        | proc                      |          0 | 
| mysql        | procs_priv                |          0 | 
| mysql        | tables_priv               |          0 | 
| mysql        | time_zone                 |          0 | 
| mysql        | time_zone_leap_second     |          0 | 
| mysql        | time_zone_name            |          0 | 
| mysql        | time_zone_transition      |          0 | 
| mysql        | time_zone_transition_type |          0 | 
| mysql        | user                      |          5 | 
| test         | pet                       |          2 | 
+--------------+---------------------------+------------+

TABLE_TYPEには以下の種類がある。

BASE TABLE

ユーザテーブル

VIEW

ビュー

SYSTEM VIEW

システムビュー

PROCEDURE

ストアドプロシージャ

FUNCTION

ファンクション

TRIGGER

トリガ

その他、主な情報スキーマを以下に示す。

INFORMATION_SCHEMA.SCHEMATA

データベース情報

例)

mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME
    -> FROM INFORMATION_SCHEMA.SCHEMATA;
+--------------------+----------------------------+
| SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME |
+--------------------+----------------------------+
| information_schema | utf8                       | 
| mysql              | latin1                     | 
| test               | latin1                     | 
+--------------------+----------------------------+

データベースの一覧は以下のようにしても参照できる。

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| test               | 
+--------------------+

INFORMATION_SCHEMA.COLUMNS

カラム情報

例)

mysql> SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE,
    -> COLUMN_KEY, COLUMN_DEFAULT, EXTRA
    -> FROM INFORMATION_SCHEMA.COLUMNS
    -> WHERE TABLE_NAME = 'pet';
+-----------+-----------+-----------+----------+--------------+-----+
|COLUMN_NAME|COLUMN_TYPE|IS_NULLABLE|COLUMN_KEY|COLUMN_DEFAULT|EXTRA|
+-----------+-----------+-----------+----------+--------------+-----+
|name       |varchar(20)|YES        |          |NULL          |     | 
|owner      |varchar(20)|YES        |          |NULL          |     | 
|type       |varchar(20)|YES        |          |NULL          |     | 
|sex        |char(1)    |YES        |          |NULL          |     | 
|birth      |date       |YES        |          |NULL          |     | 
+-----------+-----------+-----------+----------+--------------+-----+

これは以下と同義である。

mysql> SHOW COLUMNS FROM pet;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | YES  |     | NULL    |       | 
| owner | varchar(20) | YES  |     | NULL    |       | 
| type  | varchar(20) | YES  |     | NULL    |       | 
| sex   | char(1)     | YES  |     | NULL    |       | 
| birth | date        | YES  |     | NULL    |       | 
+-------+-------------+------+-----+---------+-------+

INFORMATION_SCHEMA.USER_PRIVILEGES

ユーザ権限

例)

mysql> SELECT GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE
    -> FROM INFORMATION_SCHEMA.USER_PRIVILEGES;
+--------------------+----------------+--------------+
| GRANTEE            | PRIVILEGE_TYPE | IS_GRANTABLE |
+--------------------+----------------+--------------+
| 'root'@'localhost' | SELECT         | YES          | 
| 'root'@'localhost' | INSERT         | YES          | 
| 'root'@'localhost' | UPDATE         | YES          | 
| 'root'@'localhost' | DELETE         | YES          | 
| 'root'@'localhost' | CREATE         | YES          | 
| 'root'@'localhost' | DROP           | YES          | 
   :

INFORMATION_SCHEMA.VIEWS

ビュー定義

例)

mysql> SELECT TABLE_SCHEMA, TABLE_NAME
    -> FROM INFORMATION_SCHEMA.VIEWS;
+--------------+------------+
| TABLE_SCHEMA | TABLE_NAME |
+--------------+------------+
| test         | test_view  | 
+--------------+------------+

INFORMATION_SCHEMA.ROUTINES

ストアドプロシージャ/ファンクション定義

例)

mysql> SELECT ROUTINE_SCHEMA, ROUTINE_NAME
    -> FROM INFORMATION_SCHEMA.ROUTINES;
+----------------+--------------+
| ROUTINE_SCHEMA | ROUTINE_NAME |
+----------------+--------------+
| test           | test_proc    | 
+----------------+--------------+

INFORMATION_SCHEMA.TRIGGERS

トリガ定義

例)

mysql> SELECT TRIGGER_SCHEMA, TRIGGER_NAME
    -> FROM INFORMATION_SCHEMA.TRIGGERS;
+----------------+--------------+
| TRIGGER_SCHEMA | TRIGGER_NAME |
+----------------+--------------+
| test           | test_trigger | 
+----------------+--------------+

INFORMATION_SCHEMA.CHARACTER_SETS

サポートされている文字コードセット

例)

mysql> SELECT * FROM INFORMATION_SCHEMA.CHARACTER_SETS;
+------------------+--------------------+---------------------+------+
|CHARACTER_SET_NAME|DEFAULT_COLLATE_NAME|DESCRIPTION          |MAXLEN|
+------------------+--------------------+---------------------+------+
 :
|latin1            |latin1_swedish_ci   |cp1252 West European |     1| 
 :
|ascii             |ascii_general_ci    |US ASCII             |     1| 
 :
|utf8              |utf8_general_ci     |UTF-8 Unicode        |     3| 
|binary            |binary              |Binary pseudo charset|     1| 
 :

2007/12/19更新

対応バージョン: 5.0.51

トリガを定義する場合などのようにクエリ内で「;」を使用したい場合、そのままだとクエリの終端文字(デリミタ)として扱われてしまうのでこれを無視させたい場合はdelimiterコマンドを使用してデリミタを別の文字に変更する。

例)

mysql> delimiter // ←デリミタを「//」に変更する

mysql> CREATE TRIGGER test BEFORE INSERT ON sample
    -> FOR EACH ROW
    -> BEGIN
    ->   IF NEW.type = 'dog' THEN
    ->     SET NEW.type = '犬';
    ->   ELSE
    ->     SET NEW.type = 'その他';
    ->   END IF;
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ; ←デリミタを元に戻す

2007/12/19更新

対応バージョン: 5.0.51

MySQLの管理コマンドには以下のようなものがある。

mysqladmin

MySQLの管理全般を行う。

サブコマンドを指定することにより様々な管理作業が行える。

以下、サブコマンドの一例を示す。

variables

サーバのインストール状況を表示する。

# mysqladmin variables
+--------------------------+-------------------------+
| Variable_name            | Value                   |
+--------------------------+-------------------------+
| auto_increment_increment | 1                       |
| auto_increment_offset    | 1                       |
| automatic_sp_privileges  | ON                      |
| back_log                 | 50                      |
| basedir                  | /usr/local/mysql/       |
:
| version                  | 5.0.51-log              |
| version_comment          | Source distribution     |
| version_compile_machine  | i686                    |
| version_compile_os       | redhat-linux-gnu        |
| wait_timeout             | 28800                   |
+--------------------------+-------------------------+

password

MySQL内のユーザにパスワードを設定する。

# mysqladmin password -u <ユーザ> <パスワード>

mysqlshow

DB/テーブルの一覧や内容を表示する。

DBの一覧を表示する

# cd /usr/local/mysql/var
# mysqlshow
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+

特定のDBのテーブル一覧を表示する

# mysqlshow mysql
Database: mysql
+---------------------------+
|          Tables           |
+---------------------------+
| columns_priv              |
| db                        |
| func                      |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| proc                      |
| procs_priv                |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+

mysql

データベース内のデータにアクセスする。

SQLの指定はいったんDBに接続して専用プロンプトにて行うか、-eオプションを使ってコマンドラインからそのまま記述する。

# mysql mysql
mysql> SELECT Host,Db,User FROM db;

+------+---------+------+
| Host | Db      | User |
+------+---------+------+
| %    | test    |      | 
| %    | test\_% |      | 
+------+---------+------+

上記と同じ結果が以下のようにしても得られる。

# mysql -e "SELECT Host,Db,User FROM db" mysql

その他、一般のDBMSと同じように様々な情報にアクセスできる。

以下、一例を示す。

データベース一覧を表示

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| test               | 
+--------------------+

使用するデータベースを切り替える

mysql> USE test
Database changed

現在のデータベースを表示

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| test       | 
+------------+

テーブル一覧を表示

mysql> SHOW TABLES;
+-----------------+
| Tables_in_mysql |
+-----------------+
| foo             | 
| bar             | 
| com             | 
+-----------------+

システム変数の内容を表示

mysql> SELECT VERSION(), CURRENT_DATE(), NOW();
+------------+----------------+---------------------+
| VERSION()  | CURRENT_DATE() | NOW()               |
+------------+----------------+---------------------+
| 5.0.51-log | 2007-12-13     | 2007-12-13 16:57:08 | 
+------------+----------------+---------------------+

計算機として利用

mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------+---------+
| SIN(PI()/4)      | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 |      25 | 
+------------------+---------+

2007/12/19更新

対応バージョン: 5.0.51

/etc/my.cnfに以下の設定を追加してサーバを再起動する。

サーバ側

[mysqld]
:
default-character-set = <キャラクターセット>

クライアント側

[mysql]
:
default-character-set = <キャラクターセット>

指定できるキャラクターセットは以下のようにして確認できる。

mysql> SHOW CHARSET;
+--------+---------------------------+-------------------+------+
|Charset |Description                |Default collation  |Maxlen|
+--------+---------------------------+-------------------+------+
|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| 
|hebrew  |ISO 8859-8 Hebrew          |hebrew_general_ci  |     1| 
|koi8u   |KOI8-U Ukrainian           |koi8u_general_ci   |     1| 
|greek   |ISO 8859-7 Greek           |greek_general_ci   |     1| 
|cp1250  |Windows Central European   |cp1250_general_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| 
|cp866   |DOS Russian                |cp866_general_ci   |     1| 
|keybcs2 |DOS Kamenicky Czech-Slovak |keybcs2_general_ci |     1| 
|macce   |Mac Central European       |macce_general_ci   |     1| 
|macroman|Mac West European          |macroman_general_ci|     1| 
|cp852   |DOS Central European       |cp852_general_ci   |     1| 
|latin7  |ISO 8859-13 Baltic         |latin7_general_ci  |     1| 
|cp1251  |Windows Cyrillic           |cp1251_general_ci  |     1| 
|cp1256  |Windows Arabic             |cp1256_general_ci  |     1| 
|cp1257  |Windows Baltic             |cp1257_general_ci  |     1| 
|binary  |Binary pseudo charset      |binary             |     1| 
|geostd8 |GEOSTD8 Georgian           |geostd8_general_ci |     1| 
+--------+---------------------------+-------------------+------+

現在のキャラクターセットは以下のようにして確認できる。

mysql> status;
:
(サーバ側のキャラクターセット)
Server characterset:  utf8
Db     characterset:  utf8

(クライアント側のキャラクターセット)
Client characterset:  latin1
Conn.  characterset:  latin1
:

2007/12/23更新

対応バージョン: 5.0.51

バイナリログは、ローテーションして使われる複数のログファイルとそれを管理するインデックスファイルとで構成される。

ファイルは/usr/local/mysql/var配下に格納され、それぞれ以下のようなファイル名で管理される。

ログファイル(複数)

データベースに対して実施した作業がタイムスタンプとともに格納されている。

後述のmysqlbinlogコマンドで内容を参照することが可能。

mysql-bin.000001
mysql-bin.000002
      :

インデックスファイル

ログファイルの名前が1行ずつ記述されている。

mysql-bin.index

バイナリログの使用状況は以下のクエリによって確認できる。

# mysql -u root -E -e "SHOW BINLOG EVENTS"
*************************** 1. row ***************************
   Log_name: mysql-bin.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 98
       Info: Server ver: 5.0.51-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql-bin.000001
        Pos: 98
 Event_type: Query
  Server_id: 1
End_log_pos: 1712
       Info: use `mysql`; CREATE TABLE IF NOT EXISTS db (Host char(60) ...(略)
:
*************************** 33. row ***************************
   Log_name: mysql-bin.000001
        Pos: 14838
 Event_type: Query
  Server_id: 1
End_log_pos: 14921
       Info: use `mysql`; DROP TABLE tmp_user
*************************** 34. row ***************************
   Log_name: mysql-bin.000001
        Pos: 14921
 Event_type: Stop
  Server_id: 1
End_log_pos: 14940
       Info: 

バイナリログの個別ファイル内の詳細情報はmysqlbinlogにて確認できる。

# mysqlbinlog mysql-bin.000001 | cat -n
 1  /*!40019 SET @@session.max_insert_delayed_threads=0*/;
 2  /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
 3  DELIMITER /*!*/;
 4  # at 4
 5  #071223  0:53:01 server id 1  end_log_pos 98    Start: binlog v 4, server v 5.0.51-log created 071223  0:53:01 at startup
 6  ROLLBACK/*!*/;
 7  # at 98
 8  #071223  0:53:01 server id 1  end_log_pos 1712  Query   thread_id=1     exec_time=0   error_code=0
 9  use mysql/*!*/;
10  SET TIMESTAMP=1198338781/*!*/;
11  SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1/*!*/;
12  SET @@session.sql_mode=0/*!*/;
13  /*!\C utf8 *//*!*/;
14  SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
15  CREATE TABLE IF NOT EXISTS db (Host char(60) binary DEFAULT '' ...
    :

このようにバイナリログではデータベースに加えられた作業を全て位置情報(pos)及びタイムスタンプとともに記録しているので、前回バックアップ時以降のロールフォワードや任意の時点への復旧などが簡単に行える。

2014/08/31更新

対応バージョン: 5.1.73

mysqldumpで全DBのバックアップを取得すると以下のような警告が出る。

% mysqldump -u root -p --all-databases --lock-all-tables > /var/tmp/dbdump.db
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

これはMySQLのバージョン5.1.8からmysqlデータベースにeventテーブルが追加され、これがデフォルトではバックアップされない設定になっているからで、eventテーブルもバックアップしたい場合は--eventsオプションを付ければよい。

% mysqldump -u root -p --all-databases --lock-all-tables --events > /var/tmp/dbdump.db

2007/12/23更新

対応バージョン: 5.0.51

# mysqldump --tab=/tmp/bkup test
mysqldump: Got error: 1: Can't create/write to file '/tmp/bkup/foo.txt'
  (Errcode: 13) when executing 'SELECT INTO OUTFILE'

foo.txtはMySQL管理者アカウント(デフォルト:mysql)の権限で作成されるので、当該ディレクトリはそのアカウントで書き込みができる必要がある。

関連資料・記事

2007/12/19更新

対応バージョン: 5.0.51

バックアップ運用を行うにあたりデータベースの総量が増えてくると毎回フルバックアップを取得するのに時間もかかりディスク容量も必要とする。

そのような場合、前回バックアップ以降はインクリメンタルバックアップを使用する方法がある。

インクリメンタルバックアップのログファイルは自動的に取得され、/usr/local/mysql/var配下に以下のようなファイル名で作成される。

-rw-rw---- 1 mysql mysql 14940 2007-12-13 12:43 mysql-bin.000001
-rw-rw---- 1 mysql mysql   117 2007-12-13 12:43 mysql-bin.000002
-rw-rw---- 1 mysql mysql   255 2007-12-13 15:22 mysql-bin.000003
-rw-rw---- 1 mysql mysql   117 2007-12-13 15:37 mysql-bin.000004
-rw-rw---- 1 mysql mysql  3995 2007-12-18 19:03 mysql-bin.000005
-rw-rw---- 1 mysql mysql   325 2007-12-18 19:09 mysql-bin.000006
-rw-rw---- 1 mysql mysql   268 2007-12-18 19:12 mysql-bin.000007
-rw-rw---- 1 mysql mysql 22655 2007-12-18 19:35 mysql-bin.000008
-rw-rw---- 1 mysql mysql   152 2007-12-18 19:20 mysql-bin.index

最後のmysql-bin.indexはテキストファイルで、ログファイルの一覧(mysql-bin.000001〜000008)が記載されている。

このログファイルはMySQLサーバ起動時に1ずつインクリメントされ、前回のログファイルは使われなくなる。

使われなくなったログファイルはそのままではディスクを消費するだけなので、例えばフルバックを取得する際に--delete-master-logsオプションを付けることによって不要なファイルが削除される(ただしレプリケーション環境において当該サーバがマスタの場合、--delete-master-logsを使用するとスレーブとの同期が取れなくなる恐れがあるのでPURGE MASTER LOGSを使用する)。

# mysqldump --single-transaction --flush-logs --master-data \
--all-databases --delete-master-logs > backup.sql

尚、--flush-logsオプションはログファイルの切り替え指示、--master-dataオプションは以下のようにログファイル名をバックアップファイル中に出力する指示である。

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=98;

バックアップを伴わずにログファイルだけを切り替える場合は以下のようにする。

# mysqladmin flush-logs

関連資料・記事

2007/12/19更新

対応バージョン: 5.0.51

静的バックアップには以下の2通りの方法があるので目的に応じてどちらかを選ぶ。

mysqldump

mysqldumpはテーブルの定義とデータをテキストファイルで出力する。

# mysqldump --tab=<バックアップ先ディレクトリ> <DB名>

これによりバックアップ先ディレクトリにテーブル毎に以下の2ファイルが作成される。

<テーブル>.sql

テーブル定義(CREATE TABLE文)

<テーブル>.txt

データ(テキスト形式)

全てのデータベースのフルダンプを行う場合は以下のようにする。

# mysqldump --single-transaction --all-databases > backup.sql

(*) --single-transactionオプションによりmysqldumpで使用したデータは変更しない。

(*) ストレージエンジンはInnoDBとする。

mysqlhotcopy

mysqlhotcopyは/usr/local/mysql/var/配下のファイルをそのままの形式で別のディレクトリ、あるいは別のDBにコピーする。

# mysqlhotcopy <DB名> <バックアップ先ディレクトリ>

これによりバックアップ先ディレクトリにDB名のディレクトリが作成され、配下に以下の3ファイルがテーブル毎に作成される。

<テーブル>.MYD

データ

<テーブル>.MYI

インデックス

<テーブル>.frm

テーブル定義

尚、このツールはPerlのDBIモジュールを使用するので同モジュールがあらかじめインストールされている必要がある。

関連資料・記事

2009/2/1更新

対応バージョン: 5.1.30

公式サイト

準備

導入OS

Fedora 10

管理用アカウント作成

% sudo groupadd -r mysql
% sudo useradd -r -g mysql -d /usr/local/mysql -s /sbin/nologin mysql

環境変数設定(root、及び利用者毎)

<既存の設定に追加>
PATH

/usr/local/mysql/bin

インストール

配布ファイル展開

% tar zxvf mysql-5.1.30.tar.gz
% cd mysql-5.1.30

make,インストール

% ./configure \
--prefix=/usr/local/mysql \
--with-charset=utf8 \
--with-extra-charsets=all \
--with-mysqld-user=mysql

% make
% sudo make install

インストール物 (man,infoは除く)

/usr/local/mysql/*/*

各種設定

設定ファイル配置

用途に応じて数種類の雛形が用意されているので適切なファイルをコピーして使用する。

my-small.cnf

〜64M未満メモリ搭載システム用

my-medium.cnf

〜128Mメモリ搭載システム用

my-large.cnf

〜512Mメモリ搭載システム用

my-huge.cnf

1〜2Gメモリ搭載システム用

my-innodb-heavy-4G.cnf

4Gメモリ搭載でInnoDBを使用するシステム用

% sudo cp support-files/my-medium.cnf /etc/my.cnf

my-medium.cnf、my-large.cnf、my-huge.cnfを使用する場合は以下の行をコメントアウトする。

% sudo vi /etc/my.cnf 
:
# skip-federated
:
initスクリプト配置
% sudo cp support-files/mysql.server /etc/rc.d/init.d
% sudo chmod +x /etc/rc.d/init.d/mysql.server

% sudo chkconfig --add mysql.server
% sudo chkconfig --list mysql.server
mysql.server  0:off  1:off  2:on  3:on  4:on  5:on  6:off

システムデータベース作成

% sudo /usr/local/mysql/bin/mysql_install_db --user=mysql

この作業により以下のファイルが作成される。

システムデータベース

/usr/local/mysql/var/mysql/*

バイナリログ(2個)

/usr/local/mysql/var/mysql-bin.000001

/usr/local/mysql/var/mysql-bin.000002

バイナリログ管理ファイル

/usr/local/mysql/var/mysql-bin.index

(*) このファイルにログファイルのファイル名が格納される。

testデータベース用ディレクトリ

/usr/local/mysql/var/test (ディレクトリのみ)

動作確認

デーモン起動

% sudo service mysql.server start

デーモンを起動すると以下のファイルが作成される。

デーモンPIDファイル

/usr/local/mysql/var/<ローカルホスト名>.pid

デーモンログファイル

/usr/local/mysql/var/<ローカルホスト名>.err

バイナリログ(3個目)

/usr/local/mysql/var/mysql-bin.000003

(*) 最初の2個はシステムデータベース作成時に作られる。

(*) ログ管理ファイル/usr/local/mysql/var/mysql-bin.indexに上記ファイルが追加される。

MySQL管理者アカウントのパスワード設定

必要に応じてMySQL管理者アカウントのパスワードを設定する。

ここでのアカウントはOSのアカウントではなくMySQL内でのアカウントを指す。

% mysqladmin password -u root <パスワード>

関連資料・記事