MariaDB
関連記事
MySQL は幅広く使われている、マルチスレッドの、マルチユーザー SQL データベースです。機能に関する詳細は 公式ホームページ を見て下さい。
インストール
Arch Linux で選ばれている MySQL の実装は MariaDB です。公式リポジトリから mariadb をインストールしてください。他の実装は:
- Oracle MySQL — Oracle Corporation による実装。
- https://www.mysql.com/ || mysqlAUR
- Percona Server — Percona LLC による実装。
mariadb をインストールしたら、 mysqld.service
を起動する前に以下のコマンドを実行してください:
# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
そして、mysqld.service
を起動 (必要であれば有効に) します。
MySQL を安全にするために以下のコマンドの実行を推奨します:
# mysql_secure_installation
その後 mysqld.service
を再起動してください。
管理を容易にする、mysql-workbench や Adminer などのフロントエンドが利用できます。
起動時に有効にする
起動時に MySQL デーモンを実行するには、mysqld.service
ユニットを有効にしてください。
Oracle MySQL から MariaDB へのアップグレード
データベースを切り替えるときに環境を移行するには 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 で作成し、データベース mydb への完全な権限を与えます:
$ mysql -u root -p
MariaDB> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass'; MariaDB> GRANT ALL PRIVILEGES ON mydb.* TO 'monty'@'localhost'; MariaDB> FLUSH PRIVILEGES; MariaDB> quit
設定ファイル
MariaDB の設定オプションは以下のファイルから順番で読み込まれます (mysqld --help --verbose
):
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
変更したい範囲にあわせて (システム全体かユーザー個別か)、適当なファイルを使って下さい。詳しくは KnowledgeBase の エントリ を見て下さい。
リモートアクセスを無効にする
デフォルトで MySQL サーバーはネットワークからアクセスできるようになっています。MySQL をローカルホストからしか使わない場合は、TCP ポート 3306 を使用しないようにすることでセキュリティを向上させることが可能です。リモート接続を拒否させるには、/etc/mysql/my.cnf
にある次の行をアンコメントしてください:
skip-networking
この設定をしてもローカルホストからはログインできます。
自動補完を有効にする
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:
もしくは短いパスワードに変えてください。
MySQL のバイナリログがディスク容量を逼迫させている
デフォルトで、mysqld はバイナリログファイルを /var/lib/mysql
に作成します。マスターサーバーのレプリケーションやデータの復旧などにログは役立ちますが、バイナリログはディスク容量を逼迫させる可能性もあります。レプリケーションやデータの復元機能を使わない場合、/etc/mysql/my.cnf
で以下の行をコメントアウトすることでバイナリログを無効化できます:
#log-bin=mysql-bin #binlog_format=mixed
また、以下のコマンドを使って /var/lib/mysql
のバイナリログを消去することでディスク領域を確保することができます:
#mysql -u root -p"PASSWORD" -e "PURGE BINARY LOGS TO 'mysql-bin.0000xx';"
参照
- MariaDB 公式ウェブサイト
- MariaDB knowledge Base
- MySQL ドキュメント
- LAMP - LAMP (Linux Apache MySQL PHP) サーバーのセットアップに関する ArchWiki の記事
- PhpMyAdmin - Apache/PHP フロントエンドを使って MySQL データベースを管理するのに役立つウェブベースのツールに関する ArchWiki の記事。
- PHP - PHP に関する ArchWiki の記事。
- MySQL のパフォーマンスチューニングスクリプトとノウハウ