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拡張機能をインストールする方法

推薦する

ul リスト タグ デザイン ウェブ ページ 複数列レイアウト

数日前、CSS で 3 列レイアウトを書いていたときに、突然この方法を思いつきました。このアイデアは...

HTML テキストエスケープのヒント

今日、CSDN で HTML テキスト エスケープのちょっとしたトリックを見ましたが、とても簡単です...

MySQL の一時テーブルと派生テーブルについての簡単な説明

派生テーブルについてメイン クエリに派生テーブルが含まれている場合、または SELECT ステートメ...

Nodejs でモジュール fs ファイルシステムを使用する方法

目次概要ファイル記述子同期、非同期、Promise同期書き込み非同期書き込み(推奨)約束​​の書き方...

WindowsでiTunesのバックアップパスを変更する方法

0. 準備: • iTunesを閉じる• タスクマネージャーでiTunesから始まるサービスを終了し...

フローティング要素が親要素の高さを崩す原因と解決策の詳細な説明

フローティング要素は、親要素の高さを縮小します。要素を float float:left/right...

Vueはローカルストレージの追加、削除、変更機能を実装します

この記事では、ローカルストレージの追加、削除、変更を実装するためのVueの具体的なコードを例として紹...

Linux でソフトウェア パッケージのバージョンをアップグレードする方法の詳細な説明

Linux環境で、特定のソフトウェア(パッケージ)がインストールされているかどうかを確認したい。 r...

MySQL sql_modeクエリと設定の詳細な説明

1. SQLを実行して表示する @@session.sql_mode を選択します。 グローバルレベ...

MySQLインデックスに関する詳細を共有する

数日前、同僚からMySQLのインデックスについて質問を受けました。大体わかっているのですが、まだ練習...

CSS スティッキーフッターのいくつかの実装

「スティッキーフッター」とはいわゆる「スティッキー フッター」は、新しいフロントエンドの概念や技術で...

npm グローバル モジュールのデフォルトのインストール パスを変更するためにノードのインストールをカスタマイズする手順

node を D ドライブにインストールしましたが、C ドライブのスペースを占有したくなかったため、...

HTML テーブル タグ チュートリアル (31): セルの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、セルの幅と高さはコンテンツに応じて自動的に調整されますが、セルの幅と高さを手動で設定...

docker ベースで Prometheus+Grafana を構築する手順の詳細説明

1. プロメテウスの紹介Prometheus は、もともと SoundCloud によって開発された...

Linux でスワップ領域を確認する 5 つのコマンドの概要

序文Linux では、スワップ パーティションとスワップ ファイルの 2 種類のスワップ領域を作成で...