前提・実現したいこと
teratailユーザーの皆様にはお世話になっております。
現在私が運用保守を担当しているシステムにて、数週間前より、早朝のバッチが実行される度に、MySQLからInnoDB: ERROR: the age of the last checkpoint is
のエラーが出続けている状態のため、これを解消したいです。
現在担当しているメンバー全員で対応するも解決策が全く出ない状態のため、こちらでも質問させて頂きました。
発生している問題・エラーメッセージ
InnoDB: ERROR: the age of the last checkpoint is 966364022, InnoDB: which exceeds the log group capacity 966363956. InnoDB: If you are using big BLOB or TEXT rows, you must set the InnoDB: combined size of log files at least 10 times bigger than the InnoDB: largest such row.
当エラーが出る処理は、text型を含むテーブル相手に100万回以上のREPLACE文が走る処理です。
そもそもの作りが良くない気はしますが。。。
試したこと
http://interu.hatenablog.com/entry/20100907/1283786596
こちらによると、エラーの原因に、text型のカラムが関係していそうだったため、以下の対応を行いました。
- 対象と思われるテーブルに
ALTER TABLE MODIFY
を実行し、text型のカラムを、varchar型に変更
=> ログを元に、エラー発生時間に書き込みが行われているテーブルにtext型のカラムが存在していました。
そのカラムは、text型である理由が無いためvarchar型に変更しました。
なお、innodb_log_file_size
の値の変更は 行っていません。
一年ほど前に一度変更(256M→512M)してしばらく出なくなったそうですが、一年経った今また出てきたため、今後データが加速度的に増え続けることを考えるとキリが無く、エラー内容的に「まずBLOB型関連を疑って」「いろいろやってダメなら最終手段として変更」しよう、というPMO判断によるものです。
それ以外に方法が無い、というのであれば、大人しくinnodb_log_file_size
の値を上げることを提案しようと思います。。
補足情報(FW/ツールのバージョンなど)
my.cnfの設定のうち、関連しているだろう、と思われるものを記載致します。
param | value |
---|---|
innodb_buffer_pool_sixe | 4096M |
innodb_additional_mem_pool_size | 20M |
innodb_log_buffer_size | 16M |
innodb_log_file_size | 512M |
innodb_log_files_in_group | 2 |
その他の情報
param | value |
---|---|
MySQLバージョン | 5.1 |
MySQLサーバーメモリ | 6G |
処理に使用している言語 | Perl |
- 対象のテーブルには、レコードが100万件以上入っています。そこに対して100万回以上のREPLACE文が走ります。
- トランザクション制御は 一切行われていません。 (それもそれでどうなんだろう、とは思うのですが)
- エラーハンドリングもあまりされていない処理なので、このエラーが出ていつつもガン無視して バッチ自体はちゃんと動いています。 (データが欠落した形跡も無さそうです)
その他気になっていること
直接関係しているのか、調べてもよく分からないでいるのですが、これはこれで気になっていることも参考として記載しておきます。
SHOW ENGINE INNODB STATUS
の結果を見ると、TRANSACTION 0 117359796, not started,
という内容がたくさん出ており、 トランザクションがロックを取得したままになっている? というのが確認出来ています。
=> ただし先述の通り、プログラム上でのトランザクション制御は行っていないはずなので、何だこれは。。?というのが正直なところです。
- 「
Log sequence number
がLast checkpoint at
より先行しているのでは?」というPMOの指摘があり確認してみましたが、特にそうで無いようなので、恐らくログファイルは全て書き込み出来ているものと思われます。
--- LOG --- Log sequence number 149 2813945280 Log flushed up to 149 2813945280 Last checkpoint at 149 2813945280 0 pending log writes, 0 pending chkp writes 4234543 log i/o's done, 0.00 log i/o's/second
Free buffers
の値がえらく低いので、バッファはもしかしたら足りてないのでしょうか。
---------------------- BUFFER POOL AND MEMORY ---------------------- Total memory allocated 4764871170; in additional pool allocated 20963072 Dictionary memory allocated 2090384 Buffer pool size 262144 Free buffers 20 Database pages 255180 Modified db pages 0 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages read 22071024, created 2663468, written 15337711 0.00 reads/s, 0.00 creates/s, 0.00 writes/s Buffer pool hit rate 1000 / 1000
- 同一サーバー上に別スキーマで別システムのDBも共存 しており、全体のデータ容量はかなり多いです。
ただし、エラー発生時刻に、別システムのバッチは動いていないはずなので、影響は無いものと思われます。
以上、かなり記述内容が多くなってしまいましたが、何卒お力添え頂けますと幸いです。
MySQLの設定周りはまだ知識が浅いため、他に必要な情報がありましたらご指摘ください。
よろしくお願い致します。
補足
上述していますが、ログファイルのサイズ設定が小さい、で終了なのでしょうか。
BLOB型云々は関係無く、やはりそこに行きつくのでしょうか。
ログファイルのサイズを変更すると、今後データ量が増えるたびにその値も増やさなければいけないのか。。という話になっているので、それを把握しておきたいです。
それともそういうものなのでしょうか。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/12 08:11
2018/03/12 14:22 編集