systemctlコマンドメモ
# サービス一覧 # 設定ファイルの配置場所: https://kinosuke.hatenablog.jp/entry/2021/03/18/195942 systemctl list-unit-files --type=service # サービス起動 systemctl start ${svc_name} # サービス停止 systemctl stop ${svc_name} # サービス再起動 systemctl restart ${svc_name} # サービスリロード systemctl reload ${svc_name} # サービスステータス表示 systemctl status ${svc_name} # サービス自動起動有効 systemctl enable ${svc_name} # サービス自動起動無効 systemctl disable ${svc_name} # サービス自動起動設定確認 systemctl is-enabled ${svc_name} # 設定ファイルの再読込 systemctl daemon-reload
WordPressの自動アップグレードの挙動
古いWordPressをインストールしたはずなのに、管理ページにログインしたら「WordPressは最新です」という表示が出ていたので、おやおやこれはどういうことだろうと思って、調べてみた。
- バージョンの区切りは
メジャーver.メジャーver.マイナーver
- 5.7.1 の場合は、5.7がメジャーverで、1がマイナーver
- マイナーver = メンテナンスリリース&セキュリティリリース
- https://ja.wordpress.org/support/topic/wordpressの自動アップデートについて/
- 自動アップグレードは常にON(OFFにはできない)
- 管理ページで自動アップグレードするバージョンの範囲を設定できる。
- デフォルトはメジャーバージョンも自動アップグレード。
- マイナーのみ自動アップグレードに変更することもできる。
- 自動更新のタイミングは1日2回
- https://ja.wordpress.org/support/topic/wordpressの自動アップデートについて/
- 特定日次以降にサイトにアクセスがあったときに、自動的にアップグレードがされる。(すごい力技)
- https://b-risk.jp/blog/2017/09/wp_cron/
- WP-Cronの動きとしては02:00に処理が実行されるのではなく、02:00以降の最初のアクセス時に処理が実行されます(毎日02:00実行設定の場合)。
- 自動アップグレードはいつから導入された?
- マイナーアップグレードは3.7から。管理画面からはOFFにできない。
- メジャーアップデートは5.6から?
という挙動をしているので、古いバージョンをインストールしたあと、初回アクセスしたときに自動でアップグレードされているっぽいという結論に至った。
MySQLのレプリケーションユーザ名を修正する
MySQLのレプリケーションユーザ名を間違っていたので、mainの稼働を止めずに修正する。
やること概要
- レプリケーション停止して、設定をリセットする
- mainでユーザ名を変える
- mainからバックアップを取得する
- replicaにリストアする
- レプリケーションの接続設定を新規で作成する
- レプリケーション開始
レプリケーション停止して、設定をリセットする
# 設定確認 mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** # 略 Slave_IO_Running: Yes Slave_SQL_Running: Yes # 略 # レプリケーション停止 mysql> STOP SLAVE; # 設定確認 mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** # 略 Slave_IO_Running: No Slave_SQL_Running: No # 略 # 設定リセット mysql> RESET SLAVE; mysql> quit # MySQL再起動 $ sudo systemctl restart mysql
mainのレプリケーションユーザ名を変更する
# 確認 mysql> SELECT User, Host FROM mysql.user WHERE User LIKE "%repluser%"; +----------------+-------------+ | User | Host | +----------------+-------------+ | mysql_repluser | 192.168.0.% | +----------------+-------------+ 1 row in set (0.00 sec) # ユーザ名変更 mysql> RENAME USER 'mysql_repluser'@'192.168.0.%' TO 'repluser'@'192.168.0.%'; # 確認 mysql> SELECT User, Host FROM mysql.user WHERE User LIKE "%repluser%"; +----------+-------------+ | User | Host | +----------+-------------+ | repluser | 192.168.0.% | +----------+-------------+ 1 row in set (0.00 sec)
mainからダンプファイルを取得する
mysqldump --all-databases --single-transaction --routines --triggers --events --master-data=2 --hex-blob -u root -h localhost -p > dump.sql
--all-databases
- 全DBのダンプを取得
--single-transaction
--routines --triggers --events
- NODOC
--master-data=2
SHOW MASTER STATUS
の値(ポジション値)をダンプファイルに含める
--hex-blob
- 非UTF8な環境でもリストア時にデータが壊れることがない。でもデータサイズはでかくなる。
replicaにリストアする
# リストア mysql -u root -h localhost -p < dump.sql # 権限設定を再ロード(リストアだけだとロードされないので) mysql -u root -h localhost -e "FLUSH PRIVILEGES;" -p
replicaでレプリケーションの設定をする
ダンプファイルからポジションを確認する
cat dump.sql | grep "MASTER_LOG_FILE" | head -n 1 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000063', MASTER_LOG_POS=559;
mainへの接続設定してレプリケーションを開始する
# 接続設定 mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='repluser', MASTER_PASSWORD='xxxxx', MASTER_LOG_FILE='mysql-bin.000063', MASTER_LOG_POS=559; # 確認 mysql> SHOW SLAVE STATUS\G # レプリケーション開始 mysql> START SLAVE; # レプリケーションが開始されたことを確認 mysql> SHOW SLAVE STATUS\G # 略 Slave_IO_Running: Yes Slave_SQL_Running: Yes # 略
レプリケーションされていることを確認
main
# mainでDBを作る mysql> create database hoge; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hoge | | mysql | +--------------------+ 3 rows in set (0.00 sec)
replace
# replacaに反映されていることを確認 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hoge | | mysql | +--------------------+ 3 rows in set (0.00 sec)
MySQLリストアした後にログインできない
症状
- リストアしたDBに、一部のユーザでMySQLにログインできない
原因
- mysql.userテーブルを直接更新した場合、権限設定が自動で再ロードされないため。
対応方法
- mysqldをrestartするか、
mysql> FLUSH PRIVILEGES;
すればOK。
経緯
移行元
# 移行元からダンプファイル取得 # mysqlのシステムDBも含める mysqldump -u$user -p$pw --opt --all-database > dump.sql
移行先
# 移行先にダンプファイルをリストア # mysqlシステムDBもまとめて上書き mysql -u$user -p$pw -h localhost < dump.sql # 移行元にあったMySQLユーザでログインをためす # でもログインできない mysql -u app_user -h localhost -p Enter password: ERROR 1130 (HY000): Host 'xx.xx.xx..xx' is not allowed to connect to this MySQL server # rootではログインできた mysql -u root -h localhost -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. # user情報を確認するが、移行元の情報と全く同じ mysql> SELECT * FROM mysql.user WHERE User = 'app_user'; # 権限を確認するが、なぜか外れている mysql> SHOW GRANTS FOR 'app_user'@'localhost'\G ERROR 1141 (42000): There is no such grant defined for user 'ap_user' on host 'localhost' # 権限反映 # https://dba.stackexchange.com/questions/32967/cant-show-grants-after-mysql-re-install mysql> FLUSH PRIVILEGES; # 権限が取得できるようになった mysql> SHOW GRANTS FOR 'app_user'@'localhost'\G *************************** 1. row *************************** Grants for app_user@localhost: GRANT ALL PRIVILEGES ON *.* TO app_user@localhost IDENTIFIED BY PASSWORD 'xxxxxx' 1 row in set (0.00 sec) mysql> quit # ログインできた mysql -u app_user -h localhost -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.
MySQLのnative_passwordとold_password
パスワードの設定
# ユーザ作成時に設定する CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; # ハッシュ化パスワードを直指定して作る CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY PASSWORD '*90E462C37378CED12064BB3388827D2BA3A9B689'; # パスワードを変更する SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass'); # ハッシュ化パスワードを指定して変更する # GRANT USAGEを使うことで、現在の権限設定に影響なく変更が行える。 GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY PASSWORD '*90E462C37378CED12064BB3388827D2BA3A9B689';
- パスワードのハッシュ化フォーマットは、システム変数old_passwordsの値で決まる。
- ONであれば、old_password
- OFFであれば、native_password
ハッシュ化パスワードの確認
# old_passwordが無効になっている mysql> SHOW VARIABLES WHERE Variable_name = "old_passwords"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | old_passwords | OFF | +---------------+-------+ 1 row in set (0.00 sec) # このセッションでだけ有効にするには # SET old_passwords = 1; # デフォの値はmy.cnfで設定できる # old_passwords=1 # native_passwordのハッシュ化パスワード mysql> SELECT PASSWORD('hogehoge') as pass; +-------------------------------------------+ | pass | +-------------------------------------------+ | *0B025000DCF68B1D374153A7005639E320D41D5B | +-------------------------------------------+ 1 row in set (0.00 sec) # old_passwordのハッシュ化パスワード # OLD_PASSWORD()を使うことで、old_passwords=OFFの場合でも、old_passwordのハッシュ化ができる。 mysql> SELECT OLD_PASSWORD('hogehoge') as pass; +------------------+ | pass | +------------------+ | 0b9eb44c024ed960 | +------------------+ 1 row in set (0.00 sec)
参考
ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)
$ mysql -u app_user -h 192.168.0.1 -p Enter password: ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)
とでた。 mysql_native_passwordで認証しようとしたけど、mysql_old_passwordでパスワード管理されているユーザなのでログインできないよ、ということらしい。
- http://nanoappli.com/blog/archives/7620
- https://dev.mysql.com/doc/refman/5.6/ja/account-upgrades.html
オプションつけて接続する
※MySQLの5.7.5以降のバージョンでは非推奨
# 普通に接続するとだめなので $ mysql -u app_user -h 192.168.0.1 -p Enter password: ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) # --skip-secure-authオプションつける $ mysql -u app_user -h 192.168.0.1 -p --skip-secure-auth Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.
デフォルトでオプションを有効にする
※MySQLの5.7.5以降のバージョンでは非推奨
mysql --help # 略 Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf # 略
なので、/etc/my.cnf
あたりに
[client] skip-secure-auth
追加してからmysqlコマンドで接続すればOK。
トラブルシュート時に使うコマンドメモ(2)
# wchanでプロセスの待ち状態を表示 sudo ps ax -opid,cmd,wchan # fオプションでプロセスをツリー表示 ps auxf # システムコールレベルでの処理をトレース strace -p <プロセスの PID> # 子プロセスもまとめてトレース strace -p <プロセスの PID> -f # プロセスがオープンしているファイルを一覧表示 lsof