「MariaDB」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→インストール) |
|||
(3人の利用者による、間の13版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category:データベース管理システム]] |
+ | [[Category:関係データベース管理システム]] |
[[cs:MySQL]] |
[[cs:MySQL]] |
||
[[de:MySQL]] |
[[de:MySQL]] |
||
[[en:MySQL]] |
[[en:MySQL]] |
||
[[es:MySQL]] |
[[es:MySQL]] |
||
− | [[fr: |
+ | [[fr:MariaDB]] |
[[it:MySQL]] |
[[it:MySQL]] |
||
+ | [[ru:MySQL]] |
||
[[sr:MySQL]] |
[[sr: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. |
+ | {{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. |
+ | 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#データベース]] を読んで下さい。 |
||
}} |
}} |
||
− | {{Pkg|mariadb}} をインストールしたら、 {{ic| |
+ | {{Pkg|mariadb}} をインストールしたら、 {{ic|mariadb.service}} を'''[[systemd#ユニットを使う|起動]]する前に'''以下のコマンドを実行してください: |
# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql |
# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql |
||
− | そして、 {{ic|mysqld.service}} を[[systemd#ユニットを使う|起動]](必要であれば[[有効]]に)します。 |
||
− | 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| |
+ | データベースを切り替えるときに環境を移行するには {{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 |
||
56行目: | 57行目: | ||
=== ユーザーを追加する === |
=== ユーザーを追加する === |
||
− | 新しいユーザーの作成は2段階で行います: ユーザーを作って、そのユーザーに権限を与える。以下の |
+ | 新しいユーザーの作成は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 |
+ | 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/ エントリ] を見て下さい。 |
||
=== リモートアクセスを無効にする === |
=== リモートアクセスを無効にする === |
||
74行目: | 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 クライアントを実行した時に補完が有効になります。 |
||
− | === |
+ | === 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 を使う === |
||
112行目: | 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 |
||
== バックアップ == |
== バックアップ == |
||
148行目: | 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 を実行できない === |
||
156行目: | 236行目: | ||
=== root パスワードをリセットする === |
=== root パスワードをリセットする === |
||
− | {{ic| |
+ | {{ic|mariadb.service}} を停止。次のコマンドを実行: |
# mysqld_safe --skip-grant-tables & |
# mysqld_safe --skip-grant-tables & |
||
mysql サーバーに接続。次のコマンドを実行: |
mysql サーバーに接続。次のコマンドを実行: |
||
165行目: | 245行目: | ||
mysql> FLUSH PRIVILEGES; |
mysql> FLUSH PRIVILEGES; |
||
mysql> exit |
mysql> exit |
||
− | {{ic| |
+ | {{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 |
||
200行目: | 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- |
+ | $ 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. |
+ | * [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 ドキュメント] |
||
− | * [[ |
+ | * [[Apache HTTP Server]] - Apache HTTP Server に関する ArchWiki の記事 |
− | * [[PhpMyAdmin]] - Apache/PHP フロントエンドを使って MySQL データベースを管理するのに役立つウェブベースのツールに関する ArchWiki の記事。 |
||
* [[PHP]] - PHP に関する ArchWiki の記事。 |
* [[PHP]] - PHP に関する ArchWiki の記事。 |
||
− | * [ |
+ | * [https://www.askapache.com/mysql/performance-tuning-mysql/ MySQL のパフォーマンスチューニングスクリプトとノウハウ] |
2019年2月22日 (金) 00:11時点における最新版
MySQL は幅広く使われている、マルチスレッドの、マルチユーザー SQL データベースです。機能に関する詳細は 公式ホームページ を見て下さい。
インストール
Arch Linux で選ばれている MySQL の実装は MariaDB です。公式リポジトリから mariadb をインストールしてください。他の実装は:
- Oracle MySQL — Oracle Corporation による実装。
- https://www.mysql.com/ || mysqlAUR
- Percona Server — Percona LLC による実装。
mariadb をインストールしたら、 mariadb.service
を起動する前に以下のコマンドを実行してください:
# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
そして、mariadb.service
を起動 (必要であれば有効に) します。
さらに MySQL を安全にするために以下のコマンドの実行を推奨します:
# mysql_secure_installation
データベースの管理を容易にする dbeaver, mysql-workbench, Adminer, phpMyAdmin などのフロントエンドをインストールしても良いでしょう。mysql-workbench は MariaDB と完全な互換性はありませんが、基本的な作業については問題ありません。
Oracle MySQL から MariaDB へのアップグレード
データベースを切り替えるときに環境を移行するには 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-rehash
を auto-rehash
で置き換えてください。次に MySQL クライアントを実行した時に補完が有効になります。
UTF8MB4 を使う
/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
の再起動が必要です。
#データベースのメンテナンスを参照して最適化とデータベースの健康度チェックを行ってください。
文字数制限の増加
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 のバイナリログがディスク容量を逼迫させている
デフォルトで、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
#文字数制限の増加を参照してください。
参照
- MariaDB 公式ウェブサイト
- MariaDB knowledge Base
- MySQL ドキュメント
- Apache HTTP Server - Apache HTTP Server に関する ArchWiki の記事
- PHP - PHP に関する ArchWiki の記事。
- MySQL のパフォーマンスチューニングスクリプトとノウハウ