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ふるーいw5.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は、結構設定でハマるー