[MySQL] zombie dump threads対処法

MySQLを5.6から5.7にアップデートしたら、MySQLログに以下のメッセージが記録されるようになった。レプリケーションしているマスター側のログのみに記録されている。

/var/log/mysqld.log

2020-07-24T03:39:03.790695+09:00 363 [Note] Start binlog_dump to master_thread_id(363) slave_server(369034799), pos(mysql-bin.000018, 70234)
2020-07-24T03:40:03.896291+09:00 366 [Note] While initializing dump thread for slave with UUID <be434b09-3c76-11ea-b276-0e1a567dc58c>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(363).
2020-07-24T03:40:03.896398+09:00 366 [Note] Start binlog_dump to master_thread_id(366) slave_server(369034799), pos(mysql-bin.000018, 70234)
2020-07-24T03:41:04.019671+09:00 369 [Note] While initializing dump thread for slave with UUID <be434b09-3c76-11ea-b276-0e1a567dc58c>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(366).

ネットを検索すると同じ現象がヒットした。

replication – MySQL Zombie Dump threads – Stack Overflow
https://stackoverflow.com/questions/38500713/mysql-zombie-dump-threads

MySQL :: MySQL Zombie Dump threads.
https://forums.mysql.com/read.php?26,648406,648406#msg-648406

記事によれば、slave_net_timeオプション(スレーブがマスターからのデータを待機する時間)の規定値が、MySQL 5.6では3600秒だったのが、MySQL 5.7では60秒に変更されているらしい。

おそらくウチの構成だと60秒では短すぎるのだろう。スレーブ側でMySQL 5.6の規定値だった3600に設定しなおしたら解決。とりあえずこれでしばらく様子を見る。

参考サイト

第75回 MySQLのさまざまなタイムアウトオプションについて:MySQL道普請便り|gihyo.jp … 技術評論社
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0075

[MySQL] ユーザパスワードを変更する

前任者がWebアプリ用にMySQLユーザを作成らしいけど、Webアプリの設定を見るとrootでMySQLに接続している。せっかく作成したユーザが使われていないのは無駄だし、権限何でもアリのrootでMySQLに接続しているのは危険なので、そのユーザを使いたいのだけどパスワードがわからない。

調べてみると、ユーザのパスワード設定は簡単にできた。

ログインできるか確認する。

ログインできた。

以上覚え書き。

[MySQL] タイムゾーンを設定する

稼働中のLaravelサイトをローカルに複製するために、DBをダンプしてローカルにインポートしたところ、ローカルのLaravelが以下のエラーを吐いた。

ローカル(CentOS7)のMySQLには’Asia/Tokyo’というタイムゾーンが定義されていないみたい。

参考サイトの手順に倣ってタイムゾーンデータをインポートすることで解決。

参考サイト

MySQLでタイムゾーンを設定する – Qiita
https://qiita.com/tailak/items/63dce2dd7dfe049b038e

[MySQL] mysqlcheckでテーブルをエラーチェックする

もしかしてテーブルが破損してるかも?と思ったので、mysqlcheckでエラーチェックする。

ちなみに、mysqlcheckには以下の4つの機能があるらしい。

  • テーブルのエラーチェック (デフォルト)
  • テーブルの分析 (–analyze オプション)
  • テーブルの最適化 (–optimize オプション)
  • テーブルの修復 (–repair オプション)

全データベースをチェックする場合

sampleデータベースのみをチェックする場合

参考サイト

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.3 mysqlcheck — テーブル保守プログラム
https://dev.mysql.com/doc/refman/5.6/ja/mysqlcheck.html

テーブルが壊れているかと思ったので、mysqlcheckで修復したときのメモ – Qiita
https://qiita.com/tachitechi/items/e8fd8f8fbf34a3bd884d

[Apache] HTTP/2を設定する

HTTP/1.1で動いているApacheをHTTP/2に変更する。

HTTP/2モジュールのロード

confの設定を確認。

既に設定されていた。

モジュールがロードされていることを確認。

バーチャルホストの設定

プロトコル合意順序を有効とし、h2とhttp/1.1の順序とした。

  • h2 – HTTP/2 (TLS)
  • h2c – HTTP/2 (平文)
  • http/1.1

HTTP/2通信されているか確認

ブラウザでサイトにアクセスして、ブラウザの開発者ツールでプロトコルを確認する。

参考サイト

HTTP/2の各種設定 – Apache 2.4系でHTTP/2対応サーバを構築してみるテスト。
https://http2.try-and-test.net/config.html

HTTP/2の特徴 HTTP/1.1との違いについて | REDBOX Labo
https://blog.redbox.ne.jp/http2-cdn.html

【図解】HTTP/2って?HTTP/1.1との違いと導入メリット・課題まとめ | カゴヤのサーバー研究室
https://www.kagoya.jp/howto/webhomepage/http-2/

[MariaDB] MariaDB5.5を10.4にアップグレードする

MariaDB 5.5で前エントリのような問題が起きたので、現時点の安定板の10.4にアップデートしてみる。

稼働中のバージョンは5.5.60。

公式サイトの以下のページの手順に従って作業する。

MariaDB – Setting up MariaDB Repositories – MariaDB
https://downloads.mariadb.org/mariadb/repositories/#distro=CentOS&distro_release=centos7-amd64–centos7&mirror=aarnet_pty_ltd&version=10.3

1. Choose a Distro: CentOS
2. Choose a Release: CentOS 7 (x86_64)
3. Choose a Version: 10.4 [Stable]

前エントリの問題は解決されたことを確認。

参考サイト

CentOS7のMariaDB5.5を10.3にアップグレードする – Qiita
https://qiita.com/egnr-in-6matroom/items/6dbb684ff03a228947bd

[MariaDB] MariaDB5.5でdatetime型のデフォルトnow()は不可

ローカルで問題なかったDBマイグレーションがテストサーバーで失敗した。エラーが起きたのはdatetime型カラムのデフォルトにnow()を指定している箇所。

DBエンジンはMariaDB 5.5.60 (ちなみにローカルはMySQL 5.7.27)。

簡単なSQLで試してみる。

datetime型にnow()をデフォルトにできない。

timestamp型だとnow()をデフォルトにできる

MariaDBの仕様かなと思って調べると以下の記事がヒット。

mysql – MariaDB CURRENT_TIMESTAMP default – Stack Overflow
https://stackoverflow.com/questions/40864951/mariadb-current-timestamp-default

CURRENT_TIMESTAMP as a default for DATETIME type is only available in 10.x.
If you’re using 5.5, it should a TIMESTAMP column.

MariaDBを10.xにアップグレードすれば解決するみたいだ。

参考サイト

MySQLのDATETIME型とTIMESTAMP型の違いを検証してみた – Qiita
https://qiita.com/ykawakami/items/2449a24e3b82ff0cbab6

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型
https://dev.mysql.com/doc/refman/5.6/ja/datetime.html

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.5 TIMESTAMP および DATETIME の自動初期化および更新機能
https://dev.mysql.com/doc/refman/5.6/ja/timestamp-initialization.html

mysql – Invalid default value for ‘dateAdded’ – Stack Overflow
https://stackoverflow.com/questions/9005766/invalid-default-value-for-dateadded

[PHP] composerでocramius/package-versionsのインストールに失敗する

ネットで調べると以下の記事がヒット。

Composer plugin installation failed · Issue #1240 · laravel/homestead · GitHub
https://github.com/laravel/homestead/issues/1240

以下のようにオプションを追加してエラー回避。