WindowsからCentOSへ、MySQLをMariaDBに移行する

以下の環境間で、DBを移行したときのメモです。MariaDBデビューです。

[移行元]

[移行先]

MySQLからMariaDBへのアップグレードは、公式で手順が公開されていますが、異なるプラットフォーム間でというのは見つからなかったです。

公式でのバージョンアップ手順は下記。Win→nixの手順はなし。

Upgrading from MySQL to MariaDB - MariaDB Knowledge Base

そのため、以下の手順で進めます。

  1. 移行元環境でmysqldumpを取得
  2. 移行先環境にmariadbをインストール/初期設定
  3. 移行先環境にmysqldumpを流し込む

移行元環境でmysqldumpを取得

以下コマンドでmysqldumpを取得します。sqlmodeをansiにして出力しておきます。kessanというのは対象DB名です。

> mysqldump --compatible=ansi --default-character-set=utf8 kessan > /data/kessan.dmp

移行先環境にMariaDBをインストール/初期設定

MariaDBのインストール方法は公式に記載されている通り。

yum による MariaDB のインストール - MariaDB Knowledge Base

MariaDB用のyumリポジトリを追加して、yumでインストールします。

# vi /etc/yum.repos.d/MariaDB.repo

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# yum install MariaDB-server MariaDB-client

初期設定ですが、MySQLと変わりないようです。設定ファイルである「/etc/my.cnf」を見ると、特に設定されている項目はなく、「/etc/my.cnf.d」配下をincludeしているのが分かります。

# cat /etc/my.cnf

# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

実際に「/etc/my.cnf.d」配下の設定ファイルを見ても、結局何も設定が入っていませんでした。なので、例により「/usr/share/mysql/my-XXXX.cnf」より必要サイズに見合ったサンプル設定ファイルをコピーしてきます。今回は「my-huge.cnf」を持ってきます。

# mv /etc/my.cnf /etc/my.cnf.bk
# mv /usr/share/mysql/my-huge.cnf /etc/my.cnf

設定すべきパラメータについて調べてみたのですが、MariaDB 10.1用に検討すべき値が見つからなかったので、MySQL 5.6時代のものを踏襲します。パラメータについては以下の情報を参考にしています。

チューニング注意点

MySQL 5.6のインストール後にチューニングすべき項目 | Yakst

MySQLをインストールしたら、必ず確認すべき10の設定 | Yakst

文字コードの設定について

Setting Character Sets and Collations - MariaDB Knowledge Base

追加で設定した項目は以下です。

[client]
...
default-character-set = utf8

[mysqld]
...
innodb_data_home_dir = /data/mariadb/data
innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
innodb_log_group_home_dir = /data/mariadb/log
innodb_buffer_pool_size = 1024M
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_flush_neighbors = 0

sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY'

skip_name_resolve = 1

collation-server        = utf8_unicode_ci
init-connect            = 'SET NAMES utf8'
character-set-server    = utf8

[mysql]
...
default-character-set=utf8

且つ、異なるOS間で移行する場合に考慮すべき事項があります。WindowsMySQLではDB名およびテーブル名が内部的には小文字で格納されており(まあ、WindowsのOS自体が大文字と小文字を区別しないですからね)、一方でLinuxMySQLでは大文字と小文字を区別するようなっています。それにより、何も考えずに移行してしまうとエラーとなってしまうらしいです。以下のサイトに詳しいです。

MySQL の lower_case_table_names について,テーブル名とデータベース名の中の大文字小文字について - その手の平は尻もつかめるさ

なので、my.cnfに以下のパラメータを設定し、Linux側でも大文字と小文字を区別させないようしてあげます。

[mysqld]
...
lower_case_table_names=1

で、起動します。

# systemctl start mariadb

ここでSELinuxを有効にしている場合、ハマリポイントがあるので以下に注意です。

SELinux有効時に、MariaDBの起動に失敗する件 - goodbyegangsterのブログ

自動起動の設定はこれ。

# systemctl enable mariadb

mysql_secure_installation」コマンドを用いて、基本的なセキュリティ設定をしましょう。rootユーザのパスワードを設定し、その他の質問項目には「Y」で回答します。

# mysql_secure_installation

一度ログインして、インポート用のDBを作成し、文字コードの設定がutf8であることを確認しておきます。

# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 10.1.21-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database kessan character set utf8;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kessan             |
| mysql              |
| performance_schema |
+--------------------+

MariaDB [(none)]> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

移行先環境にmysqldumpを流し込む

最後にdumpファイルをインポートして完了です。

# mysql -uroot -p --default-character-set=utf8 kessan < /data/kessan.dmp
Enter password: