Linux mysql5.5 を mysql5.7 にアップグレードする手順と落とし穴

Linux mysql5.5 を mysql5.7 にアップグレードする手順と落とし穴

Linux MySQL 5.5 が MySQL 5.7 にアップグレードされました

以下では、MySQL をアップグレードするための簡単な手順を紹介します。その後、123WORDPRESS.COM の編集者が、参考になる補足資料をいくつかまとめました。

1. mysql5.7.32をダウンロードする

公式ダウンロードアドレス: https://dev.mysql.com/downloads/mysql/

解凍

tar xvf mysql.tar.gz mysql/

2. 古いmysql binディレクトリに入り、mysqlデータをエクスポートします。

./mysql -uroot -pxxxx -h127.0.0.1 -P3306 </home/mysql5.5/bin/all.sql

3. 新しいmysqlルートディレクトリに入り、データを保存するデータディレクトリを作成します。

mkdirデータ

4. 新しく解凍したデータベースに対して、まず初期化コマンドを実行します。

CD ビン
./mysql_install_db --basedir=../ --datadir=../data

PS: 上記のアップグレードは Cent OS 上で行われましたが、Kylin をアップグレードしたときに、上記のステートメントが認識されず、次の初期化ステートメントに置き換える必要があることがわかりました。

./mysqld --defaults-file=../my.cnf --basedir=../ --datadir=../data --user=root --initialize

5. パスワードをスキップしてログインする

my.cnfの[mysqld]にskip-grant-tablesを追加する
my.cnfはデータベースの設定ファイルです

6. サービスを開始する

./mysqld --defaults-file=../my.cnf --basedir=../ --datadir=../data --user=root

7. パスワードを設定する

新しいコマンドラインウィンドウでmysqlにログインする

./mysql -uroot
mysql を使用します。
mysql.user を更新し、authentication_string=password('xxxx') を設定します。user='root' です。

8. サービスの停止

設定ファイル内のskip-grant-tablesをコメントアウトする

9. サービスを開始する

./mysqld --defaults-file=../my.cnf --basedir=../ --datadir=../data --user=root

10. 新しいコマンドラインログイン

./mysql -uroot -pxxxx
mysql を使用します。

現時点では、どのコマンドを実行しても、常に「このステートメントを実行する前に、ALTER USER ステートメントを使用してパスワードをリセットする必要があります。」というプロンプトが表示されます。
次に次の文を実行します

パスワードの設定 = PASSWORD('xxxx');

11. MySQLに接続するための他のIPアドレスを設定する

mysql を使用します。
*.* のすべての権限を、"xxxx" で識別される "root"@"%" に付与します。

12. 履歴データをインポートする

CD ビン
./mysql -uroot -pxxxx -h127.0.0.1 -P3306 </home/mysql5.5/bin/all.sql

13. アップデートを実行する

CD ビン
./mysql_アップグレード

14. アップグレード後、クエリステートメントでエラーが報告される場合があります。次のステートメントを実行できます。

@@sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。
sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。

以下は他のネットユーザーからのコメントです

MySQL 5.5 から 5.7 へのアップグレード

最近、MySQL をバージョン 5.5 から 5.7 にアップグレードするタスクがあります。これまでデータベースをアップグレードしたことがないので、試行錯誤しながら進めるしかありません。ネット上でたくさんの情報を見つけました。アップグレードする方法は2つだけです。

1. アップグレード方法

1. 論理アップグレード: mysqldump を使用して SQL ファイルを直接エクスポートし、新しい MySQL5.7 データベースを作成し、エクスポートした SQL ファイルを新しいデータベースにインポートします。もちろん、この方法を使用する場合は、mysqldump ではなく mydumper を使用することをお勧めします。当社では大量のデータがあるため、この方法で処理しませんでした。

2. インプレース アップグレード: このアップグレード方法はシンプルで高速です。元の MySQL インストール ディレクトリと /etc/my.cnf 構成ファイルを直接置き換え、mysql_upgrade スクリプトを使用してシステム テーブルのアップグレードを完了します。

2. 環境の紹介

当社の MySQL クラスターは Atlas の読み取り/書き込み分離を使用しており、MySQL プロキシの下に 4 つのデータベース サーバーがあります。

マスター: 172.16.100.1

スレーブ1:172.16.100.2

スレーブ2:172.16.100.3

奴隷3:172.16.100.4

現在のデータベースバージョン: "5.5.21

設定ファイル: /etc/my.cnf

データディレクトリ: /data/mysql

オペレーティングシステムのバージョン: CentOS6.9

3. アップグレードのアイデア

オンライン業務を中断することはできないため、まずスレーブの 1 つをクラスターから追い出し、MySQL 5.7 にアップグレードすることにしました。次に、MySQL 5.7 デバイスをクラスターに追加しました。データが同期された後、マスター ノードとスレーブ ノードを切り替え、他のスレーブ ノードをアップグレードしました。

4. 練習

4.1. mysql-proxyにログインし、スレーブの1つをクラスタから追い出す

mysql -uuser -ppwd -h127.0.0.1 -P234

バックエンドプロキシライブラリを表示する

mysql> SELECT * FROM backends;

+-------------+-------------------+--------+------+
| backend_ndx | アドレス | 状態 | タイプ |
+-------------+-------------------+--------+------+
| 1 | 172.16.100.1:3306 | アップ | rw |
| 2 | 172.16.100.2:3306 | アップ | ro |
| 3 | 172.16.100.3:3306 | アップ | ro |
| 4 | 172.16.100.4:3306 | アップ | ro |
+-------------+-------------------+--------+------+

セット内の行数は 5 です (0.00 秒)
サービス172.16.100.4をクラスターから除外する
mysql> バックエンド 4 を削除

4.2. MySQLのインストールディレクトリを置き換える

mysqlの公式ウェブサイトにアクセスし、mysql5.7バージョンmysql-5.7.23-linux-glibc2.12-x86_64.tar.gzをダウンロードします。

mysql5.7を解凍する

tar -zxf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

以前の mysql ディレクトリがリンクとして作成された場合は、リンクをキャンセルして再度リンクするだけです。

/usr/local/ をコピーします

MySQLのリンクを解除

ln -s mysql-5.7.23-linux-glibc2.12-x86_64 mysql

以前の mysql ディレクトリがリンクされていない場合は、名前を変更して別の mysql ディレクトリをリンクします。

/usr/local/ をコピーします

mysql5.5 をアップグレードする

ln -s mysql-5.7.23-linux-glibc2.12-x86_64 mysql (アップグレードにはより便利なので、できるだけこの方法を使用することをお勧めします)

4.3. MySQLサービスを開始する

MySQL 5.7 以降では、データベースを初期化する必要はありません。つまり、mysql_install_db コマンドを実行する必要はありません。

/usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --basedir=/usr/local/mysql --user=mysql --skip-grant-tables --skip-networking &

ps -ef |grep mysql

エラーがある場合はログ情報を確認してください

4.4. システム テーブルのデータ ディクショナリ情報を更新します。コマンドは次のとおりです。

mysql_upgrade は、mysql のアップグレード ディレクトリにあります。

出力は次のようになります。

「ALTER TABLE ** FROCE」というエラー プロンプトが表示される場合がありますが、これらのエラーについては心配しないでください。MySQL は後で自動的に修復します。データベースの状況によっては、修復時間が少し長くなる場合があります。今回はアップグレードに 2 時間以上かかりました。

最後に、出力が「アップグレード プロセスが正常に完了しました」であれば、アップグレードが成功したことを意味します。

4.5. アップグレード後にMySQLを再起動する

/usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --basedir=/usr/local/mysql --user=mysql &

アップグレードが完了したかどうかを確認します。アップグレードが成功した場合、出力は次のようになります。

このMySQLのインストールはすでに5.7.23にアップグレードされています。mysql_upgradeを実行する必要がある場合は、--forceを使用してください。

4.6.マスタースレーブ構成を再構成する

マスタースレーブ構成をやり直す

mysql> マスターを master に変更します。master_host="172.16.100.1",master_user="***",master_passowrd="***",master_log_file=" mysql-bin.000004", master_log_pos=1083;

mysql> スレーブを起動します。

mysql> スレーブステータスを表示します\G;

「はい」が 2 つある場合は正常であることを意味します。

4.7 読み取り書き込み分割クラスタへの参加

mysql-proxyデバイスに移動する

mysql -uuser -ppwd -h127.0.0.1 -P234

mysql>スレーブ172.16.100.4を追加します

mysql> バックエンドから * を選択します。

状態が up の場合、クラスターが正常に参加したことを意味します。

追記:

データベースのアップグレードは初めてで、全体的なアイデアが正しいかどうかわからなかったので、最初にテスト環境でテストし、数日間テストして問題がないことを確認した後、オンラインでアップグレードを実行しました。参考用です。

MySQL 5.5 から 5.7 へのアップグレード中に遭遇した落とし穴

経緯はこうです。当社には、5.5 の古い MySQL バージョンがいくつかあります。最近、プロジェクトがアップグレードされ、いくつかのフィールドが追加されました。spring-data-jpa を使用してテーブル構造を自動的に更新すると、MySQL バージョン 5.5 ではテーブルのデフォルト値として 2 つ以上の current_timestamps をサポートしていないため、エラーが報告されました。したがって、データベースのアップグレードを検討する必要があります

まずサーバーのバージョンを確認してください

もう一度ソースを見てください


ちなみに、弊社はAWSのEC2を利用しているので、ソースはすべてamzから取得しています。

yum update mysql-server を試しましたが、効果がなかったので、続行しました。

オンラインでいろいろと読みましたが、まず古いバージョンのデータベースをアンインストールしてから、新しいバージョンのデータベースをインストールするようにと書いてありました。では、データはどうしたらいいのでしょうか? 安全のため、まずデータベースを 1 つずつバックアップしました。MySQL データベースにも多数のユーザーと権限があることがわかったので、MySQL もバックアップしてから作業を開始しました。

1. データベースをアンインストールする

yum で mysql-server を削除します

しかし、ここでのインストールは異なるようなので、今 yum が見つけたものをすべてアンインストールしました。

アンインストールする前に MySQL サービスをオフにすることを忘れないでください。そうしないと、新しいバージョンをインストールした後、mysql --version を使用して MySQL ログインが 5.7 か 5.5 かを確認し、サービスを再起動すると、さまざまな問題が発生します。一部のファイルが削除されなかったため、新しくインストールされたデータベースは非常に奇妙に見えました。 。 。

2. 新しいデータベースをインストールする

yum 検索 mysql57

まず、利用可能なバージョンを確認してください。これについては何も言うことはありません。

yum インストール msyql57-server.x86_64

インストールしても大丈夫です。何がインストールされているか見てみましょう


奇妙なことに、mysql-config はまだ 5.5 に依存していますが、使用時に問題は見つかりませんでした。

3. 構成

インストール後、次のmy.cnfを変更します。

私のサーバーは /etc/my.cnf にあります。他のイメージが変更されたかどうかはわかりません。

設定時に、データ保存スペースがまだあることをふと思い出し、使えるか確認するために設定してみました。

そこで、my.cnf に次の行を追加しました (5.5 の多くの設定は非推奨になっており、以前の my.cnf は削除する必要があります。そうしないと、起動時にエラーが報告されます)


設定後、サービスを決定的に開始します

サービスmysqldの開始

案の定、私はエラーを報告しました

起動ログを確認しました

[エラー] 致命的なエラー: mysql.user テーブルが破損しています。mysql_upgrade を実行してください。

エラー: Zend_Db_Adapter_Exception: SQLSTATE[HY000] [2002] そのようなファイルまたはディレクトリはありません。さらに、このエラーを報告しようとしたときに例外が発生しました: Zend_Exceptionキー 'translate' のエントリが登録されていません (Abstract.php:144)

しまった、どうすればいいんだ?Google で検索したら、次の記事を見つけました: https://support.plesk.com/hc/en-us/articles/115001659169-MySQL-fails-to-start-mysql-user-table-is-damaged

具体的な解決策は以下のとおりです

a. サーバーホストにログインする

b. /etc/my.cnfファイルの[mysqld]セクションに skip-grant-tables を追加すると、セーフ モードが有効になります (パスワード検証などはありません)。

c. サービスmysqldの開始

d.mysql_アップグレード

e. サービスmysqldを再起動する

mysql_upgradeを実行しました


公式ドキュメントを確認したところ、アップグレード後に互換性がないものが多数あるという一般的な意味です。公式では、以前のワークスペースを修復するためのこのスクリプトを提供しています

アップグレードはシームレスでした。MySQL データベース内のすべてのユーザーは以前のデータベースに残っていたため、影響を受けませんでした。

アップグレードが完了しました

Linux MySQL 5.5 を MySQL 5.7 にアップグレードする詳細な手順に関するこの記事はこれで終わりです。MySQL 5.5 から 5.7 へのアップグレードに関する関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linux 環境に MySQL 8.0 をインストールするプロセスの紹介
  • Linux環境でよく使われるMySQLコマンドの紹介
  • Linux での MySQL のインストールに関するチュートリアル
  • Linux 環境に mysql5.7.36 データベースをインストールするチュートリアル

<<:  Vue 2.0 の基礎を詳しく解説

>>:  Dockerディスク容量不足の問題を解決する

推薦する

Docker で Nginx イメージ サーバーを構築する方法

序文一般的な開発では、画像をディレクトリにアップロードし、ディレクトリとファイル名を連結してデータベ...

1つのSQL文でMySQLの重複排除が完了し、1つが保持されます。

数日前、ある要件に取り組んでいたとき、MySQL で重複レコードをクリーンアップする必要がありました...

MySQL テーブルをコピーする 3 つの方法 (要約)

テーブル構造とそのデータをコピーする次のステートメントは、データを新しいテーブルにコピーします。注:...

Docker構成 Alibaba Cloud Container Serviceの操作

Alibaba Cloud Dockerコンテナサービスの設定Alibaba Cloud Image...

URL を入力すると、バックグラウンドでは具体的に何が起こるのでしょうか?

ソフトウェア開発者は、ネットワーク アプリケーションがどのように動作するかを階層的に完全に理解してい...

近々ブラウザに導入される CSS :is() と :where() の簡単な分析

Safari (Technology Preview 106) および Firefox (バージョン...

高品質なウェブページのデザイン方法 高品質なウェブページ(画像とテキスト)のデザイン経験

オープンプラットフォームの増加に伴い、そこから派生するさまざまなアプリケーションサービスも増加傾向に...

要素内の TimePicker は時間の一部を無効にします (分単位で無効)

プロジェクトの要件は、日付と時刻を選択し、現在の時刻以降の時刻のみを選択し、最小レベルを分単位で無効...

XHTML 入門チュートリアル: フレーム タグの使用

<br />フレーム構造により、ブラウザの 1 ページに複数の Web ページを同時に表...

WMLタグの概要

構造関連タグ--------------------------------------------...

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

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

ファイルが存在するかどうかを判断する JavaScript サンプルコード

1. ビジネスシナリオ最近はファイルのアップロードやダウンロードに関する開発をしています。ダウンロー...

Centos7.3 で mysql5.7.18 をインストールして初期パスワードを変更する方法

この記事では、Centos7.3でのmysql5.7.18のインストールと初期パスワードの変更につい...

Linux でパスワードを入力せずに sudo コマンドを実行する方法

sudo コマンドを使用すると、信頼できるユーザーは別のユーザー (デフォルトでは root ユーザ...

MySQL 5.7を完全にアンインストールするための詳細な手順

この記事は主に、MySQLを再インストールする際のクリーンでないアンインストールのさまざまな問題をま...