コピペコードで快適生活

明日使えるソースを自分のために

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は最新です」という表示が出ていたので、おやおやこれはどういうことだろうと思って、調べてみた。

という挙動をしているので、古いバージョンをインストールしたあと、初回アクセスしたときに自動でアップグレードされているっぽいという結論に至った。

MySQLのレプリケーションユーザ名を修正する

MySQLレプリケーションユーザ名を間違っていたので、mainの稼働を止めずに修正する。

やること概要

レプリケーション停止して、設定をリセットする

# 設定確認
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
    • innoDBの場合はこれでOK。つけないとデータがずれる
    • MyISAMの場合は --lock-all-tables で。
  • --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

ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) - コピペコードで快適生活 の続き

パスワードの設定

# ユーザ作成時に設定する
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でパスワード管理されているユーザなのでログインできないよ、ということらしい。

オプションつけて接続する

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

参考