コピペコードで快適生活

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

MySQLでバイナリログを削除する

バイナリログファイルの確認

メインDBで確認する

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000091 |       141 |
# 略
| mysql-bin.000107 |        98 |
+------------------+-----------+
17 rows in set (0.00 sec)

レプリケーション先の反映状況を確認する

レプリカで確認する

mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
# 略
            Master_Log_File: mysql-bin.000107
# 略

で、どこまで追いついているか確認する。 削除しようとするバイナリログ以前であれば反映まで待つ。

バイナリログの削除

メインDBで作業する

purge master logs to 'mysql-bin.000091';

MySQLの文字セットと照合順序

MySQLでは、データベース、テーブル、カラムのそれぞれに対して文字セットと照合順序を設定できる。

文字セット

  • 用語
    • 文字セットとは、文字と符号の対応付けたセット。
    • 文字コードとは、文字セットの符号をビット列に変換する方式。
    • 例:
      • Unicodeは文字セット。対応する文字コードUTF8UTF16など複数ある。
      • JIS X 0208は文字セット。対応する文字コードISO-2022-JPEUC-JPShift-JISなど。
    • MySQLの文脈で語られる文字セットは、正確には文字コードっぽい。

-- MySQLで設定可能な文字セットの一覧
show character set;

-- MySQLの設定
-- 出力結果の変数の意味は下記
show variables like '%char%';

-- DBの設定を確認する
show create database #{db_name};

-- 出力例
-- CREATE DATABASE /*!32312 IF NOT EXISTS*/ `my-db` /*!40100 DEFAULT CHARACTER SET utf8 */;
-- /*!32312 xxxx */ は MySQLの拡張コメント。MySQL 3.23.12 以降のサーバーでのみ実行の意味

-- テーブルの設定を確認する
show crate table #{table_name};

  • 文字セットに関する変数
    • character_set_client:
      • クライアントから送られるステートメントcharacter_set_clientの文字セットとして扱う
    • character_set_connection:
      • クライアントから受け取ったステートメントは、character_set_clientからcharacter_set_connectionの文字セットに変換される。
    • character_set_results:
      • サーバがクライアントに返すときはcharacter_set_resultsの文字セットに変換される
    • character_set_database:
      • デフォルトデータベースで使用される文字セット
      • デフォルトデータベース=USE文で指定したデータベースのこと
    • character_set_server:
      • デフォルトの文字セット
    • character_set_filesystem:
    • character_set_system:
    • character_sets_dir:
      • 文字セットを扱うために必要なファイルがあるディレクト

照合順序

  • 値を並び替えするときや比較するときのルール
    • 大文字と小文字を区別するかどうかなど
    • 照合順序が異なるカラムで比較するとエラーする(比較ルールが異なるため)
  • 文字セットごとに照合順序が用意されている
  • 例:
    • cp932_japanese_ci
      • cp932: 文字コード
      • japanese: 言語名。マルチリンガルの場合はgeneralやunicode
      • ci: 比較法。
        • _ci: 大文字と小文字が区別されない
        • _cs: 大文字と小文字が区別される
        • _bin: バイナリ
    • utf8_general_ci
      • アルファベットの大文字小文字は区別しない。他は全て区別。
    • utf8_unicode_ci
      • 大文字小文字/全角半角を区別しない。

-- UTF8で使える照合順序の確認
show collation where charset = 'utf8';

-- DB単位での確認&変更
SELECT @@character_set_database, @@collation_database;
ALTER DATABASE COLLATE 'utf8_general_ci';

-- テーブル単位での確認&変更
SHOW TABLE STATUS FROM #{TABLE_NAME};
ALTER TABLE #{TABLE_NAME} COLLATE 'utf8_general_ci';

/etc/my.cnfの設定

# MySQLサーバの設定
[mysqld]
character-set-server = utf8
collation-server     = utf8_general_ci

# mysqldump用の設定
[mysqldump]
default-character-set = utf8

# MySQLクライアントの設定
# [client]でもOK
# 
# default-character-setの値に以下の変数が従属する
# - character_set_client
# - character_set_connection
# - character_set_results
[mysql]
default-character-set = utf8

参考

PHPでの日時処理

PHPよく理解してないので整理。日時まわり。

date関数

echo date('Y-m-d'); // -> 2021-06-01
echo date('Y-m-d H:i:s', 1622419200); -> 2021-05-31 00:00:00

strtotime関数

echo strtotime('2021/05/31 00:00:00'); // -> 1622419200
echo strtotime('now'); // -> 現在日時

日時の加減算

// 現在日時からの加減算
echo date("Y-m-d H:i:s", strtotime("+1 month"));

// 指定日時からの加減算
echo date("Y-m-d H:i:s", strtotime('2021-06-02 10:20:30' . "+1 month")); // -> 2021-07-02 10:20:30

// 加減算はタイムスタンプ(INT)の足し引きしてもOK
// 月単位の加減算は難しいけど。
$t = strtotime('2021/05/31 00:00:00');
$t += 3600; // 1時間加算
echo date('Y-m-d H:i:s', $t); // -> 2021-05-31 01:00:00

タイムゾーン

// タイムゾーンの確認
echo date_default_timezone_get(); // -> UTC

// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');

PHPUnitのテストの書き方 超入門

いままで書いたことなかったのでメモ。

<?php
require_once 'ContractStartEvent.php';

//
// PHPUnit_Framework_TestCase を継承して
// テスト用クラスを作る
//
class ContractTest extends PHPUnit_Framework_TestCase {
    //
    // テスト用メソッドは、prefixにtestと付ける。
    //
    public function testCreate() {
        $contractModel = new Contract();

        // モックインスタンスを作成する。
        // 引数には実際に実装しているクラスを指定する。
        $paymentApiClient = $this->createMock(PaymentApiClient);

        // モックにsettle関数と戻り値を追加する。
        $paymentApiClient->method('settle')->willReturn(array('result' => true));

        $args = array(
            'start_at' => '2021-06-01T00:00:00+09:00'
        );
        $contract = $contractModel->create($args, array('paymentApiClient' => $paymentApiClient));

        // テスト実行
        $this->assertEquals($contract['start_at'], '2021-06-01T00:00:00+09:00');
    }
}

ポートフォワードして繋ぐMySQLユーザのHostはなに?

結論

踏み台サーバの内部IPアドレス

実験

ポートフォワードする

ssh kinosuke01@fumidai -L 3306:192.168.10.20:3306 -N

Hostが127.0.0.1のユーザを作る

mysql> select User, Host from mysql.user where User = 'checker'\G
User: checker
Host: 127.0.0.1

接続できない

% mysql -u checker -h 127.0.0.1 -p
Enter password:
ERROR 1045 (28000): Access denied for user 'checker'@'192.168.10.10' (using password: YES)

Hostを踏み台の内部IPアドレスに変える

mysql> select User, Host from mysql.user where User = 'checker'\G
User: checker
Host: 192.168.10.10

接続できた

% mysql -u checker -h 127.0.0.1 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

homebrewで複数バージョンのMySQLをインストールして切り替えする

# インストール可能パッケージの確認
brew search mysql

# 最新版のインストール
brew install mysql

# 過去バージョンのインストール
brew install mysql@5.7

# unlinkとlinkでバージョン切り替えする
% brew unlink mysql && brew link --force mysql@5.7

# バージョン確認する
% mysql -V

参考