「MariaDB」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(1版 をインポートしました)
(Kusakata がページ「MySQL」をリダイレクトの「MariaDB」に移動しました)
 
(4人の利用者による、間の15版が非表示)
1行目: 1行目:
[[Category:データベース管理システム]]
+
[[Category:関係データベース管理システム]]
 
[[cs:MySQL]]
 
[[cs:MySQL]]
 
[[de:MySQL]]
 
[[de:MySQL]]
 
[[en:MySQL]]
 
[[en:MySQL]]
 
[[es:MySQL]]
 
[[es:MySQL]]
[[fr:MySQL]]
+
[[fr:MariaDB]]
 
[[it:MySQL]]
 
[[it:MySQL]]
  +
[[ru:MySQL]]
 
[[sr:MySQL]]
 
[[sr:MySQL]]
[[tr:MySQL]]
+
[[zh-hans:MySQL]]
[[zh-CN:MySQL]]
 
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|phpMyAdmin}}
 
{{Related|phpMyAdmin}}
 
{{Related|Adminer}}
 
{{Related|Adminer}}
  +
{{Related|JDBC と MySQL}}
  +
{{Related|Open Database Connectivity}}
 
{{Related articles end}}
 
{{Related articles end}}
 
MySQL は幅広く使われている、マルチスレッドの、マルチユーザー SQL データベースです。機能に関する詳細は [http://www.mysql.com/ 公式ホームページ] を見て下さい。
 
MySQL は幅広く使われている、マルチスレッドの、マルチユーザー SQL データベースです。機能に関する詳細は [http://www.mysql.com/ 公式ホームページ] を見て下さい。
   
{{Note|現在 MariaDB が Arch Linux における MySQL のデフォルトの実装になっています。全てのユーザーは MariaDB に[[#Oracle MySQL から MariaDB へのアップグレード|アップグレード]]するのが推奨されています。Oracle MySQL は [[AUR]] に移動しました。[https://www.archlinux.org/news/mariadb-replaces-mysql-in-repositories/ アナウンス]を参照してください。}}
+
{{Note|現在 MariaDB が Arch Linux における MySQL のデフォルトの実装になっています。全てのユーザーは MariaDB に[[#Oracle MySQL から MariaDB へのアップグレード|アップグレード]]するのが推奨されています。Oracle MySQL は [[AUR]] に移動しました。[https://www.archlinux.jp/news/mariadb-replaces-mysql-in-repositories/ アナウンス]を参照してください。}}
   
 
== インストール ==
 
== インストール ==
   
Arch Linux で選ばれている MySQL の実装は [https://mariadb.org/ MariaDB] です。[[公式リポジトリ]]から {{Pkg|mariadb}} を[[pacman|インストール]]してください。他の実装は:
+
Arch Linux で選ばれている MySQL の実装は [https://mariadb.com/ MariaDB] です。[[公式リポジトリ]]から {{Pkg|mariadb}} を[[pacman|インストール]]してください。他の実装は:
 
* {{App|Oracle MySQL|Oracle Corporation による実装。|https://www.mysql.com/|{{AUR|mysql}}}}
 
* {{App|Oracle MySQL|Oracle Corporation による実装。|https://www.mysql.com/|{{AUR|mysql}}}}
 
* {{App|Percona Server|Percona LLC による実装。|http://www.percona.com/software/percona-server/|{{Pkg|percona-server}}}}
 
* {{App|Percona Server|Percona LLC による実装。|http://www.percona.com/software/percona-server/|{{Pkg|percona-server}}}}
   
  +
{{Tip|
{{Tip|データベース ({{ic|/var/lib/mysql}}) を [[btrfs]] ファイルシステムに配置する際は、データベースを作成する前にディレクトリの [[Btrfs#コピーオンライト_.28CoW.29|Copy-on-Write]] を無効にすることを考えるべきです:
 
  +
* データベース ({{ic|/var/lib/mysql}}) を [[btrfs]] ファイルシステムに配置する際は、データベースを作成する前にディレクトリの [[Btrfs#コピーオンライト_.28CoW.29|Copy-on-Write]] を無効にすることを考えるべきです: {{ic|# chattr +C /var/lib/mysql}}。
{{ic|# chattr +C /var/lib/mysql}}
 
  +
* [[ZFS]] ファイルシステム上にデータベースを保存する場合、データベースを作成する前に [[ZFS#データベース]] を読んで下さい。
 
}}
 
}}
   
{{ic|mysqld.service}} を[[systemd#ユニットを使う|起動]]して、セットアップスクリプトを実行してください:
+
{{Pkg|mariadb}} をインストールしたら、 {{ic|mariadb.service}} を'''[[systemd#ユニットを使う|起動]]する前に'''以下のコマンドを実行してください:
  +
# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
# mysql_secure_installation
 
その後 {{ic|mysqld.service}} を再起動してください。
 
   
  +
{{Warning|セキュリティ上の理由から、systemd サービスファイルには {{ic|1=ProtectHome=true}} が含まれており {{ic|/home}}, {{ic|/root}}, {{ic|/run/user}} のファイルを MariaDB から使えないようにしています。{{ic|datadir}} は MariaDB からアクセスできる場所を指定して、{{ic|mysql}} ユーザーとグループが[[chown|所有]]するようにしてください。サービスファイルを編集することで挙動は変更できます [https://mariadb.com/kb/en/mariadb/systemd/]。}}
フロントエンドは {{AUR|mysql-gui-tools}} やその後継の {{AUR|mysql-workbench}} が利用できます。
 
   
  +
そして、{{ic|mariadb.service}} を[[systemd#ユニットを使う|起動]] (必要であれば有効に) します。
=== 起動時に有効にする ===
 
  +
起動時に MySQL デーモンを実行するには、{{ic|mysqld.service}} ユニットを有効にしてください。
 
  +
{{Tip|{{ic|/var/lib/mysql}} 以外のディレクトリをデータディレクトリとしたい場合、{{Ic|/etc/mysql/my.cnf}} の {{Ic|[mysqld]}} セクションで {{Ic|1=datadir=<YOUR_DATADIR>}} と設定してください。}}
  +
  +
さらに MySQL を安全にするために以下のコマンドの実行を推奨します:
  +
# mysql_secure_installation
  +
  +
データベースの管理を容易にする {{Pkg|dbeaver}}, {{Pkg|mysql-workbench}}, [[Adminer]], [[phpMyAdmin]] などのフロントエンドをインストールしても良いでしょう。{{Pkg|mysql-workbench}} は MariaDB と完全な互換性はありませんが、基本的な作業については問題ありません。
   
 
=== Oracle MySQL から MariaDB へのアップグレード ===
 
=== Oracle MySQL から MariaDB へのアップグレード ===
 
{{Note|デーモンを再起動する前に {{ic|/var/lib/mysql}} の次のファイルを削除する必要があるかもしれません: {{ic|ib_logfile0}}, {{ic|ib_logfile1}}, {{ic|aria_log_control}}。}}
 
{{Note|デーモンを再起動する前に {{ic|/var/lib/mysql}} の次のファイルを削除する必要があるかもしれません: {{ic|ib_logfile0}}, {{ic|ib_logfile1}}, {{ic|aria_log_control}}。}}
   
データベースを切り替えるときに環境を移行するには {{ic|mysqld.service}} を停止して {{pkg|mariadb}} をインストールして {{ic|mysqld.service}} を起動し次を実行してください:
+
データベースを切り替えるときに環境を移行するには {{ic|mysqld.service}} を停止して {{pkg|mariadb}} をインストールして {{ic|mariadb.service}} を起動し次を実行してください:
# mysql_upgrade -u root -p
 
 
=== アップデート ===
 
メジャーバージョンアップデート (5.5 から 10.0、もしくは 10.0 から 10.1 など) をした後は、次のコマンドを実行して MySQL を再起動すると良いでしょう:
 
 
# mysql_upgrade -u root -p
 
# mysql_upgrade -u root -p
   
53行目: 57行目:
   
 
=== ユーザーを追加する ===
 
=== ユーザーを追加する ===
新しいユーザーの作成は2段階で行います: ユーザーを作って、そのユーザーに権限を与える。以下のレイでは、ユーザー ''monty'' をパスワード ''some_pass'' で作成します
+
新しいユーザーの作成は2段階で行います: ユーザーを作って、そのユーザーに権限を与える。以下のでは、ユーザー ''monty'' をパスワード ''some_pass'' で作成し、データベース ''mydb'' への完全な権限を与えます:
   
 
{{hc|$ mysql -u root -p|
 
{{hc|$ mysql -u root -p|
 
MariaDB> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
 
MariaDB> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
MariaDB> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
+
MariaDB> GRANT ALL PRIVILEGES ON mydb.* TO 'monty'@'localhost';
  +
MariaDB> FLUSH PRIVILEGES;
-> WITH GRANT OPTION;
 
 
MariaDB> quit}}
 
MariaDB> quit}}
  +
  +
=== 設定ファイル ===
  +
  +
''MariaDB'' の設定オプションは以下のファイルから順番で読み込まれます ({{ic|mysqld --help --verbose | tail -20}}):
  +
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
  +
  +
変更したい範囲にあわせて (システム全体かユーザー個別か)、適当なファイルを使って下さい。詳しくは KnowledgeBase の [https://mariadb.com/kb/en/mariadb/documentation/getting-started/starting-and-stopping-mariadb/mysqld-configuration-files-and-groups/ エントリ] を見て下さい。
   
 
=== リモートアクセスを無効にする ===
 
=== リモートアクセスを無効にする ===
71行目: 82行目:
 
MySQL クライアントの補完機能はデフォルトでは無効になっています。システム全体で有効にするには {{ic|/etc/mysql/my.cnf}} を編集して、{{ic|no-auto-rehash}} を {{ic|auto-rehash}} で置き換えてください。次に MySQL クライアントを実行した時に補完が有効になります。
 
MySQL クライアントの補完機能はデフォルトでは無効になっています。システム全体で有効にするには {{ic|/etc/mysql/my.cnf}} を編集して、{{ic|no-auto-rehash}} を {{ic|auto-rehash}} で置き換えてください。次に MySQL クライアントを実行した時に補完が有効になります。
   
=== UTF-8 を使う ===
+
=== UTF8MB4 を使う ===
  +
{{Warning|文字セットを変更する前にバックアップを作成するようにしてください。}}
{{ic|/etc/mysql/my.cnf}} ファイルの {{ic|mysqld}} グループ下のセクションに、以下を追加:
 
  +
{{Note|UTF8MB4 は Unicode を完全にサポートしているため UTF-8 よりも推奨されています [https://mathiasbynens.be/notes/mysql-utf8mb4] [https://stackoverflow.com/questions/30074492/what-is-the-difference-between-utf8mb4-and-utf8-charsets-in-mysql]。}}
  +
{{ic|/etc/mysql/my.cnf}} に存在するメインの設定ファイルに以下の値を[[追加]]:
   
 
{{bc|<nowiki>
 
{{bc|<nowiki>
  +
[client]
  +
default-character-set = utf8mb4
  +
 
[mysqld]
 
[mysqld]
  +
collation_server = utf8mb4_unicode_ci
init_connect = 'SET collation_connection = utf8_general_ci,NAMES utf8'
 
  +
character_set_server = utf8mb4
collation_server = utf8_general_ci
 
  +
character_set_client = utf8
 
  +
[mysql]
character_set_server = utf8
 
  +
default-character-set = utf8mb4
 
</nowiki>}}
 
</nowiki>}}
  +
  +
変更を適用するには {{ic|mariadb.service}} の[[再起動]]が必要です。
  +
  +
[[#データベースのメンテナンス]]を参照して最適化とデータベースの健康度チェックを行ってください。
  +
  +
=== 文字数制限の増加 ===
  +
{{Note|文字数制限は使用している文字セットによって変わります [http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/] [https://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_large_prefix] [https://easyengine.io/tutorials/mysql/enable-innodb-file-per-table/]。}}
  +
  +
InnoDB の場合、以下のコマンドを実行することで文字数制限を高くすることができます:
  +
mysql> set global innodb_file_format = BARRACUDA;
  +
Query OK, 0 rows affected (0.00 sec)
  +
  +
mysql> set global innodb_file_per_table = ON;
  +
Query OK, 0 rows affected (0.00 sec)
  +
  +
mysql> set global innodb_large_prefix = ON;
  +
Query OK, 0 rows affected (0.00 sec)
  +
  +
{{ic|/etc/mysql/my.cfg}} に以下の行を追加することで常に高い文字数制限が使われるようになります:
  +
  +
[mysqld]
  +
innodb_file_format = barracuda
  +
innodb_file_per_table = 1
  +
innodb_large_prefix = 1
  +
  +
{{ic|mariadb.service}} を[[再起動]]して変更を適用してください。
  +
  +
テーブルを作成する際に以下のように {{ic|ROW_FORMAT}} を追加します:
  +
  +
mysql> create table if not exists products (
  +
-> day date not null,
  +
-> product_id int not null,
  +
-> dimension1 varchar(500) not null,
  +
-> dimension2 varchar(500) not null,
  +
-> unique index unique_index (day, product_id, dimension1, dimension2)
  +
-> ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
  +
Query OK, 0 rows affected (0.02 sec)
   
 
=== tmpdir に TMPFS を使う ===
 
=== tmpdir に TMPFS を使う ===
109行目: 163行目:
 
また、特定のタイムゾーンファイルを指定してテーブルをロードすることもできます:
 
また、特定のタイムゾーンファイルを指定してテーブルをロードすることもできます:
 
$ mysql_tzinfo_to_sql <timezone_file> <timezone_name> | mysql -u root -p mysql
 
$ mysql_tzinfo_to_sql <timezone_file> <timezone_name> | mysql -u root -p mysql
  +
  +
== データベースのメンテナンス ==
  +
  +
=== メジャーリリース時のデータベースアップグレード ===
  +
メジャーバージョンアップデート (例えば mariadb-10.1.10-1 から mariadb-10.1.18-1 にアップデート) をした後は、次のコマンドを実行して MySQL を再起動すると良いでしょう:
  +
# mysql_upgrade -u root -p
  +
  +
=== データベースのチェック・最適化・修復 ===
  +
{{Pkg|mariadb}} に付属している {{ic|mysqlcheck}} を使うことで、シェルからデータベースのテーブルをチェック・最適化・修復することができます。詳しくは mysqlcheck の man ページを見てください。よく使われるコマンドは以下の通りです。
  +
  +
全てのデータベースの全てのテーブルをチェックするには:
  +
$ mysqlcheck --all-databases -u root -p -c
  +
  +
全てのデータベースの全てのテーブルを解析するには:
  +
$ mysqlcheck --all-databases -u root -p -a
  +
  +
全てのデータベースの全てのテーブルを修復するには:
  +
$ mysqlcheck --all-databases -u root -p -r
  +
  +
全てのデータベースの全てのテーブルを最適化するには:
  +
$ mysqlcheck --all-databases -u root -p -o
   
 
== バックアップ ==
 
== バックアップ ==
145行目: 220行目:
 
# cd /usr
 
# cd /usr
 
# mysql_install_db --user=mysql --ldata=/var/lib/mysql/
 
# mysql_install_db --user=mysql --ldata=/var/lib/mysql/
  +
  +
MariaDB 10.1.16 からデフォルトではデータディレクトリを {{ic|/home}} や {{ic|/root}}、あるいは {{ic|/run/user}} などにできないようになっています。データディレクトリを移動するか、あるいは {{ic|mariadb.service}} を編集して以下の行を:
  +
  +
ProtectHome=true
  +
  +
以下のように置き換えてください:
  +
  +
ProtectHome=false
   
 
=== MySQL が起動しないために mysql_upgrade を実行できない ===
 
=== MySQL が起動しないために mysql_upgrade を実行できない ===
153行目: 236行目:
   
 
=== root パスワードをリセットする ===
 
=== root パスワードをリセットする ===
{{ic|mysqld.service}} を停止。次のコマンドを実行:
+
{{ic|mariadb.service}} を停止。次のコマンドを実行:
 
# mysqld_safe --skip-grant-tables &
 
# mysqld_safe --skip-grant-tables &
 
mysql サーバーに接続。次のコマンドを実行:
 
mysql サーバーに接続。次のコマンドを実行:
162行目: 245行目:
 
mysql> FLUSH PRIVILEGES;
 
mysql> FLUSH PRIVILEGES;
 
mysql> exit
 
mysql> exit
{{ic|mysqld.service}} を起動。
+
{{ic|mariadb.service}} を起動。
   
 
=== 全てのテーブルをチェック・修復する ===
 
=== 全てのテーブルをチェック・修復する ===
全てのデータベースの全てのテーブルをチェック・自動修復 [http://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html 詳細]:
+
全てのデータベースの全てのテーブルをチェック・自動修復 ([http://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html 詳細]):
 
# mysqlcheck -A --auto-repair -u root -p
 
# mysqlcheck -A --auto-repair -u root -p
   
197行目: 280行目:
   
 
{{Note|mysql コマンドに引数としてパスワードを指定することでログインすることは可能です。
 
{{Note|mysql コマンドに引数としてパスワードを指定することでログインすることは可能です。
  +
{{Warning|以下のコマンドを実行するとパスワードがログに保存されるなどして漏洩する危険性があります。緊急の場合にのみ使ってください。そしてすぐにパスワードを変えてください。}}
{{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>"
+
$ mysql -u <user> -p"<some-very-strong-password>"
 
}}
 
}}
  +
  +
===MySQL のバイナリログがディスク容量を逼迫させている===
  +
デフォルトで、mysqld はバイナリログファイルを {{ic|/var/lib/mysql}} に作成します。マスターサーバーのレプリケーションやデータの復旧などにログは役立ちますが、バイナリログはディスク容量を逼迫させる可能性もあります。レプリケーションやデータの復元機能を使わない場合、{{ic|/etc/mysql/my.cnf}} で以下の行をコメントアウトすることでバイナリログを無効化できます:
  +
#log-bin=mysql-bin
  +
#binlog_format=mixed
  +
以下のようにログファイルの容量を制限することもできます:
  +
expire_logs_days = 10
  +
max_binlog_size = 100M
  +
  +
また、以下のコマンドを使って {{ic|/var/lib/mysql}} のバイナリログを消去することでディスク領域を確保することができます:
  +
# mysql -u root -p "PASSWORD" -e "PURGE BINARY LOGS TO 'mysql-bin.0000xx';"
  +
  +
=== OpenRC で MySQL を起動できない ===
  +
  +
[[OpenRC]] で MySQL を使うには MySQL の設定ファイル ({{ic|/etc/mysql/my.cnf}}) の {{ic|[mysqld]}} セクションに以下の行を追加する必要があります:
  +
  +
user = mysql
  +
basedir = /usr
  +
datadir = /var/lib/mysql
  +
pid-file = /run/mysqld/mysql.pid
  +
  +
以下のコマンドで MySQL を起動できるはずです:
  +
  +
# rc-service mysql start
  +
  +
=== Specified key was too long ===
  +
[[#文字数制限の増加]]を参照してください。
   
 
== 参照 ==
 
== 参照 ==
* [https://mariadb.org/ MariaDB 公式ウェブサイト]
+
* [https://mariadb.com/ MariaDB 公式ウェブサイト]
 
* [https://mariadb.com/kb/ja/ MariaDB knowledge Base]
 
* [https://mariadb.com/kb/ja/ MariaDB knowledge Base]
 
* [http://dev.mysql.com/doc/ MySQL ドキュメント]
 
* [http://dev.mysql.com/doc/ MySQL ドキュメント]
* [[LAMP]] - LAMP (Linux Apache MySQL PHP) サーバーのセットアップに関する ArchWiki の記事
+
* [[Apache HTTP Server]] - Apache HTTP Server に関する ArchWiki の記事
* [[PhpMyAdmin]] - Apache/PHP フロントエンドを使って MySQL データベースを管理するのに役立つウェブベースのツールに関する ArchWiki の記事。
 
 
* [[PHP]] - PHP に関する ArchWiki の記事。
 
* [[PHP]] - PHP に関する ArchWiki の記事。
* [http://www.askapache.com/mysql/performance-tuning-mysql.html MySQL のパフォーマンスチューニングスクリプトとノウハウ]
+
* [https://www.askapache.com/mysql/performance-tuning-mysql/ MySQL のパフォーマンスチューニングスクリプトとノウハウ]

2019年2月22日 (金) 00:11時点における最新版

関連記事

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

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

インストール

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

  • Oracle MySQL — Oracle Corporation による実装。
https://www.mysql.com/ || mysqlAUR
  • Percona Server — Percona LLC による実装。
http://www.percona.com/software/percona-server/ || percona-server
ヒント:
  • データベース (/var/lib/mysql) を btrfs ファイルシステムに配置する際は、データベースを作成する前にディレクトリの Copy-on-Write を無効にすることを考えるべきです: # chattr +C /var/lib/mysql
  • ZFS ファイルシステム上にデータベースを保存する場合、データベースを作成する前に ZFS#データベース を読んで下さい。

mariadb をインストールしたら、 mariadb.service起動する前に以下のコマンドを実行してください:

# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
警告: セキュリティ上の理由から、systemd サービスファイルには ProtectHome=true が含まれており /home, /root, /run/user のファイルを MariaDB から使えないようにしています。datadir は MariaDB からアクセスできる場所を指定して、mysql ユーザーとグループが所有するようにしてください。サービスファイルを編集することで挙動は変更できます [1]

そして、mariadb.service起動 (必要であれば有効に) します。

ヒント: /var/lib/mysql 以外のディレクトリをデータディレクトリとしたい場合、/etc/mysql/my.cnf[mysqld] セクションで datadir=<YOUR_DATADIR> と設定してください。

さらに MySQL を安全にするために以下のコマンドの実行を推奨します:

# mysql_secure_installation

データベースの管理を容易にする dbeaver, mysql-workbench, Adminer, phpMyAdmin などのフロントエンドをインストールしても良いでしょう。mysql-workbench は MariaDB と完全な互換性はありませんが、基本的な作業については問題ありません。

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

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

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

# 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-rehashauto-rehash で置き換えてください。次に MySQL クライアントを実行した時に補完が有効になります。

UTF8MB4 を使う

警告: 文字セットを変更する前にバックアップを作成するようにしてください。
ノート: UTF8MB4 は Unicode を完全にサポートしているため UTF-8 よりも推奨されています [2] [3]

/etc/mysql/my.cnf に存在するメインの設定ファイルに以下の値を追加:

[client]
default-character-set = utf8mb4

[mysqld]
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4

[mysql]
default-character-set = utf8mb4

変更を適用するには mariadb.service再起動が必要です。

#データベースのメンテナンスを参照して最適化とデータベースの健康度チェックを行ってください。

文字数制限の増加

ノート: 文字数制限は使用している文字セットによって変わります [4] [5] [6]

InnoDB の場合、以下のコマンドを実行することで文字数制限を高くすることができます:

mysql> set global innodb_file_format = BARRACUDA;
Query OK, 0 rows affected (0.00 sec)
mysql> set global innodb_file_per_table = ON;
Query OK, 0 rows affected (0.00 sec)
mysql> set global innodb_large_prefix = ON;
Query OK, 0 rows affected (0.00 sec)

/etc/mysql/my.cfg に以下の行を追加することで常に高い文字数制限が使われるようになります:

[mysqld]
innodb_file_format = barracuda
innodb_file_per_table = 1
innodb_large_prefix = 1

mariadb.service再起動して変更を適用してください。

テーブルを作成する際に以下のように ROW_FORMAT を追加します:

mysql> create table if not exists products (
   ->   day date not null,
   ->   product_id int not null,
   ->   dimension1 varchar(500) not null,
   ->   dimension2 varchar(500) not null,
   ->   unique index unique_index (day, product_id, dimension1, dimension2)
   -> ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
Query OK, 0 rows affected (0.02 sec)

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

データベースのメンテナンス

メジャーリリース時のデータベースアップグレード

メジャーバージョンアップデート (例えば mariadb-10.1.10-1 から mariadb-10.1.18-1 にアップデート) をした後は、次のコマンドを実行して MySQL を再起動すると良いでしょう:

# mysql_upgrade -u root -p

データベースのチェック・最適化・修復

mariadb に付属している mysqlcheck を使うことで、シェルからデータベースのテーブルをチェック・最適化・修復することができます。詳しくは mysqlcheck の man ページを見てください。よく使われるコマンドは以下の通りです。

全てのデータベースの全てのテーブルをチェックするには:

$ mysqlcheck --all-databases -u root -p -c

全てのデータベースの全てのテーブルを解析するには:

$ mysqlcheck --all-databases -u root -p -a

全てのデータベースの全てのテーブルを修復するには:

$ mysqlcheck --all-databases -u root -p -r

全てのデータベースの全てのテーブルを最適化するには:

$ mysqlcheck --all-databases -u root -p -o

バックアップ

簡易バックアップとしてファイルにデータベースを出力することが可能です。以下のシェルスクリプトは、データベースのダンプが含まれた 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/

MariaDB 10.1.16 からデフォルトではデータディレクトリを /home/root、あるいは /run/user などにできないようになっています。データディレクトリを移動するか、あるいは mariadb.service を編集して以下の行を:

ProtectHome=true

以下のように置き換えてください:

ProtectHome=false

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

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

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

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

# mysql_upgrade -u root -p

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

mariadb.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

mariadb.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 コマンドに引数としてパスワードを指定することでログインすることは可能です。
警告: 以下のコマンドを実行するとパスワードがログに保存されるなどして漏洩する危険性があります。緊急の場合にのみ使ってください。そしてすぐにパスワードを変えてください。
$ mysql -u <user> -p"<some-very-strong-password>"

MySQL のバイナリログがディスク容量を逼迫させている

デフォルトで、mysqld はバイナリログファイルを /var/lib/mysql に作成します。マスターサーバーのレプリケーションやデータの復旧などにログは役立ちますが、バイナリログはディスク容量を逼迫させる可能性もあります。レプリケーションやデータの復元機能を使わない場合、/etc/mysql/my.cnf で以下の行をコメントアウトすることでバイナリログを無効化できます:

#log-bin=mysql-bin
#binlog_format=mixed

以下のようにログファイルの容量を制限することもできます:

expire_logs_days = 10
max_binlog_size  = 100M

また、以下のコマンドを使って /var/lib/mysql のバイナリログを消去することでディスク領域を確保することができます:

# mysql -u root -p "PASSWORD" -e "PURGE BINARY LOGS TO 'mysql-bin.0000xx';"

OpenRC で MySQL を起動できない

OpenRC で MySQL を使うには MySQL の設定ファイル (/etc/mysql/my.cnf) の [mysqld] セクションに以下の行を追加する必要があります:

user = mysql
basedir = /usr
datadir = /var/lib/mysql
pid-file = /run/mysqld/mysql.pid

以下のコマンドで MySQL を起動できるはずです:

# rc-service mysql start

Specified key was too long

#文字数制限の増加を参照してください。

参照