もくじ
前提条件
関連
- AWS RDS PITR+ロールフォワードによるリカバリ 【下準備編】
- AWS RDS PITR+ロールフォワードによるリカバリ 【汎用 RDSのディスク障害からの復旧】
- AWS RDS PITR+ロールフォワードによるリカバリ 【誤ったクエリ発行からの復旧】
メンテナンスモード
書き込みが発生するEC2サーバを全台停止させます!
PITR(特定時点による復元)を行います
2021年11月15日11時35分00秒で復元しました。
クライアント EC2側作業
S3に退避しているbinlogをダウンロードする
$ cd /ManageBinlog/ $ sh ./downloadBinlogFromS3.sh
binlogを確認する
# ls -laht /ManageBinlog/download total 40K drwxrwxrwx 2 root root 4.0K Nov 12 04:55 . -rw-r----- 1 root root 511 Nov 12 04:55 mysql-bin-changelog.001150 ・・・ -rw-r----- 1 root root 511 Nov 12 04:55 mysql-bin-changelog.001107 -rw-r----- 1 root root 2.0K Nov 12 04:53 mysql-bin-changelog.001106 -rw-r--r-- 1 root root 679 Nov 12 04:47 mysql-bin-changelog.001105
# mysqlbinlog --base64-output=DECODE-ROWS -vv mysql-bin-changelog.001106 BEGIN /*!*/; # at 295 #211115 11:31:43 server id 312454088 end_log_pos 480 CRC32 0x205c6269 Query thread_id=4 exec_time=0 error_code=0 SET TIMESTAMP=1636943503/*!*/; INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1636943503261) ON DUPLICATE KEY UPDATE value = 1636943503261 /*!*/; # at 480 #211115 11:31:43 server id 312454088 end_log_pos 511 CRC32 0x20684def Xid = 9537 COMMIT/*!*/; # at 511 #211115 11:35:00 server id 312454088 end_log_pos 568 CRC32 0xf17bbd59 Rotate to mysql-bin-changelog.001107 pos: 4 SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
# mysqlbinlog --base64-output=DECODE-ROWS -vv mysql-bin-changelog.001107 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #211115 11:35:00 server id 312454088 end_log_pos 123 CRC32 0x26386e0a Start: binlog v 4, server v 5.7.33-log created 211115 11:35:00 # at 123 #211115 11:35:00 server id 312454088 end_log_pos 154 CRC32 0xeaaf167b Previous-GTIDs # [empty] # at 154 #211115 11:36:58 server id 312454088 end_log_pos 219 CRC32 0xef812253 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 219 #211115 11:36:58 server id 312454088 end_log_pos 295 CRC32 0x4d94bf7b Query thread_id=4 exec_time=0 error_code=0 SET TIMESTAMP=1636943818/*!*/; SET @@session.pseudo_thread_id=4/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1075838976/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8mb4 *//*!*/; SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=8/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 295 #211115 11:36:58 server id 312454088 end_log_pos 480 CRC32 0x194ea58a Query thread_id=4 exec_time=0 error_code=0 SET TIMESTAMP=1636943818/*!*/; INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1636943818262) ON DUPLICATE KEY UPDATE value = 1636943818262 /*!*/; # at 480 #211115 11:36:58 server id 312454088 end_log_pos 511 CRC32 0x0f5284b5 Xid = 9765 COMMIT/*!*/; # at 511 #211115 11:40:00 server id 312454088 end_log_pos 568 CRC32 0x4afbe7a4 Rotate to mysql-bin-changelog.001108 pos: 4 SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysql-bin-changelog.001107のat154から最新のバイナリファイルまでのファイルを入れ込めばリストアできることがわかりました。
リストア
復旧クエリの作成
$ mysqlbinlog --skip-gtids -vv --base64-output=DECODE-ROWS \ --start-position=812 --stop-datetime='2021-11-15 16:50:00' \ mysql-bin-changelog.001107 \ mysql-bin-changelog.001108 \ mysql-bin-changelog.001109 \ (略) mysql-bin-changelog.001150 > /tmp/recovery.sql
整形
$ sed -i -e '/DEFINER/d' /tmp/recovery.sql $ sed -i -e '/session.pseudo_thread_id/d' /tmp/recovery.sql $ sed -i -e '/PSEUDO/d' /tmp/recovery.sql $ sed -i -e '/GTID/d' /tmp/recovery.sql
リストアに不必要な記述を削ぎ落とします
リストア
$ mysql -u admin -h {リカバリ用新RDSホスト名} -p < /tmp/recovery.sql
必ずリカバリ用の新RDSに対してロールフォワードを行なってください。
EC2との連携
EC2の.envを新RDSに連携させます。
動作確認
アプリサーバを起動し、新しいRDSに書き込みができることを確認してください。