2017年3月22日水曜日

CentOS6でMySQLを 5.7 に移行してハマった話


MySQLでMyISAMからInnoDBにストレージエンジンを変更しようとしたら、できなかったので。。。
MySQLを 5.1から5.7に移行してみた!


もくじ



MyISAMのストレージエンジンをInnoDBにしたかった・・・。

あれ??出来ない・・・。
mysql> ALTER TABLE wp_posts ENGINE InnoDB;
ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes
あれあれ?できない・・・。
mysql> set GLOBAL innodb_optimize_fulltext_only=ON;
ERROR 1193 (HY000): Unknown system variable 'innodb_optimize_fulltext_only'

Percona Serverを検索してみる

あれ?入っていなかった。
[root@www8297ue mysql]# rpm -qa | grep -i percona

MySQLを検索してみる

あー!MySQLふるーいw
5.1なのかー
[root@www8297ue mysql]# rpm -qa | grep -i mysql
php-mysqlnd-7.0.17-1.el6.remi.x86_64
mysql-libs-5.1.73-8.el6_8.x86_64
mysql-5.1.73-8.el6_8.x86_64
mysql-server-5.1.73-8.el6_8.x86_64
perl-DBD-MySQL-4.013-3.el6.x86_64
このバージョンの『InnoDB』って、FULLTEXTインデックス使えないみたい~

バックアップを取る

 $ mysqldump --all-databases -p > all.sql

Percona Server で 5.7 を構築

他でも使っていて、実績のある『Percona Server』 を使うことに。
sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
sudo yum install Percona-Server-server-57
  • mysqlを削除
sudo yum remove mysql
sudo rm -rf /var/lib/mysql # ← 潔く古いデータは消す。。。
  • PerconaServerをインストール
sudo yum install Percona-Server-server-57


Installing Percona Server on Red Hat Enterprise Linux and CentOS

ゆるーく、innodbを設定

/etc/percona-server.conf.d/mysqld.cnf

テーブルごとに、ファイルを生成
innodb_data_file_path=ibdata1:128M:autoextend
innodb_file_per_table               = 1
innodb_buffer_pool_size             = 128M
innodb_log_file_size                = 128M
innodb_log_files_in_group           = 2

MySQL 5.7 (Percona Server 5.7) の設定でハマる!!!


初期のrootパスワードがわからない!

テンポラリーのパスワードが、生成されているらしい。
 sudo cat /var/log/mysqld.log | grep "temporary password"

パスワードポリシーが厳しすぎる・・・

mysql> SET GLOBAL validate_password_length=3; # ← 4ケタ未満にはできないらしい・・・。
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL validate_password_policy=LOW; # ← パスワードポリシーを低くする・・・。(すみません。。。)
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 4     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.04 sec)

デフォルト値が「0」がダメ!

あれ?
mysql> alter table wp_posts engine=innodb;
ERROR 1067 (42000): Invalid default value for 'post_date'
そういえば、Defaultが『0000-00-00 00:00:00
mysql> desc wp_posts;
+-----------------------+---------------------+------+-----+---------------------+----------------+
| Field                 | Type                | Null | Key | Default             | Extra          |
+-----------------------+---------------------+------+-----+---------------------+----------------+
| ID                    | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| post_author           | bigint(20) unsigned | NO   | MUL | 0                   |                |
| post_date             | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_date_gmt         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content          | longtext            | NO   | MUL | NULL                |                |
| post_title            | text                | NO   | MUL | NULL                |                |
| post_excerpt          | text                | NO   |     | NULL                |                |
| post_status           | varchar(20)         | NO   |     | publish             |                |
| comment_status        | varchar(20)         | NO   |     | open                |                |
| ping_status           | varchar(20)         | NO   |     | open                |                |
| post_password         | varchar(255)        | NO   |     |                     |                |
| post_name             | varchar(200)        | NO   | MUL |                     |                |
| to_ping               | text                | NO   |     | NULL                |                |
| pinged                | text                | NO   |     | NULL                |                |
| post_modified         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_modified_gmt     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content_filtered | longtext            | NO   |     | NULL                |                |
| post_parent           | bigint(20) unsigned | NO   | MUL | 0                   |                |
| guid                  | varchar(255)        | NO   |     |                     |                |
| menu_order            | int(11)             | NO   |     | 0                   |                |
| post_type             | varchar(20)         | NO   | MUL | post                |                |
| post_mime_type        | varchar(100)        | NO   |     |                     |                |
| comment_count         | bigint(20)          | NO   |     | 0                   |                |
+-----------------------+---------------------+------+-----+---------------------+----------------+
23 rows in set (0.00 sec)

「SQL_MODE='ALLOW_INVALID_DATES'」で、つかえるようになるらしいが・・・

通るけど。。。
mysql> SET SQL_MODE='ALLOW_INVALID_DATES';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> ALTER TABLE wp_posts              ENGINE InnoDB;
Query OK, 27 rows affected (0.39 sec)
SQLスクリプトだと変更の仕方がわからない~

SQLスクリプトの内容を書き換える。

雑。
sed -i 's/0000-00-00 00:00:00/1970-01-01 00:00:01/g' all.sql

まとめ

  • CentOS6のMySQLは『5.1』と古い・・・
  • MySQL5.7は、結構設定でハマるー
お役にたてば幸いです!


Zenback