Share
Embed
MySQLアンカンファレンス01_mysqlredo
tom--bo
February 03, 2024
Transcript
29 slides
-
⽬次 • 背景 • 障害回復のための”ログ”についておさらい • MySQL, InnoDBにおける”ログ” • Innodb
Redoログのダンプツール紹介 • ログフォーマット • mysqlredoの実⾏例 • まとめ 2 -
背景 • Cloud NativeなDBで”Log”を活⽤するケースをよく⾒る • MySQL(Innodb)における”Log”ってどうなっているんだっけ? 左図: Amazon Aurora: Design
Considerations for High Throughput Cloud-Native Relational Databases 右図: AlloyDB for PostgreSQL under the hood: Intelligent, database-aware storage (⻩緑がlog 紫がmetadata) Amazon Aurora AlloyDB (Google) 3 -
障害回復のためのログについておさらい • 障害は⼤きく3種類 1. トランザクション障害 • コミットが完了するまでの異常(デッドロックや⾃主的なアボートなど) 2. システム障害 •
ハードウェア・ソフトウェアの何らかの理由でプロセスがダウン 3. メディア障害 • ハードディスクの故障などで記憶装置からデータが読めなくなる 4 -
障害回復のためのログについておさらい • 障害回復は⼤きく3種類 1. トランザクション障害 • コミットが完了するまでの異常(デッドロックや⾃主的なアボートなど) 2. システム障害 •
ハードウェア・ソフトウェアの何らかの理由でプロセスがダウン 3. メディア障害 • ハードディスクの故障などで記憶装置からデータが読めなくなる トランザクションによる更新のログ(or ジャーナル) を残すことで対応 5 -
Write Ahead Logging(WAL) • トランザクションの更新前後のデータ(before/after image)を ログとして出⼒する • データファイルにフラッシュする前にログを書く •
Commit処理の完了の前にログを書く Write Ahead Logging 8 -
MySQLにおける”ログ”はInnoDBの”ログ” • 8.0以降システムテーブル(ibdata1), データディクショナリ (mysql.ibd, 以降DD)がInnoDBで管理されている • https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-transactional- storage.html •
https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html • MySQLのシステムデータ(メタデータ)とInnoDBで作成される テーブルはInnoDBのログで障害回復できる • Original MySQLではInnoDB以外のSEはトランザクショナルではない • (MySQL ClusterのNDB SEは未調査) 12 -
MySQLにおける”ログ”はInnoDBの”ログ” • Innodb Redoログ • InnoDBのテーブルはこのredoログだけで障害回復できる • InnoDB Undoログ •
実態はUndoテーブルスペース • “An undo log is a collection of undo log records associated with a single read-write transaction. An undo log record contains information about how to undo the latest change by a transaction to a clustered index record” https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-logs.html 13 -
あれ?Binary log(binlog)は? • レプリケーションと障害復旧のためのログだが、これは⼀貫性のあ るバックアップからの増分適⽤による復旧⽤ • https://dev.mysql.com/doc/refman/8.0/en/binary-log.html • https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery-binlog.html •
内部的にはトランザクションコーディネータがBinlogとInnoDB redo logの2PCを⾏っている • これについては次回以降、解説するかも 15 -
mysqlredoコマンド • ビルド⽅法 • mkdir bld; cd bld • cmake
... (options) • make mysqlredo … (options) • コマンド説明 • mysqlredo –start-lsn=xxx —stop-lsn=yyy filename • 引数に読みたいredologファイルを指定 • 開始/終了 LSNを—star-lsn, --stop-lsnで指定可能 • -v でverbose output 18 -
データブロック(通常ブロック) • m_hdr_no(4): ブロック番号(lsnから計算) • m_data_len(2): データ⻑(ヘッダを含むデータの終端位置) • m_first_rec_group(2): MTRの開始オフセット
(0ならこのブロックで開始したMTRはない) • m_epoch_no(4): ブロック番号(lsnから計算) m_hdr_noの計算 m_epoch_noの計算 24 -
ログレコード • レコードヘッダ • type(1): レコードタイプ • space_id(1~6): スペースID •
page_no(1~6): ページ番号 • Payload: typeごとに固有の形式 (図WIP) 25 -
気になっていること • 各log typeの中⾝ • Undoテーブルスペースの仕組み • 他のDBのredo, undoログ •
MariaDBだとInnoDB Redoログを削減する改良をしているらしい • Redoログの並列化や並列リカバリ技法 29