単一のMySQLテーブルを復元する手順

単一のMySQLテーブルを復元する手順

休憩中に、眠気を完全に吹き飛ばす電話がかかってきました。「開発者が更新 SQL を書くときに where 条件を追加するのを忘れていました。」このニュースを聞いたら、DBA のクラスメートなら誰でも悪態をつきたくなると思います。幸いなことに、混乱していたのは 1 つのテーブルだけで、DB 内のテーブルを削除しようとする専門家はいませんでした。長い間、単一テーブルのリカバリを行っていませんでしたが、幸い手順はすべて頭に刻み込まれていたため、問題なくリカバリを完了できました。

ここで、自分自身と他の全員に思い出してもらうために、単一テーブル回復の手順と重要なポイントを記録しておきます。

最初のステップ:

復元マシンとして比較的パフォーマンスの高いサーバーを探し、バックアップ プールから最新のバックアップをこの復元マシンに復元します。もちろん、これはバックアップがあり、そのバックアップが利用可能であることを前提としています。 (何だって?バックアップを取っていないって言ったじゃないか。じゃあ寝て自由な空気を楽しんでください。)

注意: この時点では同期を開始せず、必ず非同期状態に保ってください。

追伸: もう 1 つ言いたいことがあります。DBA にとって、バックアップは最も重要なリンクです。バックアップが必要なだけでなく、バ​​ックアップが利用可能かどうかを定期的に確認する必要があります。これは DBA に必要な資質の 1 つです。

ステップ2:

間違った SQL ステートメントと時点を取得するミスを犯した開発者に連絡し、メイン データベースのバイナリ ログからこの SQL ステートメントの実行ポイントを見つけます。具体的な操作例は以下のとおりです

### mysqlbinlog を使用してバイナリ ログをプレーンテキスト SQL ログに変換します。mysqlbinlog mysql-bin.000123 > /data1/000123.sql

### Linux grep コマンドを使用して、「キーワード」に基づいてデータ破損の原因となる SQL の場所を見つけます。cat 000123.sql |grep -C 10 'key word' --color

### 赤い部分は問題のあるSQL、このSQLの開始時刻、次のSQLの開始時刻です。この2つのPOS位置は非常に重要です# 20393709
#131205 20:55:08 サーバー ID 18984603 end_log_pos 20393779 クエリ thread_id=16296016 exec_time=0 error_code=0
タイムスタンプを 1386248108/*!*/ に設定します。
始める
//*!*/;
# 20393779 で
#131205 20:55:08 サーバー ID 18984603 end_log_pos 20394211 クエリ thread_id=16296016 exec_time=0 error_code=0
タイムスタンプを 1386248108/*!*/ に設定します。
テーブル tablename を更新し、names='xxxx' を設定します。
# 20394211 で
#131205 20:55:08 サーバー ID 18984603 end_log_pos 20394238 Xid = 92465981
専念 /*!*/;
# 20394238 で
#131205 20:55:10 サーバー ID 18984603 end_log_pos 20394308 クエリ thread_id=16296017 exec_time=0 error_code=0
タイムスタンプを 1386248110/*!*/ に設定します。
始める

ステップ3:

2番目のステップで取得したpos位置に従って同期関係を開始しますが、問題のあるSQLの前のpos位置で停止する必要がある場合は、次のコマンドを使用します。

### pos 位置は、問題のある SQL の pos 位置と同じです。 begin slave start until master_log_file='mysql-bin.000123',master_log_pos=20393709;

次に、このSQLをスキップして、次のPOS位置への変更を同期します。次のコマンドを使用します。

### pos 位置は、問題のある SQL コミット後の pos 位置と同じです。master を master_log_file='mysql-bin.000123',master_log_pos=20394238; に変更します。

上記の 2 つのコマンドから、2 番目の手順で取得された 2 つの POS 位置が重要であることがわかります。

ステップ4:

メイン データベース上の不要なデータを含むテーブルの名前を変更する目的は 2 つあります。1 つ目は、このテーブルへの書き込みを停止することです (もちろん、これにより業務に一定の影響が生じ、一定期間書き込み失敗のアラームが表示されるため、事前に業務部門に連絡する必要があります)。2 つ目は、リカバリが失敗した場合でも、少なくとも不要なデータを含むテーブルが残っているため、リカバリ操作前の状態にすばやく復元できます。

### メイン データベースでテーブル tablename を tablename_bak に名前変更します。

次に、復元マシンでダンプ操作を実行します。この操作を使用するときは注意してください。テーブルに中国語の文字がある場合は、--default-chararter-set パラメータを追加することを忘れないでください。

mysqldump -uusername -ppassword -S/tmp/mysql.sock dbname テーブル名 --opt> テーブル名.sql

最後に、このファイルをメインライブラリサーバーに転送して、最終的な回復操作を完了します。

### MySQL にログインした後、tablename.sql をソースとして選択できます。

### cmd インターフェース mysql -uusername -ppassword -S/tmp/mysql.sock < tablename.sql を使用することもできます。

もちろん、この手間を回避して以下のコマンドを直接実行することもできますが、私の個人的な習慣では、過去の操作記録と中間結果を保存するので、上記の手順に従って完了します。 こうすることで、いつでも復元できるテキストファイルを保存できるので、より安心です。

### 簡単な方法は、以下の手順に従うことです。復元マシンで、コマンド mysql -uusername -ppassword -S /tmp/mysql.sock dbname tablename | mysql -uusername -ppassowrd -hhost -Pport を実行します。

上記のコマンドを使用すると、ダンプおよびインポート操作を直接完了できます。欠点は、バックアップ ファイルが生成されないことです。

ステップ5:

基本的な DBA の仕事は終了です。この時点で、開発スタッフにリカバリが完了したことを通知し、アプリケーションのテストとデータの正確性の検証を実施する必要があります。すべてが正常であれば、名前を変更したテーブルを削除すれば、回復操作は完了です。

存在する場合はテーブルを削除します tablename_bak;

データベースのリカバリはすべての DBA にとって必須のスキルであり、習得する必要があります。この記事を読んだ受講者がリカバリ操作を簡単に実行できるようになることを願っています。

追伸:この操作は1万年に1回は使用しない方がよいでしょう。

上記は、MySQL 単一テーブルリカバリの手順の詳細な内容です。MySQL 単一テーブルリカバリの詳細については、123WORDPRESS.COM の他の関連記事に注意してください。

以下もご興味があるかもしれません:
  • MySQL の完全なデータベース バックアップ データを使用して単一のテーブル データを復元する方法
  • MySQL で単一のデータベースまたはテーブルを復元する方法と、起こりうる落とし穴
  • MySQL の完全なデータベース バックアップからデータベースとテーブルを復元する方法
  • MySQL の frm ファイルからテーブル構造を復元する 3 つの方法 [推奨]
  • InnoDB タイプの MySql によるテーブル構造とデータの復元
  • MySQL は、完全なデータベース バックアップから指定されたテーブルとライブラリを復元します。
  • MySQL シングルテーブル ibd ファイル回復方法の詳細な説明
  • MYSQLは.frmを使用してデータテーブル構造を復元します
  • mysqldump を使用して指定したテーブルをバックアップおよび復元する方法
  • MySQLはテーブルデータを復元するためにfrmファイルとibdファイルを使用します

<<:  Vant Uploaderは1枚以上の写真をアップロードするコンポーネントを実装します

>>:  Tomcat のプレースホルダーによるポート設定方法 (パラメータ指定方式)

推薦する

複数の .sql ファイルを MySQL に効率的にインポートする方法の詳細な説明

MySQL には、複数の .sql ファイル (SQL ステートメントを含む) をインポートする方法...

JSON.stringify のさまざまな用途のまとめ

序文json を使用したことがある人なら、オブジェクトを文字列化してからバックエンドに送信するのが一...

CentOS7.6にMYSQL8.0をインストールする詳細な手順

1. 一般的に、CentOS では mariadb がデフォルトでインストールされているため、まず ...

ランダムロールコールテーブルを実装するためのネイティブJavaScript

この記事では、JavaScriptのランダムロールコールテーブルの具体的なコードを参考までに紹介しま...

Linux ハードウェア構成コマンドの例

ハードウェア ビュー コマンドシステム # uname -a # カーネル/オペレーティング システ...

Docker-compose インストール yml ファイルの設定方法

目次1. オフラインインストール2. オンラインインストール3. アンインストール4. ymlファイ...

JavaScript キャンバス テキスト クロック

この記事では、テキストクロックを実装するためのキャンバスの具体的なコードを例として紹介します。具体的...

JS を使用して HTML で回転するクリスマスツリーを実装する

<!DOCTYPE ヘムル パブリック> <html> <ヘッド&g...

WordPress実験を実装するための3つの仮想マシンのKVM展開の詳細説明

1. KVM の概要カーネルベースの仮想マシンの略称は、Linux 2.6.20 以降のすべての主要...

Vueの子コンポーネントと親コンポーネントの詳細な分析

目次1. 親コンポーネントと子コンポーネント2. テンプレート分離書き込み1. テンプレートタグ2....

よく使われるCSSカプセル化方法の概要

1. pc-reset PCスタイルの初期化 /* 正規化.css */ html{ 行の高さ: 1...

Web ページ WB.ExecWB 制御印刷メソッド呼び出しの説明とパラメータの紹介

WebページWB.ExecWB制御印刷方法コードをコピーコードは次のとおりです。 <テーブルの...

GDBデバッグMySQL実戦ソースコードコンパイルとインストール

ソースコードをダウンロード git クローン https://github.com/mysql/my...

macOS での MySQL 8.0.17 のインストールと簡単な設定チュートリアル

私が書いた内容が理解できない場合は、インターネット上に理解できるチュートリアルがない可能性があります...

Docker で複数のアプリケーション サイトをプロキシするために Nginx を使用する方法

序文エージェントの役割は何ですか? - 複数のドメイン名が同じサーバーに解決される- 1つのサーバー...