MySQL (日本語) - ArchWiki

# MySQL (日本語)

関連記事

- phpMyAdmin
- Adminer

MySQL は幅広く使われている、マルチスレッドの、マルチユーザー SQL データベースです。機能に関する詳細は 公式ホームページ を見て下さい。

Note: 現在 MariaDB が Arch Linux における MySQL のデフォルトの実装になっています。全てのユーザーは MariaDB にアップグレードするのが推奨されています。Oracle MySQL は AUR に移動しました。アナウンスを参照してください。

## インストール

Arch Linux で選ばれている MySQL の実装は MariaDB です。公式リポジトリから mariadb をインストールしてください。他の実装は:

- Oracle MySQL — Oracle Corporation による実装。

  https://www.mysql.com/ || mysql

- Percona Server — Percona LLC による実装。

  http://www.percona.com/software/percona-server/ || percona-server

Tip: データベース (`/var/lib/mysql`) を btrfs ファイルシステムに配置する際は、データベースを作成する前にディレクトリの Copy-on-Write を無効にすることを考えるべきです:

`# chattr +C /var/lib/mysql`

`mysqld.service` を起動して、セットアップスクリプトを実行してください:

    # mysql_secure_installation

その後 `mysqld.service` を再起動してください。

フロントエンドは mysql-gui-tools やその後継の mysql-workbench が利用できます。

### 起動時に有効にする

起動時に MySQL デーモンを実行するには、`mysqld.service` ユニットを有効にしてください。

### Oracle MySQL から MariaDB へのアップグレード

Note: デーモンを再起動する前に `/var/lib/mysql` の次のファイルを削除する必要があるかもしれません: `ib_logfile0`, `ib_logfile1`, `aria_log_control`。

データベースを切り替えるときに環境を移行するには `mysqld.service` を停止して mariadb をインストールして `mysqld.service` を起動し次を実行してください:

    # mysql_upgrade -u root -p

### アップデート

メジャーバージョンアップデート (5.5 から 10.0、もしくは 10.0 から 10.1 など) をした後は、次のコマンドを実行して MySQL を再起動すると良いでしょう:

    # mysql_upgrade -u root -p

## 設定

MySQL サーバーを起動できたら、おそらく MySQL ユーザーとデータベースを管理するための root アカウントを追加したくなるはずです。上記のスクリプトの出力で説明されているように、手動または自動で設定を行えます。root アカウントのパスワードを設定するコマンドを実行するか、セキュアなインストールスクリプトを実行してください。

インストールの後は、好きなインタフェースを使って使用するための設定を行うことができます。例えば MySQL のコマンドラインツールを使って MySQL サーバーに root でログインすることが可能です:

    $ mysql -u root -p

### ユーザーを追加する

新しいユーザーの作成は2段階で行います: ユーザーを作って、そのユーザーに権限を与える。以下のレイでは、ユーザー monty をパスワード some_pass で作成します。

    $ mysql -u root -p

    MariaDB> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
    MariaDB> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
       ->     WITH GRANT OPTION;
    MariaDB> quit

### リモートアクセスを無効にする

デフォルトで MySQL サーバーはネットワークからアクセスできるようになっています。MySQL をローカルホストからしか使わない場合は、TCP ポート 3306 を使用しないようにすることでセキュリティを向上させることが可能です。リモート接続を拒否させるには、`/etc/mysql/my.cnf` にある次の行をアンコメントしてください:

    skip-networking

この設定をしてもローカルホストからはログインできます。

### 自動補完を有効にする

Note: この機能を有効にするとクライアントの初期化が長くなるかもしれません。

MySQL クライアントの補完機能はデフォルトでは無効になっています。システム全体で有効にするには `/etc/mysql/my.cnf` を編集して、`no-auto-rehash` を `auto-rehash` で置き換えてください。次に MySQL クライアントを実行した時に補完が有効になります。

### UTF-8 を使う

`/etc/mysql/my.cnf` ファイルの `mysqld` グループ下のセクションに、以下を追加:

    [mysqld]
    init_connect                = 'SET collation_connection = utf8_general_ci,NAMES utf8'
    collation_server            = utf8_general_ci
    character_set_client        = utf8
    character_set_server        = utf8

### tmpdir に TMPFS を使う

MySQL が一時ファイルの保存に使用するディレクトリは tmpdir という名前が付いています。例えば、ディスクの膨大なソートを行うのに使われたり、内部的または明示的な一時ディレクトリのために使われます。

適切なパーミッションでディレクトリを作成:

    # mkdir -pv /var/lib/mysqltmp
    # chown mysql:mysql /var/lib/mysqltmp

`mysql` ユーザーとグループの id と gid を確認:

    $ id mysql
    uid=27(mysql) gid=27(mysql) groups=27(mysql)

`/etc/fstab` ファイルに追加:

     tmpfs   /var/lib/mysqltmp   tmpfs   rw,gid=27,uid=27,size=100M,mode=0750,noatime   0 0

`/etc/mysql/my.cnf` ファイルの `mysqld` グループ下に追加:

     tmpdir      = /var/lib/mysqltmp

その後再起動するか ( shutdown mysql, mount the tmpdir, start mysql )。

### タイムゾーンテーブル

タイムゾーンテーブルはインストールで作成されますが、ロードが自動では行われません。SQL クエリで CONVERT_TZ() を使う予定ならばロードする必要があります。

全てのタイムゾーンのタイムゾーンテーブルをロードするには:

    $ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

また、特定のタイムゾーンファイルを指定してテーブルをロードすることもできます:

    $ mysql_tzinfo_to_sql <timezone_file> <timezone_name> | mysql -u root -p mysql

## バックアップ

簡易バックアップとしてファイルにデータベースを出力することが可能です。以下のシェルスクリプトは、データベースのダンプが含まれた `db_backup.gz` ファイルを、スクリプトと同じディレクトリに作成します:

    #!/bin/bash

    THISDIR=$(dirname $(readlink -f "$0"))

    mysqldump --single-transaction --flush-logs --master-data=2 --all-databases \
     | gzip > $THISDIR/db_backup.gz
    echo 'purge master logs before date_sub(now(), interval 7 day);' | mysql

MySQL マニュアルにある公式の `mysqldump` の ページ も参照してください。

## トラブルシューティング

### MySQL デーモンが起動しない

MySQL が起動せずログファイルに何も出力されない場合、`/var/lib/mysql` や `/var/lib/mysql/mysql` ディレクトリ内のファイルのパーミッションを確認してください。ディレクトリ内にあるファイルの所有者が `mysql:mysql` ではないときは、次を実行してください:

    # chown mysql:mysql /var/lib/mysql -R

上記に従ってもパーミッション問題が発生する場合は、`my.cnf` を `/etc/` にコピーしてみて下さい:

    # cp /etc/mysql/my.cnf /etc/my.cnf

そしてデーモンを起動してみましょう。

`/var/lib/mysql/hostname.err` に以下のメッセージが表示される場合:

    [ERROR] Can't start server : Bind on unix socket: Permission denied
    [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ?
    [ERROR] Aborting

おそらく `/var/run/mysqld` のパーミッションが原因です。

    # chown mysql:mysql /var/run/mysqld -R

mysqld を実行すると以下のエラーが表示される場合:

    Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

`/usr` ディレクトリから以下のコマンドを実行してデフォルトのテーブルをインストールしてください:

    # cd /usr
    # mysql_install_db --user=mysql --ldata=/var/lib/mysql/

### MySQL が起動しないために mysql_upgrade を実行できない

MySQL をセーフモードで実行して:

    # mysqld_safe --datadir=/var/lib/mysql/

次を実行してみて下さい:

    # mysql_upgrade -u root -p

### root パスワードをリセットする

`mysqld.service` を停止。次のコマンドを実行:

    # mysqld_safe --skip-grant-tables &

mysql サーバーに接続。次のコマンドを実行:

    # mysql -u root mysql

root パスワードを変更:

    mysql> use mysql;
    mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
    mysql> FLUSH PRIVILEGES;
    mysql> exit

`mysqld.service` を起動。

### 全てのテーブルをチェック・修復する

全てのデータベースの全てのテーブルをチェック・自動修復 詳細:

    # mysqlcheck -A --auto-repair -u root -p

### 全てのテーブルを最適化する

テーブルエラーを自動的に修正して、全てのテーブルを強制的に最適化する。

    # mysqlcheck -A --auto-repair -f -o -u root -p

### ZFS での実行時に OS エラー 22

ZFS を使っていて、以下のエラーが表示される場合:

    InnoDB: Operating system error number 22 in a file operation.

`/etc/mysql/my.cnf` の mysqld セクションに次の行を追加して aio_writes を無効にする必要があります:

    [mysqld]
    ...
    innodb_use_native_aio = 0

ただし、上の問題のせいでインストール後のスクリプトが失敗する場合、MySQL/MariaDB が無効状態になっている可能性があります。この状態から復旧するには、以下を実行してください:

    rm -rf /var/lib/mysql/*
    mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
    chown -R mysql:mysql /var/lib/mysql &>/dev/null
    /usr/bin/systemd-tmpfiles --create mysql.conf

これで MySQL/MariaDB が正しくインストールされるはずです。

### CLI でログインできないが、phpmyadmin は問題なく動作する

長い (>70-75) パスワードを使っているとこの問題が発生することがあります。 5.5.36 現在、何らかの理由で、mysql CLI は readline モードで長い文字列を扱えなくなっています。 そのため、長いパスワードを使う場合は input モードを使うことを推奨します:

    $ mysql -u <user> -p
    Password:

もしくは短いパスワードに変えてください。

Note: mysql コマンドに引数としてパスワードを指定することでログインすることは可能です。
Warning: This behavior considered dangerous, because your password might leak, for example, to the logs. Use it only in case of emergency and don't forget to change password right afterwards.

    $ mysql -u <user> -p"<some-veryveryveryveryveryveryveryveryveryveryveryveryveryveryvery-long-and-veryveryveryveryveryveryveryveryveryvery-strong-password>"

## 参照

- MariaDB 公式ウェブサイト
- MariaDB knowledge Base
- MySQL ドキュメント
- LAMP - LAMP (Linux Apache MySQL PHP) サーバーのセットアップに関する ArchWiki の記事
- PhpMyAdmin - Apache/PHP フロントエンドを使って MySQL データベースを管理するのに役立つウェブベースのツールに関する ArchWiki の記事。
- PHP - PHP に関する ArchWiki の記事。
- MySQL のパフォーマンスチューニングスクリプトとノウハウ

Category:

- Database management systems (日本語)