web-dev-qa-db-ja.com

InnoDBエラーとMyISAMデータベースでのクラッシュ?

MyISAMテーブルのみを含む1つのmysqlデータベースを備えた1台のサーバーがあります。サーバーには他のデータベースはありません(もちろんシステムデータベースを除きます)。 mysql 5.7.27に移動したため、InnoDB関連のエラーが発生し、さらにはクラッシュします。ほとんどの構成は、Ubuntu 18.04パッケージに付属しているデフォルトの構成です。myisamバッファーとキャッシュを調整しただけです。 (今、私はinnodbプールサイズも増やしました、それがそれらのエラーがなくなることを願っています)

これらのエラーの原因は何ですか?それらを取り除く方法は?

エラーの例:

2019-09-19T04:39:34.464347Z 5169718 [警告] InnoDB:バッファプールで空きブロックを見つけるのは困難です(21回の検索の反復)!ページのフラッシュに21回失敗しました!バッファー・プールのサイズを増やすことを検討してください。 Unixバージョンでは、fsyncが非常に遅いか、OSカーネル内で完全にフリーズしている可能性もあります。次に、オペレーティングシステムの新しいバージョンにアップグレードすると役立つ場合があります。以下の診断情報でfsyncの数を確認してください。保留中のフラッシュ(fsync)ログ:0;バッファープール:0。22967494OSファイルの読み取り、55308825 OSファイルの書き込み、1252 OS fsync。 InnoDBモニターを起動して、さらなる診断を標準出力に出力します。

2019-09-20T08:27:30.209263Z 0 [エラー] [致命的] InnoDB:ページ[ページID:スペース= 45、ページ番号= 4551]まだ修正またはダーティ

2019-09-20 10:27:30 0x7f9350594740 InnoDB:ファイルut0ut.cc行910のスレッド140270684948288のアサーションエラー

Innodbテーブル:

+--------------------+---------------------------+
| table_schema       | table_name                |
+--------------------+---------------------------+
| information_schema | COLUMNS                   |
| information_schema | EVENTS                    |
| information_schema | OPTIMIZER_TRACE           |
| information_schema | PARAMETERS                |
| information_schema | PARTITIONS                |
| information_schema | PLUGINS                   |
| information_schema | PROCESSLIST               |
| information_schema | ROUTINES                  |
| information_schema | TRIGGERS                  |
| information_schema | VIEWS                     |
| mysql              | engine_cost               |
| mysql              | gtid_executed             |
| mysql              | help_category             |
| mysql              | help_keyword              |
| mysql              | help_relation             |
| mysql              | help_topic                |
| mysql              | innodb_index_stats        |
| mysql              | innodb_table_stats        |
| mysql              | plugin                    |
| mysql              | server_cost               |
| mysql              | servers                   |
| mysql              | slave_master_info         |
| mysql              | slave_relay_log_info      |
| mysql              | slave_worker_info         |
| mysql              | time_zone                 |
| mysql              | time_zone_leap_second     |
| mysql              | time_zone_name            |
| mysql              | time_zone_transition      |
| mysql              | time_zone_transition_type |
| sys                | sys_config                |
+--------------------+---------------------------+

バージョン

mysql> show global variables like '%version%';
+-------------------------+-------------------------+
| Variable_name           | Value                   |
+-------------------------+-------------------------+
| innodb_version          | 5.7.27                  |
| protocol_version        | 10                      |
| slave_type_conversions  |                         |
| tls_version             | TLSv1,TLSv1.1           |
| version                 | 5.7.27-0ubuntu0.18.04.1 |
| version_comment         | (Ubuntu)                |
| version_compile_machine | x86_64                  |
| version_compile_os      | Linux                   |
+-------------------------+-------------------------+
2
st.

あなたに迷惑なニュースがあります。 MySQL 5.7ではInnoDBが永続的に有効になっています。ドキュメントにあります

重要

InnoDBを無効にすることはできません。 --skip-innodbオプションは非推奨であり、効果はなく、使用すると警告が表示されます。今後のMySQLリリースで削除される予定です。これは同義語にも適用されます(--innodb = OFF、-disable-innodbなど)。

InnoDBテーブルの数はバージョンごとに増加しています。

私はこれを述べましたApr 04, 2018以前の投稿 XtraBackupをMySQL 5.6からMySQL 5.7に復元

MySQLスキーマファイル

MySQLスキーマのInnoDBテーブルの数もメジャーリリース間で変化します。

2017年12月9日に戻って、私は答えました エラー1031(HY000): 'proc'のテーブルストレージエンジンにはこのオプションがありません とInnoDBテーブルがMySQLスキーマで使用され始めたときに議論されました。

MySQL 5.6では、5つのテーブルでした。 MySQL 5.7では、19になりました。MySQL8.0では、31のテーブルすべてがInnoDBです。

以前の投稿から、MySQL 5.7にはmysqlスキーマに19のInnoDBテーブルがあると述べました。

InnoDBを適切に狩るために、これを実行します

SELECT table_schema,table_name
FROM information_schema.tables
WHERE engine='InnoDB';

mysqlスキーマの19個のテーブルが表示されます。追加のInnoDBテーブルがある場合は、それらのテーブルを削除するか再構築する必要があります。このクエリで19個のテーブルが表示されない場合は、これを修正する必要があります

私はあなたがあなたの質問で言ったことに気づきました:Since it moved to mysql 5.7.27 there are InnoDB related errors and even crashes

システムテーブルを正しくアップグレードしなかった場合、mysqldはおそらくmysqlスキーマテーブルをInnoDBとして探しています。

MySQL 5.7 Docs on mysql_upgrade を読み、 -upgrade-system-tables を確認してください。 mysqlスキーマテーブルをMyISAMからInnoDBに変換する必要があります。

まずは事前にテスト環境で行ってください。

2019-09-20 18:09 EDTを更新

Niceチャットセッションの後、多くの一時テーブルが生成されていることがわかりました。すべての一時テーブルはInnoDBを使用しており、InnoDBバッファープールの482MBを消費していました。 InnoDBバッファープールはデフォルト(128M)でした。 512Mを超えると解決しました。

また、すべてをInnoDBに切り替えることをお勧めします。

2
RolandoMySQLDBA

MyISAMからInnoDBに切り替えます。これは、変換の違いと落とし穴をカバーします: http://mysql.rjweb.org/doc.php/myisam2innodb

設定については http://mysql.rjweb.org/doc.php/memory を参照してください。以下に要約します。

64 GBのRAMこれは主にMySQLで使用されている場合)、これらは最適に近い可能性があります。

  • MyISAMからInnoDBへの移行中:

    key_buffer_size = 6G
    innodb_buffer_pool_size = 20G
    
  • InnoDBへの変換後:

    key_buffer_size = 40M
    innodb_buffer_pool_size = 45G
    
0
Rick James