web-dev-qa-db-ja.com

InnoDB:テーブルの.frmファイルが存在するが、InnoDBの内部データディクショナリからテーブルを開くことができない

XAMPPを使用してWindows 10を実行しており、数十のDrupalサイトがローカルホストにインストールされています。すべてが数か月間正常に動作しています。

今朝、私は2日前の復元ポイントからWindows復元を実行して、不要なWindows更新プログラムを削除しました。それを行った後、MySQLが機能しなくなりました。ファイルibdata1を削除しようとしましたが(これは悪い考えだったことがわかりました)、状況が悪化すると、削除した最初のibdata1を復元しました。すべてのテーブルデータ(.frmおよび.ibdファイル)は、まだC:\xampp\mysql\dataにあります。これで、MySQLは少なくとも起動しますが、すべてのテーブルが「なくなっています」... phpMyAdminをブラウザーにロードできます。左側のデータベースをドロップダウンすると、すべてのテーブルが表示されます...しかし、クリックしようとすると1つは、「テーブルが見つかりません」と表示されます。

mysql_error.logには、InnoDB: Cannot open table mysql/slave_master_info from the internal data dictionary of InnoDB though the .frm file for the table exists.のようないくつかのエラーがあります。エラーメッセージに記載されているURLに、この問題の解決方法が記載されていると思われますが、情報はありません。

私はしませんthinkibdata1は破損しています...そして、データのリカバリに関するすべての記事はめちゃくちゃ問題に比例していません。誰もが簡単な綴りのソリューションを持っています。私はググリングが間違っていますか?これは少なくとも2回前に私に起こりました、そして、私がオンラインで見つけた10時間にわたる手順に従うことを始めることができる前に、問題は自然に自然に解決しました。今回は残念ながらありません。確かに私は単純なものを逃しています。数十のデータベースに何百ものテーブルがあり、それぞれのスキーマを見つけて手動でプラグインするのはどうしようもないようです。これは、ほとんどの復旧記事が示唆しているようです。

データベースは.frmファイルと.ibdファイルの読み取り方法を知っているだけではいけません。それはfeelsどこかに場違いな値が1つしかないようなもので、もしそれを見つけることができれば、すべてが "ポップ"して元の場所に戻るだけです。

7
John Alexander

私の場合、Percona_XtraDB_Clusterのバックアップ(galera-arbitratorとxtrabackupによって実行されます。最初のスナップショットを使用して状態スナップショットを取得し、最後のバックアップを使用して物理データをバックアップしました)を復元していました。したがって、バックアップしたデータをdir /var/lib/mysql新しいmysqlサーバーの場合、次のselectクエリを実行してエラーが発生しました。

$ mysql -uroot -p$MYSQL_ROOT_PASSWORD -h<NEW_SERVER_Host_NAME> -e 'show columns from <MY_DB>.<MY_TABLE>'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1146 (42S02) at line 1: Table 'playground.equipment' doesn't exist

そしてサーバーログは:

[Warning] InnoDB: Cannot open table <MY_DB>/<MY_TABLE> from the internal data dictionary of InnoDB though the .frm file for the table exists. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.

コンテナを新しいデータで再起動しました。それでおしまい

1
Shudipta Sharma

私のために働いたもの:

https://dba.stackexchange.com/a/42932

私のdbsはInnoDBだったので、idに問題があり、macosをアップグレードすると、これが表示されました。主な部分を引用します:

絶対必要です:

-ibdata1

-ib_logfile0

-ib_logfile1

-mysql_databaseフォルダーの.FRMファイル

-MAMP/MAMP Proのフレッシュインストール(破棄する必要がある場合)

  1. WebサーバーにSSHで接続し(dev、製品版、違いなし)、mysqlフォルダーを参照します(LinuxでのPleskインストールの場合、私のフォルダーは/ var/lib/mysqlでした)
  2. Mysqlフォルダーを圧縮する
  3. MyISAMでもinnoDBでも、すべてのmySQLデータベースを含むmysqlフォルダーのアーカイブをダウンロードします(このファイルをscpするか、必要に応じてダウンロード可能なディレクトリに移動できます)。
  4. MAMPをインストールする(Mac、Apache、MySQL、PHP)
  5. / Applications/MAMP/db/mysql /に移動します
  6. / Applications/MAMP/db/mysqlをZipアーカイブにバックアップします(念のため)。
  7. Mysqlフォルダーのアーカイブに含まれるすべてのフォルダーとファイルを本番サーバー(私の場合はPlesk環境)からコピーします。上書きしないでください。

    -/アプリケーション/ MAMP/db/mysql/mysql /

    -/アプリケーション/ MAMP/db/mysql/mysql_upgrade_info

    -/アプリケーション/ MAMP/db/mysql/performance_schema

1
Ratata Tata

私たちの仕事はこれでした link (孤立したファイルごとのibdファイルの復元)。

簡単に言うと、次のことを行います。

ALTER TABLE ..... DISCARD TABLESPACE;

影響を受ける各テーブル。次に、影響を受ける各テーブルについて:

ALTER TABLE .... IMPORT TABLESPACE; SHOW WARNINGS; 

同じスキーマでそれを行うか、他のデータベースに新しいスキーマを作成して、すべての* .ibdファイルをコピーできます。この場合:

  • テーブル定義を使用して新しいスキーマを作成します。
  • すべてのテーブルのテーブルスペースを破棄します。
  • 新しい* .ibdファイルを新しいスキーマの正しいフォルダーにコピーします。
  • すべてのテーブルのテーブルスペースをインポートしないでください。

重要です!新しいスキーマは古いスキーマと同じ名前にするのが良いでしょう。

0
Paco Lora

Slave_master_info.frmの名前をslave_master_info.BAKに変更するだけです。 mysqlサービスを再起動します。

0
Nime Cloud