MySQL データベースのアップグレードにおけるいくつかの「落とし穴」

MySQL データベースのアップグレードにおけるいくつかの「落とし穴」

商用データベースの場合、データベースのアップグレードは優先度が高く、バージョンアップのロードマップ、対応するパッチ、計画のための一連の訓練などがあり、厳しい戦いであることは明らかです。 MySQL の方向では、アップグレードの問題は、まるでそれがその存在を証明するだけであるかのように、かなり軽視されてきました。もちろん、まさにこの注目の欠如のせいで、私は今日多くの回り道をしてきました。

一般的に言えば、MySQL をアップグレードするための実行可能なソリューションは 2 つあります。1 つはデータ ディクショナリを直接アップグレードすることです。これはローカル マシンで完了します。プロセス全体にはオフライン操作が含まれ、業務が中断されます。2 つ目は、高可用性によってスムーズな切り替えを実現することです。原則は、低いバージョンから高いバージョンへのデータ レプリケーション関係を確立することです。このソリューションには明らかな利点があり、ビジネスへの影響が最も少なく、事前に検証でき、スムーズなロールバックを実現することもできます。もちろん、2 番目のソリューションには多くの事前準備が必要です。

現在私たちが扱っている環境では、ストレージや期間などの要素に基づいて最初の方法を採用しています。全体のプロセスは次のようになります。

1) mysqldump を使用してデータベースをバックアップします。バックアップ ファイルは約 120G です。

2) MySQL 5.5データベースを停止する

3) データベース ポートを変更してデータベースを再起動します。たとえば、移行プロセス中に他のビジネス接続の影響を回避するために、4308 から 4318 に変更します。検証後、データベースを停止します。

4) mysql_baseパスをバージョン5.7に変更し、/usr/bin/mysqlなどの環境変数設定を変更します。

5) 設定ファイルをバージョン5.7に置き換え、データベースを5.7モードで起動します。

6) アップグレード モードを使用してデータ ディクショナリをアップグレードします。コマンドは次のとおりです。

mysql_upgrade --socket=/data/mysql_4306/tmp/mysql.sock --port=4308 -uroot -pxxxx

7) 検査とレビュー

プロセス全体は問題ないように見えますが、実際の運用では抜け穴がたくさんあります。

1) mysqldump を使用してデータベースをバックアップします。バックアップ ファイルは約 120G です。高速オンライン バックアップには、mysqldump が使用されます。ただし、異常な状況ではリカバリ効率が低下します。したがって、バックアップに mysqldump を使用することはお勧めしません。代わりに、物理バックアップを使用することをお勧めします。条件が許せば、コールド バックアップ モードを直接使用してください。

2) MySQL 5.5データベースを停止する

3) データベース ポートを変更してデータベースを再起動します。たとえば、移行プロセス中に他のビジネス接続の影響を回避するために、4308 から 4318 に変更します。検証後、データベースを停止します。

4) mysql_baseパスをバージョン5.7に変更し、/usr/bin/mysqlなどの環境変数設定を変更します。

5) 設定ファイルをバージョン 5.7 に置き換え、データベースを 5.7 モードで起動します。ibdata の設定には注意を払っていませんでした。残念ながら、次のような奇妙な設定に遭遇しました。

innodb_data_file_path = ibdata1:1000M;ibdata2:100M:自動拡張

元の標準構成は、次の ibdata ファイルです。

innodb_data_file_path = ibdata1:1G:autoextend、

これにより、データベースの起動時に、ibdata ファイルが破損していることを示すエラー メッセージが表示されます。

6) アップグレード モードを使用してデータ ディクショナリをアップグレードします。コマンドは次のとおりです。

mysql_upgrade --socket=/data/mysql_4306/tmp/mysql.sock --port=4308 -uroot -pxxxx

アップグレード コマンドの実装プロンプトはあまり親切ではなく、多くのエラーが表示されましたが、最終的にはアップグレードが成功したという安心できるメッセージが表示されました。問題がこの段階に達すると、実際には解決が困難になりました。データ ディクショナリ ファイルが破損していたため、データ ディクショナリをアップグレードすることは不可能でした。これでは、データベースは、その中のテーブルを記述することさえできませんでした。

7) 検査と検証。当初は簡単に完了していた検証作業が、緊急の修復作業になってしまった。

その後に行われた最初の一連の是正措置は次のとおりでした。

8) 早朝に取得した既存の物理バックアップを使用してデータを復元するのに約 1 時間かかりました。mysqldump による復元をあきらめましたが、少なくとも 6 時間かかったと記憶しています。

9) 物理バックアップモードを使用して現在のデータベースをバックアップする

10) ibdata の構成に特に注意しながら、データベースを再アップグレードします。アップグレードが失敗した場合は、物理バックアップを使用してすぐにロールバックします。

11) アップグレード プロセスが再度ブロックされましたが、今回は sql_mode が原因でした。システム データ ディクショナリは正常にアップグレードされましたが、データベース テーブルの検出中に、主に sql_mode のデータ形式の検証が原因で、多くのデータ テーブルの形式検証が失敗しました。alter table test.xxxxx force などの再構築操作が必要でした。

12) リカバリプロセス中に原因不明の理由で、InnoDB の redo ログも影響を受け、ログにエラーが発生し始めました。そのため、現在復元されているデータベースの辞書が正常にアップグレードされたとしても、まだいくつかの欠陥が残っています。

その後の第2波の是正措置は次のとおりです。

13) mysqldump を使用して現在のデータベースをバックアップし、指定されたデータベースのみをバックアップし、all-databases オプションを使用せず、権限を個別にエクスポートします。

14) ポート4390などの別のポートを使用してMySQL 5.7のインスタンスをデプロイする

15) sql_mode はバージョン 5.5 でワイルドカード化され、他のパラメータが変更されます。

16) mysqldumpデータを4390 5.7インスタンスにインポートする

17) マスタースレーブレプリケーション関係を確立する

18) データベースポートを切り替えて、新しいバージョン5.7サービスを有効にします。

プロセス全体は紆余曲折に満ちていました。私はそれぞれの課題に自分なりの戦略で対処しようとし、近道を試みましたが、結局、罠にはまらなかったことがわかりました。このことから、決して軽視せず、運試しの姿勢で問題に対処してはいけないという、深い教訓も学びました。

上記は、MySQL データベースのアップグレードにおけるいくつかの「罠」の詳細です。MySQL データベースのアップグレードの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL 5.7.30 のインストールとアップグレードの問題に関する詳細なチュートリアル
  • MySQL 5.7 の Docker バージョンを MySQL 8.0.13 にアップグレードし、データを移行する
  • phpstudy2018 MySQL 5.5 から 5.7 へのアップグレードに関するチュートリアル (画像とテキスト付き)
  • CentOS 7 で MySQL 5.7.23 をアップグレードする際の落とし穴と解決策
  • MySQL 5.7 にアップグレードした後に開発者が注意しなければならない落とし穴
  • MySQL アップグレードのベストプラクティス
  • phpStudy で MySQL バージョンを 5.7.17 にアップグレードする方法
  • Windows で MySQL 5.6 を 5.7 にアップグレードする方法
  • Windows (x86、64 ビット) で MySQL 5.7.17 無料インストール バージョンをアップグレードするための詳細なチュートリアル

<<:  Vue + OpenLayers クイックスタートチュートリアル

>>:  Linuxのtimeコマンドの使い方の詳しい説明

推薦する

ウェブデザイナーのための超便利なツール 50 選

ウェブデザイナーになるのは簡単ではありません。デザインやアーキテクチャを考慮するだけでなく、さまざま...

Alibaba Cloud ECS centos6.8 に MySql5.7 をインストールして設定するチュートリアル

Alibaba Cloud yum コマンドでのデフォルトの MySQL バージョンは 5.17**...

MySQL 8.0.18 のインストールと設定方法のグラフィック チュートリアル (Linux)

この記事では、Linux MySQL 8.0.18のインストールと設定のグラフィックチュートリアルを...

nginxでの共有メモリの使用に関する詳細な説明

nginx プロセス モデルでは、トラフィック統計、トラフィック制御、データ共有などのタスクを完了す...

webpack -v エラー解決

背景webpackのバージョンを確認したいのですが、webpack -vを実行するとエラーが報告され...

MySQL ソートの原則とケース分析

序文ソートはデータベースの基本的な機能であり、MySQL も例外ではありません。ユーザーは、Orde...

Zabbix 監視ソリューション - 最新の公式バージョン 4.4 [推奨]

ザビックス2019/10/12 チェンシン参照するhttps://www.zabbix.com/do...

Docker Compose の実践とまとめ

Docker Compose は、Docker コンテナ クラスターのオーケストレーションを実現しま...

JavaScriptの記事では、Webフォームの操作方法を説明します。

1. はじめに先ほど、ウェブページの急速な発展について紹介しました。今回は、より深い内容についてお...

sqlite を mysql スクリプトに移行する方法

さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 パーレル # # https:/...

HTML要素を非表示にするいくつかの方法

1. CSSを使用するコードをコピーコードは次のとおりです。スタイル="display:n...

HTML テーブル_Powernode Java アカデミー

HTMLで表を描くには、表タグを使用します。 trは行を意味しますtdは列を示すth はテーブ...

Centos7 の起動プロセスと Systemd での Nginx の起動構成

Centos7 の起動プロセス: 1.post(電源投入時のセルフテスト) 電源投入時のセルフテスト...

VMware15 の Deepin インストール詳細チュートリアル (画像とテキスト)

序文Deepin のユーザー インターフェイスは、使用時に非常に見栄えがします。インターフェイス効果...

分散ロックの原理と3つの実装方法の詳細な説明

現在、ほぼすべての大規模な Web サイトとアプリケーションは分散方式で展開されています。分散シナリ...