runaround’s diary

なんとなく、つれづれ

MySQL8.0 でごにょごにょしてみた(仮) つづき

さて、前回の続きでっす。
run-around.hatenablog.com

バイナリログについてちょっとだけ勉強してみた。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.2.4 バイナリログ
リンクはバージョンが5.6なのだけど、リファレンスマニュアルです。

バイナリログには、テーブル作成操作やテーブルデータへの変更などのデータベース変更を記述する「イベント」が格納されます。

ふーむ。

バイナリロギングを有効にしてサーバーを実行すると、パフォーマンスがいくらか低下します。ただし、レプリケーションをセットアップでき、リストア操作に対応できるというバイナリログの利点は、一般的にこのパフォーマンスの減少よりも重要です。

確かに、書き込みが増えるんだからパフォーマンスには影響するでしょうなぁ。
このバイナリログ、MySQL 8.0からデフォルトで出力されているらしいです。
あ、ってことは8.0以前は自分で設定変えないと出力出来なかったってことかしら。

前回書いたバックアップしたダンプデータだけではバックアップを取得した時点のデータしか戻せない。
でもこのバイナリログを利用することで戻したい時点を選んでデータを戻せるってことですかね。

で、バイナリログってどんな感じってことで触ってみることにします。

全てのバイナリログファイル名を表示してみます。

mysql> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000002 |       199 |
| binlog.000003 |      1782 |
+---------------+-----------+
2 rows in set (0.02 sec)

1番のファイルがないのは、ちょっと試しに消してみたので無くなってますw
気にしないでー。
3番のファイルがデカイっすね。テーブル作成やデータ登録したからここに詰まってるんですかね。

で、今使ってるログファイルはどれなの?を調べるのはこれかな。

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000003 |     1782 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

あ、やっぱり3番のファイルがナウなんですな。

今3番なのですが次のファイルに切り替えたいなーっていう時はこれ。

mysql> flush binary logs;
Query OK, 0 rows affected (0.06 sec)

本当に切り替わったかしら、と確認してみる。

mysql> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000002 |       199 |
| binlog.000003 |      1826 |
| binlog.000004 |       155 |
+---------------+-----------+
3 rows in set (0.02 sec)

おー。4番のファイルが出来たー。

不要なバイナリログの削除も出来ちゃう。2番消しちゃおうかな。
ちょっと注意なのは、2番を消したい場合は「3番以前のファイルをパージ」って設定するんですね。

mysql> purge master logs to 'binlog.000003';
Query OK, 0 rows affected (0.02 sec)

mysql> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000003 |      1826 |
| binlog.000004 |       155 |
+---------------+-----------+
2 rows in set (0.00 sec)

全てのバイナリログ削除も出来るんですが、今回はやんないw

reset master;

バイナリログってテーブル変更時などに記録されるんですよね。selectとかじゃ記録されないのかな?

mysql> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000003 |      1826 |
| binlog.000004 |       155 |
+---------------+-----------+
2 rows in set (0.00 sec)

mysql> select * from stray_cat_tbl;
+-----+----------+---------------+
| seq | cat_name | cat_type      |
+-----+----------+---------------+
|   1 | Black    | NULL          |
|   2 | Mike     | Tortoiseshell |
+-----+----------+---------------+
2 rows in set (0.00 sec)

mysql> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000003 |      1826 |
| binlog.000004 |       155 |
+---------------+-----------+
2 rows in set (0.00 sec)

うん、やっぱりバイナリログは動いてないなー。

で、データ登録をすると・・・。

mysql> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000003 |      1826 |
| binlog.000004 |       155 |
+---------------+-----------+
2 rows in set (0.00 sec)

mysql> INSERT INTO house_cat_tbl (cat_name, cat_type) VALUES ('Anko', 'Mix');
Query OK, 1 row affected (0.18 sec)

mysql> show master logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000003 |      1826 |
| binlog.000004 |       457 |
+---------------+-----------+
2 rows in set (0.00 sec)

おー。バイナリログが4番に書き込まれたー。

バイナリログからロールフォワード用SQL文を生成っていうのをやってみようかと。
まず実際のバイナリログってどこに保存されてるんですかね?

ほほぅ。ここのパスなのか。

mysql> show variables like 'datadir';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| datadir       | /usr/local/var/mysql/ |
+---------------+-----------------------+
1 row in set (0.02 sec)

んじゃ、本当にファイルがあるか確認。ありますねー。ちゃんとある。

ls -la /usr/local/var/mysql/
total 336000
drwxr-xr-x   28 run  admin       952 10 21 14:07 .
drwxrwxr-x    4 run  admin       136 10 16 23:47 ..
-rw-r-----    1 run  admin      2175 10 20 23:58 USERnoMacBook-Pro.local.err
-rw-r-----    1 run  admin         6 10 17 20:35 USERnoMacBook-Pro.local.pid
-rw-r-----    1 run  admin        56 10 16 23:47 auto.cnf
-rw-r-----    1 run  admin      1826 10 21 13:59 binlog.000003
-rw-r-----    1 run  admin       457 10 21 14:22 binlog.000004
-rw-r-----    1 run  admin        32 10 21 14:07 binlog.index
(略)

ロールフォワード用SQLを作ってみる。指定するバイナリログは3番にします!

mysqlbinlog --disable-log-bin --start-position=0 /usr/local/var/mysql/binlog.000003 > /Users/run/Downloads/recover.sql

cat /Users/run/Downloads/recover.sql
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!32316 SET @OLD_SQL_LOG_BIN=@@SQL_LOG_BIN, SQL_LOG_BIN=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#181017 20:47:53 server id 1  end_log_pos 124 CRC32 0xdbb81c39 	Start: binlog v 4, server v 8.0.12 created 181017 20:47:53
BINLOG '
aSHHWw8BAAAAeAAAAHwAAAAAAAQAOC4wLjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA
CgE5HLjb
'/*!*/;
# at 124
#181017 20:47:53 server id 1  end_log_pos 155 CRC32 0x3c0d7a6a 	Previous-GTIDs
# [empty]
# at 155
#181021  0:07:40 server id 1  end_log_pos 228 CRC32 0x34c60bf0 	Anonymous_GTID	last_committed=0	sequence_number=1	rbr_only=no	original_committed_timestamp=1540048060324006	immediate_commit_timestamp=1540048060324006	transaction_length=182
# original_commit_timestamp=1540048060324006 (2018-10-21 00:07:40.324006 JST)
# immediate_commit_timestamp=1540048060324006 (2018-10-21 00:07:40.324006 JST)
/*!80001 SET @@session.original_commit_timestamp=1540048060324006*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 228
#181021  0:07:40 server id 1  end_log_pos 337 CRC32 0x6b672ae7 	Query	thread_id=9	exec_time=0error_code=0	Xid = 15
SET TIMESTAMP=1540048060/*!*/;
SET @@session.pseudo_thread_id=9/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80005 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
create database miaow
/*!*/;
# at 337
#181021  0:12:52 server id 1  end_log_pos 412 CRC32 0x3a6d06c7 	Anonymous_GTID	last_committed=1	sequence_number=2	rbr_only=no	original_committed_timestamp=1540048373074347	immediate_commit_timestamp=1540048373074347	transaction_length=379
# original_commit_timestamp=1540048373074347 (2018-10-21 00:12:53.074347 JST)
# immediate_commit_timestamp=1540048373074347 (2018-10-21 00:12:53.074347 JST)
/*!80001 SET @@session.original_commit_timestamp=1540048373074347*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 412
#181021  0:12:52 server id 1  end_log_pos 716 CRC32 0x900b0bd2 	Query	thread_id=9	exec_time=1error_code=0	Xid = 23
use `miaow`/*!*/;
SET TIMESTAMP=1540048372/*!*/;
CREATE TABLE `house_cat_tbl` (
  `seq` int(10) unsigned NOT NULL auto_increment,
  `cat_name` varchar(255) NOT NULL,
  `cat_type` varchar(255) default NULL,
  PRIMARY KEY  (`seq`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!*/;
# at 716
#181021  0:12:54 server id 1  end_log_pos 791 CRC32 0xa8495111 	Anonymous_GTID	last_committed=2	sequence_number=3	rbr_only=no	original_committed_timestamp=1540048375056693	immediate_commit_timestamp=1540048375056693	transaction_length=379
# original_commit_timestamp=1540048375056693 (2018-10-21 00:12:55.056693 JST)
# immediate_commit_timestamp=1540048375056693 (2018-10-21 00:12:55.056693 JST)
/*!80001 SET @@session.original_commit_timestamp=1540048375056693*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 791
#181021  0:12:54 server id 1  end_log_pos 1095 CRC32 0x31c4cf25 	Query	thread_id=9	exec_time=1	error_code=0	Xid = 24
SET TIMESTAMP=1540048374/*!*/;
CREATE TABLE `stray_cat_tbl` (
  `seq` int(10) unsigned NOT NULL auto_increment,
  `cat_name` varchar(255) NOT NULL,
  `cat_type` varchar(255) default NULL,
  PRIMARY KEY  (`seq`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!*/;
# at 1095
#181021  0:20:11 server id 1  end_log_pos 1170 CRC32 0x42108fb4 	Anonymous_GTID	last_committed=3	sequence_number=4	rbr_only=yes	original_committed_timestamp=1540048811250826	immediate_commit_timestamp=1540048811250826	transaction_length=687
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1540048811250826 (2018-10-21 00:20:11.250826 JST)
# immediate_commit_timestamp=1540048811250826 (2018-10-21 00:20:11.250826 JST)
/*!80001 SET @@session.original_commit_timestamp=1540048811250826*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1170
#181021  0:18:53 server id 1  end_log_pos 1246 CRC32 0x27a08215 	Query	thread_id=9	exec_time=0	error_code=0
SET TIMESTAMP=1540048733/*!*/;
BEGIN
/*!*/;
# at 1246
#181021  0:18:53 server id 1  end_log_pos 1315 CRC32 0x0151adba 	Table_map: `miaow`.`house_cat_tbl` mapped to number 67
# at 1315
#181021  0:18:53 server id 1  end_log_pos 1371 CRC32 0x87f099de 	Write_rows: table id 67 flags: STMT_END_F

BINLOG '
XUfLWxMBAAAARQAAACMFAAAAAEMAAAAAAAEABW1pYW93AA1ob3VzZV9jYXRfdGJsAAMDDw8E/QL9
AgQBAYACASG6rVEB
XUfLWx4BAAAAOAAAAFsFAAAAAEMAAAAAAAEAAgAD/wABAAAABABUYW1hCABKYXBhbmVzZd6Z8Ic=
'/*!*/;
# at 1371
#181021  0:18:53 server id 1  end_log_pos 1440 CRC32 0x33a35344 	Table_map: `miaow`.`house_cat_tbl` mapped to number 67
# at 1440
#181021  0:18:53 server id 1  end_log_pos 1505 CRC32 0x8727ce76 	Write_rows: table id 67 flags: STMT_END_F

BINLOG '
XUfLWxMBAAAARQAAAKAFAAAAAEMAAAAAAAEABW1pYW93AA1ob3VzZV9jYXRfdGJsAAMDDw8E/QL9
AgQBAYACASFEU6Mz
XUfLWx4BAAAAQQAAAOEFAAAAAEMAAAAAAAEAAgAD/wACAAAAAwBab2USAEFtZXJpY2FuIFNob3J0
aGFpcnbOJ4c=
'/*!*/;
# at 1505
#181021  0:18:53 server id 1  end_log_pos 1574 CRC32 0xe64ddbc0 	Table_map: `miaow`.`stray_cat_tbl` mapped to number 68
# at 1574
#181021  0:18:53 server id 1  end_log_pos 1621 CRC32 0x06e417a5 	Write_rows: table id 68 flags: STMT_END_F

BINLOG '
XUfLWxMBAAAARQAAACYGAAAAAEQAAAAAAAEABW1pYW93AA1zdHJheV9jYXRfdGJsAAMDDw8E/QL9
AgQBAYACASHA203m
XUfLWx4BAAAALwAAAFUGAAAAAEQAAAAAAAEAAgAD/wQBAAAABQBCbGFja6UX5AY=
'/*!*/;
# at 1621
#181021  0:18:53 server id 1  end_log_pos 1690 CRC32 0x94a25b09 	Table_map: `miaow`.`stray_cat_tbl` mapped to number 68
# at 1690
#181021  0:18:53 server id 1  end_log_pos 1751 CRC32 0x5b723527 	Write_rows: table id 68 flags: STMT_END_F

BINLOG '
XUfLWxMBAAAARQAAAJoGAAAAAEQAAAAAAAEABW1pYW93AA1zdHJheV9jYXRfdGJsAAMDDw8E/QL9
AgQBAYACASEJW6KU
XUfLWx4BAAAAPQAAANcGAAAAAEQAAAAAAAEAAgAD/wACAAAABABNaWtlDQBUb3J0b2lzZXNoZWxs
JzVyWw==
'/*!*/;
# at 1751
#181021  0:20:11 server id 1  end_log_pos 1782 CRC32 0x5783d3c3 	Xid = 27
COMMIT/*!*/;
# at 1782
#181021 13:59:19 server id 1  end_log_pos 1826 CRC32 0xd8f503e3 	Rotate to binlog.000004  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!32316 SET SQL_LOG_BIN=@OLD_SQL_LOG_BIN*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

なんか凄いの出たw

次はバイナリログからデータベースを復元する!をやります。

じゃ、まずはデータベースを削除しますかー。

mysql> drop database miaow;
Query OK, 2 rows affected (0.65 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)

ほいほい、消えましたね。ばっさり。

で、コマンドを実行するわけですが・・・「mysql.sock」のありかが分からなかったんで、調べてみた。
え、こんなとこにあるの?w

mysql_config --socket
/tmp/mysql.sock

でもって、さっき作ったロールフォワード用SQLを作ってようやく実行。

mysql --user=root --password=(パスワード) --socket=/tmp/mysql.sock --default-character-set=utf8mb4 < /Users/run/Downloads/recover.sql

さて、データベースは復活したかな?

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| miaow              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

わーい!みぁおぅ!w

テーブルも確認してみます。

mysql> select * from house_cat_tbl;
+-----+----------+--------------------+
| seq | cat_name | cat_type           |
+-----+----------+--------------------+
|   1 | Tama     | Japanese           |
|   2 | Zoe      | American Shorthair |
+-----+----------+--------------------+
2 rows in set (0.00 sec)

mysql> select * from stray_cat_tbl;
+-----+----------+---------------+
| seq | cat_name | cat_type      |
+-----+----------+---------------+
|   1 | Black    | NULL          |
|   2 | Mike     | Tortoiseshell |
+-----+----------+---------------+
2 rows in set (0.00 sec)

そう、ロールフォワード用SQLを作る時、3番のログを指定しているので、以下のデータは含まれないんですよね。

mysql> INSERT INTO house_cat_tbl (cat_name, cat_type) VALUES ('Anko', 'Mix');

まー、これでなんとか指定時点のデータを戻すっていうのは検証出来たかな。
お疲れ様ー。