近代の世界では、会社が特定のデータベースサーバープラットフォームに依存しているのではなく、适切なワークロードとクライアントの要求に応じて十分な機能と高い性能を提供する多くのデータベースプラットフォームが利用可能です。MySQLは、多くの機能と高い性能を提供するデータベースプラットフォームの1つであり、
他のRDBMSと同様に、MySQLはデータベースやテーブルの破損に弱いです。マイクロソフトやCrowdStrikeによる最近のアウトレイクはMySQLデータベースサーバーにも影響を与えました。オペレーティングシステムの失敗によって、データベースのテーブルやデータベース全体が破損してしまいます。
この記事では、私がどのようにしてMySQLデータベースのテーブルを破損し、修復するかを説明します。この記事は、DBAsにとって、破損をシミュレートするのを役立つし、破損したMySQLテーブルを復旧または修復する最善の方法を決定するのを助けます。
MySQLデータベースの破損について理解する
MySQLデータベースの破損は、いくつかの方法で現れることがあります。
アクセス不可のテーブル
テーブルのすべてまたは特定のサブセットがアクセスできなくなり、破損したテーブルにアクセスしようとすると、インデックスファイルやデータファイルの破損を指すエラーに遭遇します。
データの不具合エラー
テーブルが破損している場合、意味のあるデータではなく、クエリーは無意味な値、不一致または不完全な結果を返すかもしれません。
予想外のシャットダウン
いくつかの場合、MySQLはテーブルにアクセスしたり、`mysqldump`を使用してバックアップを実行したりしている間にクラッシュするかもしれません。私は破損シナリオをシミュレートしている际にこのエラーを経験しました。テーブルのデータファイルを破損させました。サービスを起動した後、SELECT
ステートメントを使用してテーブルにアクセスしようとしたとき、MySQLサービスは自動的にクラッシュしました。
データベース操作中のエラーメッセージ
破損したテーブルにアクセスする際に、以下のようなエラーに直面するかもしれません。
ERROR 1016: Can't open file: 'table_name.MYI' (errno: 145)
Table ‘table_name’ is marked as crashed and should be repaired
Got error 28 from storage engine
ERROR 1030: Got error 127 from storage engine
これらのエラーは、データファイルまたは関連の索引ファイルが破損していることを示します。
破損の原因を理解することは、将来の発生を防ぐためと、データの整性を保証するために非常に重要です。
MySQLテーブルの修復の前提条件
修復を試みる前に、以下のようなものを確保してください。
- MySQLデータベースの完全なバックアップ
- 十分なディスクスペース
- MySQLサーバーへの管理者アクセス
今、テーブル破損をシミュレートしましょう。
MySQLテーブルの破損
私たちは、データベースの修復プロセスを学ぶ前に、データベースを破壊する方法を理解する必要があります。デモのために、私はMySQLデータベースサーバー上に「CorruptDB」という名前のデータベースを作成しました。また、CorruptDBデータベースにcorrupt_table
という名前のテーブルも作成しました。
以下のコードは、データベースとテーブルを作成するためのものです。
Create database corruptDB;
Use corruptdb;
CREATE TABLE corrupt_table (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100)
) ENGINE=MyISAM;
私は、以下のクエリを実行して、corrupt_table
テーブルに100万のレコードを追加しました。
INSERT INTO corrupt_table (data)
SELECT CONCAT('RandomData-', FLOOR(1000 + (RAND() * 9000)))
FROM corrupt_table;
注意:テーブルの破壊のシミュレーションは、私のノートPCで行われています。生产、開発、またはどのような環境でこれを試すべきではありません。このデモで使用しているテーブルは、MyISAMデータベースエンジンで作成されています。アルテンライトストORAGE ENGINESを読むことで、MySQL Serverのデータベースエンジンについてより詳細に了解することができます。
以下の手順でテーブルを破壊しました。
手順1: MySQLサービスの停止
MySQLサービスを停止する必要があります。これを行うために、管理者権限でPowerShellを実行し、以下のコマンドを実行します。
net stop MySQL
また、サービスから停止することもできます。
手順2: テーブルの索引ファイルの破壊
今は、corrupt_table
テーブルの索引ファイルを破壊する必要があります。MyISAMデータベースエンジンを使用してテーブルを作成すると、作成時に3つのファイルが作成されます。
- MYDファイル: このファイルには実際のデータが含まれています。
- MYIファイル: これは索引ファイルです。
- Frm ファイル: このファイルにはテーブル構造が含まれています。
私たちは索引ファイルを破壊します。データファイルはデフォルトの場所にあり、それは「C:\ProgramData\MySQL\MySQL Server 8.0\Data\corruptdb。」です。破壊のためには、16進编辑器を使用しています。
16進编辑器をダウンロードしてインストールします。そして、それを使ってMYIファイルを開きます。このファイルは以下の画像のようになります。
最初の5Byteをランダムな値に変更してください。ファイルを保存して编辑器を閉じてください。
次に、サービスを起動してテーブルにアクセスしようとします。
手順3: MySQLサービスを起動し、テーブルにアクセスする
まず、PowerShellで以下のコマンドを実行してMySQLサービスを起動してください。
net start MySQL
サービスが起動した後、MySQLコマンドラインで以下のクエリを実行してください。
mysql> use corruptdb;
Database changed
mysql> select count(1) from corrupt_table;
クエリは以下のエラーを返しました。
このエラーは、corrupt_table
の索引が破壊されており、修復する必要があることを示しています。
MySQLテーブルの修復に使用できる手動方法
破損したMySQLテーブルを修復するために特定の方法があります。最初の方法は、CHECK TABLE
とREPAIR TABLE
コマンドを使用することです。
CHECK TABLEとREPAIR TABLEコマンド
MySQLの内部コマンドCHECK TABLE
とREPAIR TABLE
を使用してテーブルを復元することができます。これらのコマンドは、MyISAMテーブルの診断と修復を行います。
テーブルの整合性を確認する`CHECK TABLE`コマンドは、テーブルの構造、インデックス、およびデータに対して損傷を確認し、詳細を表示します。以下はそのスyntaxです。
CHECK TABLE [option]
さまざまなオプションを指定することができます。
QUICK
: このオプションは、損傷したインデックスなどの問題を迅速に確認して特定します。FAST
: これは、正しく閉じられていないテーブルを確認します。CHANGED
: このオプションは、最後のCHECK TABLE
実行後に変更されたテーブルだけを確認します。MEDIUM
: このオプションは、レコードを確認し、テーブルとデータ間のリンクが正しいか確認します。EXTENDED
: このオプションは、テーブル構造と内容を彻底的にスキャンして確認します。
ここでは、デモとしてクイックスキャンを行います。以下はコマンドです。
CHECK TABLE corrupt_table
スクリーンショット:
上のスクリーンショットで、corrupt_table
のインデックスが損傷しており、修復する必要があることを指し示しています。
私たちは、REPAIR TABLE
コマンドを使用して、テーブル内の損傷を修復します。REPAIR TABLE
コマンドは、特にMyISAMデータベースエンジンを使用しているテーブルのテーブル構造とデータを損傷から回復するために使用されます。インデックスが損傷している場合、REPAIR TABLE
コマンドはインデックスを再構築します。
以下はREPAIR TABLE
のスyntaxです。
REPAIR TABLE [option]
以下のオプションを指定することができます。
QUICK
: これは、テーブルのインデックスファイルにだけ修復します。テーブルのデータファイルにはアクセスしません。拡張
: このオプションを使用すると、コマンドは彻底的な修復を行います。これはテーブルのすべてのレコードをスキャンして、インデックスファイルを修復または再作成するために使用されます。
このデモでは、テーブルのインデックスを壊れているため、快速
オプションを使用します。以下のコマンドを実行してください。
REPAIR TABLE corrupt_table
スクリーンショット:
上のスクリーンショットで、corrupt_table
が正常に修復されたことがわかります。確認するため、MySQL Workbenchで以下のクエリを実行してください。
use corruptdb;
select count(1) from corrupt_table;
クエリの出力:
上のように、テーブルは今アクセス可能です。
mysqldumpコマンドを使用してテーブルの復元
第二种の方法は、バックアップから整个のテーブルを復元することです。この方法は、REPAIR TABLE
コマンドを使用して修復できない、高度に壊れたテーブルに適用できます。
MySQLテーブルをバックアップから復元するには、mysqldump
コマンドを使用できます。mysqldump — データベースバックアッププログラムの記事を読むことで、mysqldumpコマンドの使用方法を学ぶことができます。テーブルを復元するスyntaxは以下の通りです。
mysql -u [username] -p [database_name] < [table_dump.sql]
スyntaxで:
Username
: MySQLデータベースに接続する際に使用するユーザー名を入力してください。-p
: パスワードを指定します。空にしておくと、MySQLはパスワードを求めることになります。[database_name]
: 復元しようとしているデータベースの名前を指定してください。Table_dump.sql
: バックアップファイルの完全修飾名を指定します。
デモのために、私はCorruptDBデータベースをC:\MySQLData\Backupディレクトリにある場所からバックアップを取りました。
corrupt_table
を復元するために、以下のコマンドを使用できます。
mysql -u root -p corruptdb < C:\MySQLData\Backup\corrupt_table.sql
コマンドが成功して実行されると、テーブルにアクセスすることができます。以下のクエリを実行して確認してください。
use corruptdb;
select count(1) from corrupt_table;
クエリの出力:
上のスクリーンショットで、テーブルの復元が成功したことがわかります。
phpMyAdminを使用する
phpMyAdminツールを使用して、壊れたMySQLデータベースを修復することもできます。phpMyAdminは、MySQLおよびMariaDBを管理したり保守したりする图形ユーザーインターフェースです。デモのために、私はラップトップにそれをインストールしました。
- テーブルを修復するには、phpMyAdminを起動し、壊れたテーブルが存在するデータベースに移動します。
- 右側のパネルで、CorruptDBデータベースで作成されたテーブルのリストを表示できます。
Corrupt_table
をリストから選択し、下拉ボックスからテーブルを修復するオプションを選択します。
以下は参照用のスクリーンショットです。
テーブルが修復されると、corrupt_table
の状態がOKになります。以下はスクリーンショットです。
結論
この記事では、MySQLデータベースの破損原因とその解決方法を学びました。私は、16進编辑器を使用してMySQLテーブルを破損する手順を段階ごとに説明しました。また、CHECK TABLE
コマンドとREPAIR TABLE
コマンドを使用して修復する方法もカバーしました。また、mysqldump
ユーティリティを使用してテーブルを復元する方法も学びました。
破損したMySQLデータベーステーブルの修復は難しいことがありますが、適切なツールと方法を使用することで、処理可能です。手動メソッドは基本の解決策を提供しますが、phpMyAdminは包括的で信頼性のある復旧オプションを提供します。常時バックアップを取ることと、データベースの健康状况を維持することで、破損の危険を最小限にするようにしてください。
Source:
https://dzone.com/articles/repair-corrupt-mysql-database-tables-step-by-step