DigitalOceanの最近のリリースは、低価格なホスティングサービスというルーツを脱して本格的なクラウドプロバイダーになろうとする意欲の表れだ——DigitalOceanがPostgreSQLに続いてMySQLとRedisのマネージドデータベースサービスをローンチ | TechCrunch Japan https://t.co/dHTDWpW5UN pic.twitter.com/JJVpFzQ7MK
— TechCrunch Japan (@jptechcrunch) August 21, 2019
去年の夏頃にDigitalOceanがマネージドDBにMySQLが利用できるようになったので、今回このブログサーバーで動いているDBを移行してみました。(月$15安い) MySQL5.7から8にもバージョンアップしたので移行手順をブログします。
■Terraform
- do_db.tf
1 2 3 4 5 6 7 8 |
resource "digitalocean_database_cluster" "adachin_db" { name = "adachin-db-cluster" engine = "mysql" version = "8" size = var.db-size region = var.region node_count = 1 } |
- do_firewall.tf
1 2 3 4 5 6 7 8 9 10 11 12 |
resource "digitalocean_database_firewall" "managed_db" { cluster_id = digitalocean_database_cluster.adachin_db.id rule { type = "droplet" value = digitalocean_droplet.adachin_server01.id } rule { type = "k8s" value = digitalocean_kubernetes_cluster.adachin_wiki_cluster.id } } |
まずはManaged DBのTerraform化と専用のファイアウォールを追加しました。
- apply
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
~省略~ Terraform will perform the following actions: # digitalocean_database_cluster.adachin_db will be created + resource "digitalocean_database_cluster" "adachin_db" { + database = (known after apply) + engine = "mysql" + host = (known after apply) + id = (known after apply) + name = "adachin-db-cluster" + node_count = 1 + password = (known after apply) + port = (known after apply) + region = "sgp1" + size = "db-s-1vcpu-1gb" + uri = (known after apply) + user = (known after apply) + version = "8" } ~省略~ Plan: 2 to add, 0 to change, 0 to destroy. |
■DigitalOcean/Database
- Connect to this database cluster
接続情報ですがプライベートネットワークを選択し、メモります。 Flags
を選択するとmysqlコマンドでワンライナーが表示されます。サーバーでペーストするだけでログインできるので楽です。
- Insights
ここではDBのリソースを可視化してくれています。slackでアラート通知も設定できるのでやりましょう。
- Logs & Queries
DBのログなどの確認は上記のように閲覧可能となります。CloudWatch Logsぽい。
- Users & Databases
DBやユーザはUIから追加可能なので、今回はwordpress用に作成しました。
- Backup
バックアップは7日間無料でしてくれています。これは良い!
- Global SQL mode
https://www.digitalocean.com/community/questions/which-sql-mode-values-to-use-for-wordpress
wordpressは STRICT_TRANS_TABLES
を追加しないと以下のようにアーカイブで of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column
が出てしまうので忘れずに。
1 |
[19-Jan-2020 15:15:18] WARNING: [pool www] child 19803 said into stderr: "NOTICE: PHP message: WordPress データベースエラー: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'wordpress.wp_posts.post_date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by for query SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC made by require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/hestia/single.php'), get_template_part, locate_template, load_template, require('/themes/hestia/template-parts/content-single.php'), get_sidebar, locate_template, load_template, require_once('/themes/hestia/sidebar.php'), dynamic_sidebar, WP_Widget->display_callback, WP_Widget_Archives->widget, wp_get_archi... |
■DB dump & restore
- connection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ mysql -u hoge -p -h private-adachin-db-cluster-do-user-xxxxx-x.db.ondigitalocean.com -P xxxxx Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 299 Server version: 8.0.18 Source distribution Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | defaultdb | | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 6 rows in set (0.00 sec) mysql> show variables like '%char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /opt/mysql/share/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) |
ちゃんと接続できているのでOK。
- パスワード認証方式を変える
なるほど。MySQL8だとパスワードの認証方式がcaching_sha2_passwordに変わってるからmysql_native_passwordに戻すだけやった。お勉強になる👍
— adachin👾SRE (@adachin0817) January 19, 2020
1 2 3 4 5 6 7 |
mysql> select User, Plugin from mysql.user where User = 'hoge'; +---------+-----------------------+ | User | Plugin | +---------+-----------------------+ | hoge | caching_sha2_password | +---------+-----------------------+ 1 row in set (0.00 sec) |
上記のようにMySQL8ではパスワードの認証方式が caching_sha2_password
に変わっているのでそのままだと データベース接続エラー
になってしまうので、 mysql_native_password
に変更します。
1 2 3 4 5 6 7 8 9 |
mysql> ALTER USER hoge identified WITH mysql_native_password BY 'hogehoge'; Query OK, 0 rows affected (0.02 sec) mysql> select User, Plugin from mysql.user where User = 'hoge'; +---------+-----------------------+ | User | Plugin | +---------+-----------------------+ | hoge | mysql_native_password | +---------+-----------------------+ 1 row in set (0.00 sec) |
- dump & restore
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$ mysqldump -u root -p -h localhost wordpress > adachin-server-labo.sql $ mysql -u hoge -phogehoge -h private-adachin-db-cluster-do-user-xxxx-x.db.ondigitalocean.com -P xxxxx wordpress < adachin-server-labo.sql $ mysql -u hoge -p -h private-adachin-db-cluster-do-user-xxxxx-x.db.ondigitalocean.com -P xxxxx Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 299 Server version: 8.0.18 Source distribution Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | defaultdb | | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 6 rows in set (0.00 sec) mysql> show tables; +------------------------+ | Tables_in_wordpress | +------------------------+ | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_popularpostsdata | | wp_popularpostssummary | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_termmeta | | wp_terms | | wp_tm_taskmeta | | wp_tm_tasks | | wp_usermeta | | wp_users | | wp_yarpp_related_cache | +------------------------+ 17 rows in set (0.00 sec) |
- fix wp-config.php
1 2 3 4 5 |
define('DB_NAME', 'wordpress'); define('DB_USER', 'hoge'); define('DB_PASSWORD', 'hogehoge'); define('DB_HOST', 'xxxxxxxxxxxxxxxxx-xxxx-x.db.ondigitalocean.com:12345'); define('DB_CHARSET', 'utf8mb4'); |
Done!!
- remove mysql-server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# aptitude remove mysql-server The following packages will be REMOVED: libaio1{u} libevent-core-2.1-6{u} mysql-client-5.7{u} mysql-client-core-5.7{u} mysql-common{u} mysql-server mysql-server-5.7{u} mysql-server-core-5.7{u} 0 packages upgraded, 0 newly installed, 8 to remove and 1 not upgraded. Need to get 0 B of archives. After unpacking 154 MB will be freed. Do you want to continue? [Y/n/?] Y (データベースを読み込んでいます ... 現在 104572 個のファイルとディレクトリがインストールされています。) mysql-server (5.7.28-0ubuntu0.18.04.4) を削除しています ... mysql-server-5.7 (5.7.28-0ubuntu0.18.04.4) を削除しています ... update-alternatives: /etc/mysql/my.cnf (my.cnf) を提供するために自動モードで /etc/mysql/my.cnf.fallback を使います update-alternatives: 警告: /etc/mysql/my.cnf をリンクで置き換えません mysql-server-core-5.7 (5.7.28-0ubuntu0.18.04.4) を削除しています ... mysql-client-5.7 (5.7.28-0ubuntu0.18.04.4) を削除しています ... mysql-client-core-5.7 (5.7.28-0ubuntu0.18.04.4) を削除しています ... libaio1:amd64 (0.3.110-5ubuntu0.1) を削除しています ... libevent-core-2.1-6:amd64 (2.1.8-stable-4build1) を削除しています ... mysql-common (5.8+1.0.4) を削除しています ... man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ... libc-bin (2.27-3ubuntu1) のトリガを処理しています ... # rm -rf /var/lib/mysql |
■まとめ
https://t.co/Nn8n750fXW
とりあえずDigitalOceanのマネージドにDB移行できた。MySQL5.7から8に移行する際気をつけることも勉強になったのでよしとしましょう👍— adachin👾SRE (@adachin0817) January 19, 2020
MySQL8にちょいハマりましたが、知見高まったので良き!メモリーも余裕出てきたので次はPHPバージョンアップしよう。ちなみに7.2を使っているので今年の11月にサポート切れてしまう!!php-fpmもチューニングし直します。wikiも移行完了しました。
0件のコメント