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コマンドの使い方の詳しい説明

推薦する

WeChatアプレットは日付と時刻に基づいた並べ替え機能を実装

最近、小さなプログラム プロジェクトを引き継いだのですが、リストを日付と時刻で並べ替えるという要件が...

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

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

MySQL初心者はグループ化や集計クエリの煩わしさから解放されます

目次1. グループクエリの概略図2. groupbyキーワード構文の詳細な説明3. 簡単なグループク...

Linux の Centos7 に Mysql5.7.19 をインストールする詳細なチュートリアル

1. MySQLをダウンロードするURL: https://dev.mysql.com/downlo...

Springboot アプリケーションを迅速にデプロイするために Docker とアイデアを統合する詳細なプロセス

目次1. はじめに2. 環境とツール3. Dockerをインストールし、リモート接続を構成する4. ...

Docker での MySQL 8.0.20 のインストールと設定のチュートリアル

Dockerは参考までにMySQLバージョン8.0.20をインストールします。具体的な内容は以下のと...

Nofollowタグの書き方と使い方

「nofollow」タグは数年前に Google、Yahoo、Microsoft によって提案されま...

Vue のレスポンシブ原則と双方向データの詳細な分析

応答性を実現するための object.defineProperty の理解observe/watch...

Vueプロジェクトでスケルトンスクリーンを使用する方法

現在、アプリケーション開発は基本的にフロントエンドとバックエンドに分離されています。主流のフロントエ...

MySQL 8 の新機能: 非表示のインデックス

背景インデックスは諸刃の剣です。クエリ速度は向上しますが、DML 操作も遅くなります。結局のところ、...

Linuxネットワーク構成ツールの使用

この記事では、RHEL8 のネットワーク サービスとネットワーク構成ツール、およびネットワーク ファ...

Vueルーティングナビゲーションガードの簡単な理解

目次1. グローバルガード1. グローバル前線警備2. グローバル解像度ガード3. グローバルポスト...

Unicode の一般的な文字の概要

初期のコンピューターのほとんどは ASCII 文字しか使用できませんでしたが、その後、主要な西洋のア...

CentOS 7.x dockerはoverlay2ストレージ方式を使用する

/etc/docker/daemon.json を編集し、以下を追加します。 { "ストレ...

CSS の読み込みによってブロックが発生しますか?

おそらく誰もが js の実行によって DOM ツリーの解析とレンダリングがブロックされることを知って...