web-dev-qa-db-ja.com

クエリの実行ごとにInnoDb内部エラーを取得する

各クエリの実行時にerror.logに次のエラーが発生したため、error.logを適切に使用できません。

2016-05-30 09:39:58 7f7c7e3cb700 InnoDB: Error: Column last_update in table "mysql"."innodb_table_stats" is INT UNSIGNED NOT NULL but should be BINARY(4) NOT NULL (type mismatch).
2016-05-30 09:39:58 7f7c7e3cb700 InnoDB: Error: Fetch of persistent statistics requested for table "mysql"."innodb_table_stats" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.

"mysql"。 "innodb_table_stats"およびmysql.innodb_index_statsテーブルが存在することを確認しましたが、これらのエラーが引き続き発生します。

両方のテーブルの構造を以下に示します。

CREATE TABLE `innodb_index_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `index_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `stat_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `stat_value` bigint(20) UNSIGNED NOT NULL,
  `sample_size` bigint(20) UNSIGNED DEFAULT NULL,
  `stat_description` varchar(1024) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `innodb_table_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `n_rows` bigint(20) UNSIGNED NOT NULL,
  `clustered_index_size` bigint(20) UNSIGNED NOT NULL,
  `sum_of_other_index_sizes` bigint(20) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

MySqlサーバーの詳細:サーバーの種類:MySQLサーバーのバージョン:5.6.19-1〜dotdeb.1-(Debian)

同じことについて詳細を追加したいのですが、数週間前にMysqlのデフォルトの場所に関するいくつかの問題に直面していました。 Mysqlの場所を次の手順で変更しました。

  1. Mysqlをシャットダウンする
  2. 古いフォルダー内のすべてのMysqlファイルを新しいフォルダーに移動する
  3. 設定ファイルmy.cnf内のdatadir変数を変更します
  4. MySqlサーバーを再起動します。
5
Jatin Seth

この問題は、以前のバージョンからのアップグレード中に発生した、データベース変換手順のバグが原因と考えられる「タイムスタンプ」フィールドの内部表現に関連しています。

データベース「mysql」をエクスポートおよびインポートすると、私のdebianサーバーの問題が修正されました。

万一に備えて、修復手順中は、Apacheおよびデータベースを利用するその他のソフトウェアを停止することをお勧めします。

データベースをエクスポートします。

mysqldump --events --quick --single-transaction mysql > mysql-dump.sql

エクスポート直後にインポートし直します。

mysql mysql < mysql-dump.sql

重要:権限をリロードするには、この時点でmysqlサービスを再起動する必要があります。

service mysql restart

もちろん、影響を受ける可能性があるため、すべてのデータベースを修復することをお勧めします。手動で1つずつ、または簡単なスクリプトで一度に実行できます。

mysqldump="mysqldump --events --quick --single-transaction"
exclude="information_schema|performance_schema"

cd /tmp

# Backup and re-import each database on the system
for db in $(mysql -e "show databases;" -s --skip-column-names | grep -vE "($exclude)")
do
        echo "Repairing database $db"
        $mysqldump $db > $db.sql
        mysql $db < $db.sql
done
6
Demis Palma ツ