ホームページ  >  記事  >  データベース  >  MySQL の一般的な問題と解決策

MySQL の一般的な問題と解決策

小云云
小云云オリジナル
2017-11-21 09:43:102503ブラウズ

プログラマーとして、MySQL は間違いなく使用するものであり、非常に重要ですが、仕事上、MySQL データベースで必然的にいくつかの問題が発生することがあります。私たちが日常業務で遭遇する一般的な MySQL の問題と解決策について話しましょう。

1. MySQL root パスワードを忘れた場合

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

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

root@bogon:/data/mysql# kill `cat ./mysql.pid`

その中で、mysql .pid は、MySQL データ ディレクトリ内の pid ファイルを参照し、MySQL サービスのプロセス番号を記録します。

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

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

--skip-grant-tables オプションは、MySQL サービスの開始時に付与テーブル認証をスキップすることを意味します。 root が開始されると、MySQL への接続にパスワードは必要なくなります。

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

zj@bogon:/usr/local/mysql/bin$ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3Server version: 5.7.18-log Source distribution
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> set password = password('123456');
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statementMySQL [(none)]> use mysql
Database changed
MySQL [mysql]> update user set authentication_string=password('123456') where user="root" and host="localhost";
Query OK, 1 row affected, 1 warning (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 1MySQL [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MySQL [mysql]> exit;
Bye
****************************************************************
zj@bogon:/usr/local/mysql/bin$ mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7Server version: 5.7.18-log Source distribution
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>

開始するには --skip-grant-tables オプションを使用し、変更するには「set password」コマンドを使用します。パスワードが失敗した場合は、ユーザー テーブルを直接更新します。authentication_string (テスト バージョンは 5.7.18、一部のバージョンのパスワード フィールドは「password」) を設定した後、パスワードは正常に変更されます。権限テーブルを更新して権限認証を再検証します。 root として再度ログインすると、変更したばかりのパスワードを使用できます。

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

myisam でテーブルの破損が発生する場合があります。破損したテーブルの症状は通常、クエリが予期せず中断され、次のエラーが表示されることです:

'table_name.frm' は変更のためにロックされています

ファイル 'tbl_name.MYYI' が見つかりません (errcode:nnn)

ファイルが予期せぬものです終了

ログ ファイルが破損しています

テーブル プロセッサからエラー nnn が発生しています。

通常、2 つの解決策があります:

1. myisamchk ツールを使用します。

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

shell> myisamchk -r tablename

-r パラメーターの意味は、recover上記のとおり、この方法でほとんどすべての問題を解決できます。そうでない場合は、コマンド

shell> mysiamchk -o tablename

を使用します。ここで、-o パラメーターは、より安全な修復を実行できます。

2. SQL コマンドを使用します

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

3. データディレクトリのディスク容量不足の問題

システムがオンラインになった後、データ量が増加し続けると、データディレクトリの空き容量がどんどん少なくなっていることがわかります。 、アプリケーションにセキュリティリスクを引き起こします。

1. myisam ストレージ エンジンのテーブルの場合

myisam ストレージ エンジンのテーブルの場合、テーブルの作成時にデータ ディレクトリとインデックス ディレクトリを異なるディスク領域に保存できます。同時にデータディレクトリに配置されます。 :

data directory = 'ディレクトリへの絶対パス'index directory = 'ディレクトリへの絶対パス'

テーブルが作成されている場合は、シャットダウンまたはロックのみ可能です。まずテーブルを変更しないようにテーブルを保存し、次にテーブルのデータ ファイルを保存し、ファイル mv をディスク上の十分なパーティションにインデックス付けしてから、元のファイルにシンボリック リンクを作成します。

2. innodb ストレージエンジンのテーブル用

データファイルとインデックスファイルは一緒に保存されているため、分離することはできません。ディスク容量が不十分な場合は、新しいデータ ファイルを追加して、十分な容量のあるディスクに配置できます。
具体的な実装方法は、このファイルをパラメータ innodb_data_file_path に追加し、パスは新しいディスクの絶対パスとして記述されます。
たとえば、/home の下に十分なスペースがなく、データを自動的に拡張できる新しいファイルを /home1 の下に追加したい場合、パラメータは次のように記述できます:

innodb_data_file_path = /home/ibdata1:2000M;/ home1/ibdata2:2000M:autoextend

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

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

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


これらのプロセスはどんどん蓄積され、システムが麻痺してしまいます。

デフォルトでは、MySQL はリモート接続の IP アドレスのドメイン名の逆解決を実行します。システムの hosts ファイルに対応するドメイン名がない場合、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:~$ mysqlERROR 2002 (HY000): ソケット '/tmp/mysql.sock' (2)


2 を介してローカル MySQL サーバーに接続できません。

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


この記事では、MySQL がデータベース内で遭遇する可能性のある 5 つの問題と解決策を紹介します。お役に立てば幸いです。それ。

関連する推奨事項:

最も安全な MySQL データベースをセットアップするにはどうすればよいですか?

MySQLデータテーブルのインデックスメソッドを表示する

MySQLトリガーに関する質問

以上がMySQL の一般的な問題と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。