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では、データベース、テーブル、カラムのそれぞれに対して文字セットと照合順序を設定できる。
文字セット
- 用語
-- 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:
- 識別子を保存するための文字コード?
- 常にutf8らしい
- character_sets_dir:
- 文字セットを扱うために必要なファイルがあるディレクトリ
- character_set_client:
照合順序
- 値を並び替えするときや比較するときのルール
- 大文字と小文字を区別するかどうかなど
- 照合順序が異なるカラムで比較するとエラーする(比較ルールが異なるため)
- 文字セットごとに照合順序が用意されている
- 例:
-- 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
参考
MySQLのストレージエンジンを確認する
-- 使用できるエンジンを確認する -- デフォルトのエンジンを確認する show engines; -- テーブル設定を一覧表示する show table status; -- テーブルの設定を確認する SHOW CREATE TABLE #{table_name}\G
PHPでの日時処理
PHPよく理解してないので整理。日時まわり。
date関数
- 出力したい文字列のフォーマットを受け取り、現在日時(or渡したタイムスタンプ)の日時を、
文字列
で返す - https://www.php.net/manual/ja/function.date.php
echo date('Y-m-d'); // -> 2021-06-01 echo date('Y-m-d H:i:s', 1622419200); -> 2021-05-31 00:00:00
strtotime関数
- 日時文字列を受け取り、
タイムスタンプ(INT)
を返す - シンプルなINTなので、タイムゾーンの情報は持たない。
- https://www.php.net/manual/ja/function.strtotime.php
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