MySQL の一般的な問題とアプリケーション スキルの概要

MySQL の一般的な問題とアプリケーション スキルの概要

序文

MySQL の日常的な開発やメンテナンスでは、パスワードの紛失やテーブルの破損など、避けられない問題や障害が発生することがよくあります。将来必要になった場合に備えて、一般的な問題をまとめておきます。

1. MySQLのルートパスワードを忘れた

1. データベースが配置されているサーバーにログインし、mysql プロセスを手動で終了します。

(1)データベースが配置されているサーバーにログインし、MySQLプロセスを手動で終了します。

root@bogon:/data/mysql# `cat ./mysql.pid` を強制終了します

このうち、mysql.pid は MySQL データ ディレクトリ内の pid ファイルを参照し、MySQL サービスのプロセス ID を記録します。

(2)--skip-grant-tablesオプションを使用してMySQLサービスを再起動します。

zj@bogon:/data/mysql$ sudo /usr/local/mysql/bin/mysqld --skip-grant-tables --user=root &

--skip-grant-tables オプションは、MySQL サービスを起動するときに認証テーブル認証をスキップすることを意味します。起動後、MySQL に root として接続する場合、パスワードは必要ありません。

(3)空のパスワードを持つrootユーザーを使用してmysqlに接続し、rootパスワードを変更します。

zj@bogon:/usr/local/mysql/bin$ mysql -uroot
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは3です
サーバーバージョン: 5.7.18-log ソース配布

Copyright (c) 2000, 2017, Oracle およびその関連会社。無断複写・転載を禁じます。

OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。

ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。

MySQL [(なし)]> パスワードを password('123456') に設定します。
エラー 1290 (HY000): MySQL サーバーは --skip-grant-tables オプションで実行されているため、このステートメントを実行できません
MySQL [(なし)]> mysqlを使用する
データベースが変更されました
MySQL [mysql]> ユーザーを更新し、authentication_string=password('123456') を設定します。ここで、user="root"、host="localhost" です。
クエリは正常、1 行が影響を受け、1 つの警告 (0.02 秒)
一致した行: 1 変更された行: 1 警告: 1

MySQL [mysql]> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

MySQL [mysql]> 終了;
さよなら

****************************************************************

zj@bogon:/usr/local/mysql/bin$ mysql -uroot -p123456
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは7です
サーバーバージョン: 5.7.18-log ソース配布

Copyright (c) 2000, 2017, Oracle およびその関連会社。無断複写・転載を禁じます。

OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。

ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。

MySQL [(なし)]>

--skip-grant-tables オプションを使用してシステムを起動したため、「set password」コマンドを使用してパスワードを変更できませんでした。ユーザー テーブルの authentication_string フィールドを直接更新した後、パスワードは正常に変更されました (テストしたバージョンは 5.7.18 で、一部のバージョンのパスワード フィールドは 'password' です)。権限認証を再度有効にするには、権限テーブルを更新します。再度 root としてログインすると、変更したパスワードを使用できます。

2. MyISAM ストレージエンジンのテーブル破損に対処する方法

場合によっては、myisam テーブルが破損している状況に遭遇することがあります。破損したテーブルの症状として、通常、クエリが予期せず終了し、次のようなエラーが表示されます。

  • 'table_name.frm' はロックされており、変更できません
  • ファイル 'tbl_name.MYYI' が見つかりません (エラーコード:nnn)
  • 予期しないファイルの末尾
  • ログファイルが破損しています
  • テーブル プロセッサからエラー nnn が発生しました。

通常、解決策は 2 つあります。

1. myisamchkツールを使用する

MySQL に付属する myisamchk ツールを使用して修復します。

シェル> myisamchk -r テーブル名

-r パラメータは回復を意味します。上記の方法でほぼすべての問題を解決できます。うまくいかない場合は、次のコマンドを使用します。

シェル> mysiamchk -o テーブル名

-o パラメータは --safe-recover を意味し、より安全なリカバリを可能にします。

2.SQLコマンドを使用する

修復を実行するには、MySQL の check table コマンドと repair table コマンドを一緒に使用します。check table はテーブルが破損しているかどうかを確認するために使用され、repair table は破損したテーブルを修復するために使用されます。

3. データディレクトリのディスク容量が不足している

システムの起動後、データ量が増加し続けると、データ ディレクトリ内の使用可能なスペースがどんどん少なくなり、アプリケーションにセキュリティ上のリスクが生じます。

1. MyISAMストレージエンジンを使用するテーブルの場合

MyISAM ストレージ エンジンを使用するテーブルの場合、次のオプションを使用して、テーブルの作成時にデータ ディレクトリとインデックス ディレクトリを異なるディスク領域に保存するように指定できます。デフォルトでは、両方ともデータ ディレクトリに保存されます。

データディレクトリ = 'ディレクトリへの絶対パス'
インデックスディレクトリ = 'ディレクトリへの絶対パス'

テーブルが作成されている場合は、テーブルが変更されないようにテーブルをシャットダウンまたはロックし、テーブルのデータ ファイルとインデックス ファイルを十分なディスク領域のあるパーティションに mv してから、元のファイルへのシンボリック リンクを作成することしかできません。

2. InnoDBストレージエンジンを使用するテーブルの場合

データ ファイルとインデックス ファイルは一緒に保存されるため、分離することはできません。ディスク容量が不足している場合は、新しいデータ ファイルを追加して、十分な容量のあるディスクに配置することができます。

具体的な実装方法は、このファイルをパラメータ innodb_data_file_path に追加し、パスを新しいディスクの絶対パスとして記述することです。

たとえば、/home に十分なスペースがなく、データを自動的に拡張できる新しいファイルを /home1 に追加する場合は、パラメータを次のように記述できます。

innodb_data_file_path = /home/ibdata1:2000M;/home1/ibdata2:2000M:自動拡張

パラメータを変更した後、変更を有効にするにはデータベースを再起動する必要があります。

4. DNS 逆引き解決の問題 (バージョン 5.0 以降では、デフォルトでドメイン名の逆引き解決がスキップされます)

クライアントで show processlist コマンドを実行すると、次のように多数のプロセスが表示されることがあります。

認証されていないユーザー | 192.168.10.10:55644 | null | 接続 | null | ログイン | null

これらのプロセスはどんどん蓄積されて消えなくなり、アプリケーションが正常に応答できなくなり、システムがクラッシュする原因になります。

デフォルトでは、MySQL はリモート接続された IP アドレスに対して逆ドメイン名解決を実行します。システムのホスト ファイルに対応するドメイン名がない場合、MySQL は接続を無効なユーザーと見なすため、次のプロセスで認証されていないユーザーが表示され、プロセスがブロックされます。

解決策は非常に簡単です。MySQL を起動するときに --skip-name-resolve オプションを追加すると、MySQL はドメイン名解決プロセスをスキップし、上記の問題を回避します。

5. mysql.sockが失われた後にデータベースに接続する方法

ローカル MySQL サーバー上のデータベースに接続するときに、mysql.sock が存在しないという問題が頻繁に発生し、接続に失敗します。これは、ホスト名として localhost を指定すると、mysqladmin がデフォルトで tcp/ip ではなく Unix ソケット ファイル接続を使用するためです。このソケット ファイル (通常は mysql.sock という名前) は、さまざまな理由で削除されることがよくあります。ユーザーは、--protocol=TCP|SOCKET|PIPE|MEMORY オプションを使用して接続プロトコルを明示的に指定できます。次の例は、Unix ソケット接続が失敗した後に TCP プロトコルを使用して正常に接続する方法を示しています。

1. Unixソケット接続:

zj@bogon:~$ mysql
エラー 2002 (HY000): ソケット '/tmp/mysql.sock' 経由でローカル MySQL サーバーに接続できません (2)

2. TCP接続

zj@bogon:~$ mysql --protocol=TCP

6. MyISAMテーブルが大きすぎてアクセスできない

まず、myisamchk コマンドを使用して MyISAM テーブルの状態を表示します。以下に示すように、管理テーブルを確認します


  • datefileの長さは現在のファイルサイズを表します
  • キーファイルの長さはインデックスファイルのサイズを表します
  • 最大日付ファイル長 最大ファイルサイズ
  • 最大キーファイル長 最大インデックスサイズ

次のコマンドを使用してデータファイルのサイズを拡張できます。

テーブル名を変更します。MAX_ROWS=88888888 AVG_ROW_LE=66666

7. データディレクトリのディスク容量が不足しています

MyISAMストレージエンジンの場合

データ ディレクトリとインデックス ディレクトリは、異なるディスク領域に保存できます。

InnoDBストレージエンジンの場合

InnoDB ストレージ エンジンを使用するテーブルの場合、データ ファイルとインデックス ファイルは一緒に保存されます。したがって、それらを分離することは不可能です。ディスク容量が不足している場合は、新しいデータ ファイルを追加して、十分な容量のあるディスクに配置することができます。具体的な実装としては、このファイルを InnoDB_data_file_path に追加します。

innodb_data_file_path=/home/mysql/data:10000M;/user/mysql/data:10000M:自動拡張

パラメータを変更した後、変更を有効にするにはサーバーを再起動する必要があります。

8. 同じホストに複数のMysqlをインストールする

各 MySQL インストール ディレクトリが異なる必要があることに加えて、ポートとソケットも異なる必要があります。

mysql.sock はクライアントが mysql と通信するために使用されます。ソケット ファイルはローカルでのみ使用でき、リモート接続は TCP/IP 経由で行う必要があります。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL 5.7.20 共通ダウンロード、インストール、設定方法と簡単な操作スキル(解凍版無料インストール)
  • Java Web を使用して MySQL データベースに接続する方法
  • tcpdump を使用して mysql のパケットをキャプチャする方法
  • MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明
  • 時間に基づいて日付をクエリするためのMySQL最適化テクニック
  • MYSQL クエリの効率を向上させる 10 の SQL ステートメント最適化テクニック
  • MySQL クイックデータ比較テクニック
  • MySQL データ ウェアハウスを保護するための 5 つのヒント
  • MySQL のデバッグと最適化に関する 101 のヒントを共有する
  • MySql SQL最適化のヒントの共有
  • MySQLインジェクションバイパスフィルタリング技術の概要
  • MySQLデータベースの共通操作スキルのまとめ

<<:  JavaScript でプロトタイプ パターンを実装する方法

>>:  CentOS7にPHP7 Redis拡張機能をインストールする方法

推薦する

Dockerコミットの使い方の詳しい説明

場合によっては、ベースイメージに特定の依存関係をインストールする必要があります。Dockerfile...

docker-maven-plugin の詳細な使用方法

目次Docker-Maven-プラグインMavenプラグインの自動デプロイメント手順1. ホストマシ...

dockerを使用してGrafana+Prometheus構成をデプロイする

docker-compose-monitor.yml バージョン: '2' ネットワ...

MySQLのslave_exec_modeパラメータの詳細な説明

今日、slave_exec_modeというパラメータを偶然見ました。マニュアルの説明から、このパラメ...

Ubuntu 18.04 Server に静的 IP を設定する方法

1. 背景Netplan は、Ubuntu システムのネットワーク設定を簡単に管理および構成できるよ...

MysqlクエリJSON結果に関連する関数の概要

JSON 形式のフィールドは、MySQL 5.7 で追加された新しい属性ですが、基本的には文字列とし...

ノードイベントループにおけるイベント実行の順序

目次イベントループブラウザ環境イベントループノード環境イベントループ6つのステージ(1)setTim...

CSS スティッキーフッタークラシックレイアウトの実装

スティッキーフッターレイアウトとは何ですか?一般的な Web ページのレイアウトは、通常、ヘッダー部...

VUE のコンパイル スコープとスロット スコープのスロットの問題について

スロットとは何ですか?スロット ディレクティブは v-slot であり、現在 slot と slot...

jQueryはテーブルのシームレスなスクロールを実現します

この記事の例では、テーブルのシームレスなスクロールを実現するためのjQueryの具体的なコードを参考...

MySQL の遅いクエリの最適化方法と最適化の原則

1. 日付のサイズを比較するには、XML に渡される日付形式は 'yyyy-MM-dd...

Webフロントエンドツール、Sublime Text 2の紹介

Sublime Text 2 は、軽量でシンプル、効率的なクロスプラットフォーム エディターです。ブ...

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...

さまざまなブラウザに対応するためにCSSで指定フォント@font-faceを導入する際の問題

Web ページを作成するときに、特定のフォントを使用したい場合は、 @font-faceを介して参照...

Reactにおける制御されたコンポーネントと制御されていないコンポーネントの簡単な分析

目次制御されていないコンポーネント制御コンポーネント知らせ結論は制御されていないコンポーネントフォー...