MySQLデータ損失のトラブルシューティング事例

MySQLデータ損失のトラブルシューティング事例

序文

最近、友人が突然WeChatで連絡してきて、MySQLでデータ損失が発生したと教えてくれました。間違いなく、DBAにとって、これは間違いなく最もストレスの多いことです。その知らせを聞いて、私はすぐに問題のトラブルシューティングを始めました。

現地調査

最初にこのニュースを聞いたとき、もちろんとても緊張しましたが、すぐに落ち着いて調査を始めました。

(1)インスタンスの状態は正常ですか? --確認後、インスタンスの状態は正常です

(2)ビジネスライブラリはどれですか?それはまだ存在しますか?削除されましたか? --事業在庫は

(3)エラーを報告する際にビジネス部門はどのテーブルにアクセスしましたか?テーブルは存在しますか?削除されましたか? --確認後、ビジネステーブルが存在する

(4)アプリケーションユーザーの権限は正常ですか? --アプリケーションユーザーがビジネスライブラリのすべての権限を持っていることが確認されました

(5)ビジネスアクセス中にどのようなエラーメッセージが報告されますか? --確認後、ビジネス側は特定のページにアクセスする際にエラーを報告します

(6)この時点での調査では、一方ではアプリケーションに異常があるのではないかと疑い、他方では一部のレコードが失われているのではないかと疑います。開発側と運用保守側が同時に調査しています。ここで運用保守側が調査するアイデアは、業務テーブルに主キーがあるかどうかです。ビジネス側のアクセス エラーとビジネス テーブルの対応関係は何ですか?対応するレコードを見つけることができますか?

(7)さらに分析すると、業務テーブルに主キーがあり、開発側もクエリレコードを提供していることが判明しました。確認したところ、レコードは存在しており、誤って削除されたわけではありませんでした。開発側がアプリケーションを確認したところ、ログにはエラー情報が明確に出力されていませんでした。

(8)この場合、その夜に何か変更やリリースがあったかどうかしか尋ねられないのでしょうか? --その夜にいくつかのテーブルDDLの変更が行われたことが確認されました

調査を続けると、その夜の DDL 変更にはビジネス テーブルの操作が関係していることがわかりました。変更は、フィールドの長さを変更するもので、alter table xxx modify column xxx char(x) に似ています。この時点で、問題について考え始めました。次に、sql_mode 構成を確認し、対応する完全な行レコードをクエリして開発者に確認し始めました。最終的に、DDL 変更によってフィールドが切り捨てられたことを確認しました。最終的には、バックアップによってのみ復元でき、問題はようやく解決しました。

ケースの再現

先ほどのトラブルシューティングのプロセスを読んだ後、フィールドの長さを変更するとデータが切り捨てられるのはなぜかという疑問が多くの方に生じると思います。 MySQL はデータ検証を行わないのですか?引き続き下を見ていきましょう。

(1)シナリオ1

mysql> sbtest2 から * を選択し、制限 1 を設定します。
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
| id | k | c | パッド |
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
| 1 | 3718516 | 08566691963-88624912351-16662227201-46648573979-64646226163-77505759394-75470094713-41097360717-15161106334-50535565977 | 63188288836-92351140030-06390587585-66802097351-49282961843 |
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
セット内の 1 行 (0.00 秒)

mysql> alter table sbtest2 列 pad char(1) を変更します。
エラー 1265 (01000): 行 1 の列 'pad' のデータが切り捨てられました

mysql> sbtest2 から * を選択し、制限 1 を設定します。
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
| id | k | c | パッド |
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
| 1 | 3718516 | 08566691963-88624912351-16662227201-46648573979-64646226163-77505759394-75470094713-41097360717-15161106334-50535565977 | 63188288836-92351140030-06390587585-66802097351-49282961843 |
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
セット内の 1 行 (0.00 秒)

(2)シナリオ2

mysql> sbtest2 から * を選択し、制限 1 を設定します。
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
| id | k | c | パッド |
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
| 1 | 3718516 | 08566691963-88624912351-16662227201-46648573979-64646226163-77505759394-75470094713-41097360717-15161106334-50535565977 | 63188288836-92351140030-06390587585-66802097351-49282961843 |
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------+
セット内の 1 行 (0.00 秒)

mysql> alter table sbtest2 列 pad char(1); クエリは正常、100 行が影響を受け、100 個の警告 (0.06 秒)
レコード: 100 重複: 0 警告: 100

mysql> sbtest2 から * を選択し、制限 1 を設定します。
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+------+
| id | k | c | パッド |
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+------+
| 1 | 3718516 | 08566691963-88624912351-16662227201-46648573979-64646226163-77505759394-75470094713-41097360717-15161106334-50535565977 | 6 |
+----+---------+------------------------------------------------------------------------------------------------------------------------------------------------------+------+
セット内の 1 行 (0.00 秒)

シナリオ 1 は私たちの予想に沿うもので、「データが切り捨てられました」というエラーが直接報告されます。シナリオ 2 は正常に実行され、「部分的なデータ損失」が発生します。では、MySQL はデータ検証を実行しないのでしょうか?実際、MySQL にはデータ検証機能があります。しかし、シナリオ 2 では、sql_mode 構成の問題と STRICT_TRANS_TABLES の設定の失敗により、MySQL は操作の実行を阻止できず、「データ損失」という悲劇が発生しました。

要約する

この時点で、「データ損失」の悲劇は終わりを迎えます。根本的な原因は、sql_mode が STRICT_TRANS_TABLES を設定していないことです。このケースは、sql_mode が非常に重要な構成であり、軽々しく設定または変更してはならないことも思い出させます。sql_mode の詳細については、次の記事で説明します。

上記は、MySQL データ損失のトラブルシューティング事例の詳細です。MySQL データ損失のトラブルシューティングの詳細については、123WORDPRESS.COM の他の関連記事に注意してください。

以下もご興味があるかもしれません:
  • dockerがredisを再起動するとmysqlデータが失われる問題を解決する
  • MySQL で置換操作を使用したときにデータ損失が発生する問題の解決策
  • サーバーがダウンしたときにMySQLデータの損失を防ぐためのいくつかのソリューション
  • MySQLデータ損失の原因と解決策

<<:  Docker で Elasticsearch Kibana と ik Word Segender をデプロイする詳細な説明

>>:  Webデザインチュートリアル(6):デザインへの情熱を持ち続ける

推薦する

Nodeはバックエンドの実装手順を素早く構築します

1. まず、node、express、express-generator をインストールします (4...

CSS 画像アニメーション効果のサンプルコード(フォトフレーム)

この記事では、CSS 画像アニメーション効果(フォトフレーム)のサンプルコードを紹介し、皆さんと共有...

Vue プラグイン エラー: このページで Vue.js が検出されました。問題は解決しました

Vue プラグインがエラーを報告しました: このページで Vue.js が検出されましたVueプラグ...

CSS3でカルーセル画像を作成する方法

スライドショーは Web ページでよく見られます。美しい写真が使われています。こちらは純粋な CSS...

Windows での MySQL データベースのマスター/スレーブ構成チュートリアル

WindowsでMySQLデータベースのマスターとスレーブを構成する詳細なプロセスは次のとおりです。...

MySQLのスリープ関数の特殊現象例の詳しい説明

序文MySQL のスリープ システム機能は、実用的な適用シナリオが少なく、通常は実験的なテストに使用...

MySQL をベースにしたシンプルな検索エンジンを実装する

目次MySQL ベースの検索エンジンの実装1. ngram全文パーサー2. 全文インデックスを作成す...

Vue のスロットスコープの詳細な理解(初心者向け)

Baidu には slot-scope に関する記事が既にたくさんありますが、以前よく学習しておら...

MySQL テーブル作成外部キー エラーの解決方法

データベーステーブルA: テーブル task_desc_tab を作成します ( id INT(11...

Nginx 正規表現の詳細な説明

Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...

ボタンをEnterキーに関連付けるjsコード

コードをコピーコードは次のとおりです。 <html> <ヘッド> <ス...

サーバー間のファイル バックアップ ソリューション、サーバー ファイルを別のサーバーに自動的にバックアップする方法は?

多くの組織ではファイル サーバーをバックアップする必要があり、あるサーバーから別のファイル サーバー...

Web ページのスクロール バーが右側に設定されているのはなぜですか?

私たちが毎日使っているブラウザや Word 文書のスクロール バーはなぜ右側にあるのでしょうか。多く...

Vue の高度な使用方法チュートリアル 動的コンポーネント

目次基本的な説明AST 解析レンダリング機能通常コンポーネントと動的コンポーネントの比較ファクトリ関...

JavaScript によるデータ視覚化: ECharts マップの作成

目次概要予防1. 使用方法2. 実装手順予備実装コード効果: Geo共通設定上記の構成を追加した後の...