Mysqlの一般的な障害の概要と最適化!!

ケースの事前知識ポイント

最適化の方法を学ぶには、まずMySQLの論理アーキテクチャを深く理解する必要があります。図8.1はMySQLの論理アーキテクチャ図であり、これによりMySQLの動作原理をより明確に理解できます。
ここに画像の説明を挿入
最上層は、ローカルsock通信やクライアント/サーバーツールに基づくほとんどのTCP / IP通信を含む、いくつかのクライアントおよび接続サービスです。主に、いくつかの接続処理、承認認証、および関連するセキュリティスキームを完了します。このレイヤーでは、セキュリティ認証を介してアクセスするクライアントにスレッドを提供するために、スレッドプールの概念が導入されています。SSLベースのセキュアリンクもこのレイヤーで実現できます。サーバーは、安全にアクセスするクライアントごとに、サーバーが持つ操作権限も検証します

第2層のアーキテクチャは、主にSQLインターフェイス、キャッシュクエリ、SQL分析と最適化、一部の組み込み関数の実行など、コアサービス機能のほとんどを完了します。プロシージャや関数など、すべてのクロスストレージエンジン関数もこのレイヤーに実装されています。この層で、サーバーはクエリを解析して対応する内部解析ツリーを作成し、クエリテーブルの順序の決定、インデックスを使用するかどうかなどの対応する最適化を完了し、最終的に対応する実行オペレーションを生成します。selectステートメントの場合、サーバーは内部キャッシュもクエリします。キャッシュスペースが十分に大きい場合は、多数の読み取り操作が解決される環境でシステムのパフォーマンスを向上させることができます。

ストレージエンジンレイヤーでは、ストレージエンジンはMySQLでのデータの保存と抽出を実際に担当し、サーバーはAPIを介してストレージエンジンと通信します。異なるストレージエンジンには異なる機能があり、実際のニーズに応じて選択できます

データストレージレイヤーは主に、ベアデバイスで実行されているファイルシステムにデータを保存し、ストレージエンジンとのやり取りを完了するためのものです。

MySQLシングルインスタンスのトラブルシューティング

(1)故障現象

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysql.sock' (2)

問題分析:上記の状況は、通常、データベースが開始されていないか、データベースポートがファイアウォールによってブロックされていることが原因です。解決策:データベースを起動するか、ファイアウォールのデータベースリスニングポートを開きます

(2)故障現象

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

問題分析:パスワードが正しくないか、アクセスする権限がありません。解決策:1 my.cnfのメイン構成ファイルを変更し、[mysqld]の下にskip-grant-tablesを追加して、データベースを再起動します。最終変更パスワードコマンドは以下の通りです

mysql>use mysql; 
mysql> update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; 
mysql> flush privileges;

再删除刚刚添加的 skip-grant-tables 参数,重启数据库,使用新密码即可登录。

(3)症状
データベースへのリモート接続を使用しているときに、データベースへのリモート接続が遅いという問題が発生することがあります。

問題の分析:MySQLホストがDNSへのクエリを実行するのが遅い場合、またはクライアントホストが多い場合、接続が遅くなります。開発マシンは外部ネットワークに接続できないため、MySQLに接続するときにDNS解決を完了できません。接続が非常に遅い理由も理解しています。

解決策:my.cnfメイン構成ファイルを変更し、[mysqld]の下にskip-name-resolveを追加し、データベースを再起動して解決します。ホスト名認証は将来の認証では使用できないことに注意してください

(4)故障現象

Can't open file: 'xxx_forums.MYI'. (errno: 145)

問題分析:
サーバーが異常終了している、データベースが配置されているスペースがいっぱいである、またはその他の不明な理由によりデータベーステーブルが破損している。
データベースファイルがオペレーティングシステムの直下にコピーおよび移動された場合、このエラーはファイルのグループ化が原因で発生する可能性があります。

解決策:次の2つの修復方法は、実行前にデータベースをバックアップする必要があります。次の2つの方法
を使用して、データテーブルを修復できます(最初の方法は、独立したホストユーザーにのみ適しています)。

1. MySQL独自の特別なユーザーデータテーブルチェックおよび修復ツールmyisamchkを使用します。通常、myisamchkコマンドはコマンドラインでのみ実行できます。一般的に使用される修復コマンドは次の
とおりです。myisamchk-rデータファイルディレクトリ/データテーブル名.MYI;

phpMyAdminはphpMyAdminの修復によりデータテーブルを修復する機能を持っていますので、テーブル入力後「操作」をクリックし、下の「テーブルメンテナンス」の「テーブル修復」をクリックしてください。

2.ファイルグループを変更します(独立したホストユーザーにのみ適しています):
データベースファイルをコピーするプロセス、データベースファイルはMySQL実行アカウントによる読み取りと書き込みができるように設定されていません(通常LinuxおよびFreeBSDユーザーに適用可能)

(5)故障现象
エラー1129(HY000):多くの接続エラーのため、ホスト 'xxx.xxx.xxx.xxx'がブロックされています。'mysqladmin flush-hostsでブロックを解除する

問題分析:mysqlデータベースパラメーターmax_connect_errorsのため、デフォルト値は10です。多数の(max_connect_errors)ホストがMySQLに接続し、合計接続要求が10回を超えると、新しい接続はMySQLサービスに接続できなくなります。同じIPを使用して、短時間に多数のデータベース接続が中断されたためにブロックされた(mysqlデータベースのmax_connection_errorsの最大値を超えた)

#解决方法:
#使用 mysqladmin flush-hosts 命令清除缓存,命令执行方法如下:

1.mysqladmin -uroot -p -h 192.168.241.48 flush-hosts 
Enter password:

2.修改 mysql 配置文件,在[mysqld]下面添加 max_connect_errors=1000,然后重 启 MySQL

(6)障害現象
クライアントから報告された接続が多すぎます。
問題分析:接続数がMysqlの最大接続数の制限を超えています。

#解决方法:
1.在 my.cnf 配置文件里面增大连接数,然后重启 MySQL 服务
max_connections = 10000

2.临时修改最大连接数,重启后不生效。需要在 my.cnf 里面修改配置文件,下次重启生效
set GLOBAL max_connections=10000;

(7)故障現象

Warning: World-writable config file '/etc/my.cnf' is ignored
 ERROR! MySQL is running but PID file could not be found

問題分析:MySQL構成ファイル/etc/my.cnfに不正な権限があります。

#解决方法:
chmod 644 /et/my.cnf

(8)故障現象

InnoDB: Error: page 14178 log sequence number 29455369832
InnoDB: is in the future! Current system log sequence number 29455369832

問題分析:Innodbデータファイルが破損しています

#解决方法:
#修改 my.cnf 配置文件,在[mysqld]下添加 innodb_force_recovery=4, 
启动数据库后备份数据文件,然后去掉该参数,利用备份文件恢复数据

MySQLマスタースレーブのトラブルシューティング

(1)障害現象
Slave_IO_スレーブライブラリの実行がNO

問題分析:メインライブラリとスレーブライブラリのserver-id値が同じです。

解決策:スレーブライブラリのserver-id値をメインライブラリとは異なるように変更します。変更後に再起動し、再度同期します

(2)症状2
スレーブライブラリのSlave_IO_RunningがNO

問題分析:スレーブライブラリスレッドがNOになる理由はたくさんあります。主な理由は、主キーが競合するか、マスターデータベースがデータを削除または更新することです。スレーブデータベースはレコードを見つけられず、データが変更されます。通常、ステータスコードエラーは1007、1032、1062、1452などです。

#解决方法一:
mysql> stop slave; 
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
mysql> start slave;

解决方法二:
设置用户权限,设置从库只读权限
set global read_only=true;

(3)故障現象

Error initializing relay log position: I/O error reading the header from the binary log

問題の分析:スレーブライブラリのリレービンが破損している

#解决方法:
手工修复,重新找到同步的 binlog 和 pos 点,然后重新同步即可

mysql>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx;

MySQLの最適化

ハードウェア

サーバーハードウェアに関しては、最も重要な要素はCPU、メモリ、およびディスクです。

(1)CPU
CPUについてMySQLアプリケーションでは、SMPアーキテクチャのマルチチャネル対称CPUを使用することをお勧めします。例:2つの
Intel Xeon 3.6GHz CPU を使用できます
MySQL だけでなく、4Uサーバーを専用データベースサーバーとして使用することをお勧めします。

(2)
メモリについて物理メモリMySQLを使用するデータベースサーバーの場合、サーバーメモリは
2GB以上に、4GB以上の物理メモリを推奨します。ただし、メモリは現在のサーバーでは
無視できる程度の問題であり、仕事中にハイエンドサーバーに遭遇すると、メモリは基本的に32Gを超えます。

(3)ディスクについて
ディスクシーク機能(ディスクI / O)。現在市販されている高速SASハードディスク(15000 rpm)を例にとると、
この種のハードディスクは理論上、1秒あたり15000回をシークします。これは物理的特性によって決定され、変更できません。MySQL
毎秒多数の複雑なクエリ操作を実行しており、ディスクへの読み取りと書き込みの量は想像できます。したがって、ディスクI / Oは
MySQL パフォーマンスを制限する最大の要因の1つであると一般に考えられています。通常、RAID-0 + 1ディスクアレイが使用されます
。RAID-5 を使用しないように注意してください。MySQLはRAID-5ディスクアレイでは効率的ではありません。 。ハードウェアの投資コストを考慮しない場合は、
特にデータベースサーバーとして使用されるソリッドステート(SSD)ハードディスクを検討することもできます。データベースの読み取りと書き込みのパフォーマンスは間違いなく大幅に向上します

MySQL構成ファイル

通常、デフォルトのmy.cnf構成ファイルはMySQLの最高のパフォーマンスを再生できないため、さまざまなハードウェアに従って最適化する必要があり、構成ファイルの最適化も焦点になります。以下は、32Gの物理メモリを持つデータベース最適化パラメーターであり、参照のみのために、グローバル、バイナリログ、マスタースレーブ、innodb、およびmyisamに関して最適化されています。

(1)default-time-zone = + 8:00
デフォルトのMySQLは、北京時間に修正されたシステムタイムゾーンを使用します。これは、いわゆるドンバ地区です。
(2)interactive_timeout = 120
サーバーがインタラクティブ接続を閉じる前にアクティビティを待機する秒数。
(3)wait_timeout = 120
サーバーが非インタラクティブ接続を閉じる前にアクティビティを待機する秒数
(4)open_files_limit = 10240
MySQLサーバーには、開いているファイルハンドルの数に制限があります。
(5)group_concat_max_len = 102400
MySQLのデフォルトのスプライシングの最大長は1024バイトです。1024バイトでは不十分なので、実際の状況に応じて変更してください。
(6)user = mysql
mysqlユーザーとして実行します。
(7)character-set-server = utf8、init_connect = 'SET NAMES utf8'
文字セットをutf8に設定します。
(8)back_log = 600
MySQLが新しいリクエストへの応答を一時的に停止する前に、スタックに保存できるリクエストの数。システムに短期間に多くの接続がある場合は、このパラメーターの値を増やす必要があります。このパラメーターは、着信TCP / IP接続のリスニングキューのサイズを指定します。デフォルト値50
(9)max_connections = 5000
MySQLはプロセス接続の最大数を許可します。TooMany Connectionsエラープロンプトが頻繁に表示される場合は、この値を増やす必要があります。
(10)max_connect_errors = 6000
各ホストの接続要求の異常割り込みの最大数を設定します。この回数を超えると、MySQLサーバーは、MySQLサーバーが再起動されるか、ホストの関連情報がflush hostsコマンドによってクリアされるまで、ホストの接続要求を禁止します
(12)table_open_cache = 2048
テーブルキャッシュのサイズを指定します。MySQLがテーブルにアクセスするときは常に、テーブルバッファーに空きがある場合、テーブルが開かれ、そこに入れられるため、テーブルの内容にすばやくアクセスできます。
(13)max_heap_table_size = 256M
この変数は、ユーザーが作成できるメモリテーブル(メモリテーブル)のサイズを定義します。この値は、メモリテーブルの最大行値を計算するために使用されます。この変数は動的な変更をサポートします。つまり、@ max_heap_table_size =#を設定します。
ただし、テーブルが再作成(テーブルの作成)、変更(テーブルの変更)、またはテーブルの切り捨てを行わない限り、既存のメモリテーブルは使用されません。サービスを再起動すると、既存のメモリテーブルもグローバルのmax_heap_table_size値に設定されます
(14)external-locking = false
外部ロックを回避するには、skip-external-locking MySQLオプションを使用します。このオプションはデフォルトで有効になっています
(15)max_allowed_pa​​cket = 32M
设置在网络传输中一次消息传输量的最大值。系统默认值为 1MB,最大值是 1GB,必 须设置 1024 的倍数
(16)sort_buffer_size = 512M
Sort_Buffer_Size 是一个 connection 级参数,在每个 connection(session)第一次需 要使用这个 buffer 的时候,一次性分配设置的内存。Sort_Buffer_Size 并不是越大越好,由 于是 connection 级的参数,过大的设置+高并发可能会耗尽系统内存资源。
(17)join_buffer_size = 8M
用于表间关联缓存的大小,和 sort_buffer_size 一样,该参数对应的分配内存也是每个 连接独享
(18)default-storage-engine = innodb
默认引擎,现在一般都是 innodb 引擎表居多
(20)thread_stack = 192K
设置 MySQL 每个线程的堆栈大小,默认值足够大,可满足普通操作。可设置范围为 128K 至 4GB,默认为 192KB
(21)transaction_isolation = READ-COMMITTED
设定默认的事务隔离级别,READCOMMITTEE 是读已提交。
(22)key_buffer_size = 1024M
指定用于索引的缓冲区大小,增加它可以得到更好的索引处理性能。
(23)bulk_insert_buffer_size = 64M
批量插入数据缓存大小,可以有效提高插入效率,默认为 8M
(24)skip-name-resolve
禁止域名解析,包括主机名.所以授权的时候要使用 IP 地址。

关于 MySQL 二进制日志文件

(1)log-bin=mysql-bin
打开 MySQL 二进制功能。
(2)expire_logs_days = 7
二进制日志只留存最近 7 天,不用人工手动删除
(3)slow_query_log
打开慢查询日志
(4)slow_query_log_file=slow.log
慢查询日志文件位置
(5)long_query_time = 2
记录超过 2 秒的 SQL 查询

关于引擎是 innodb 的优化如下:

(1)innodb_additional_mem_pool_size = 64M
这个参数用来设置 InnoDB 存储的数据目录信息和其它内部数据结构的内存池大小,类 似于 Oracle 的 library cache。这不是一个强制参数,可以被突破
(2)innodb_file_io_threads = 4
文件 IO 的线程数,一般为 4,但是在 Windows 下,可以设置得较大
(3)innodb_thread_concurrency = 8
服务器有几个 CPU 就设置为几,建议用默认设置,一般为 8
(4)innodb_write_io_threads = 8
InnoDB 使用后台线程处理数据页上写 I/O(输入输出)请求的数量。一般设置为 CPU 核数,比如 CPU 是 2 颗 8 核的,可以设置为 8
(5)innodb_log_files_in_group = 3
#为提高性能,MySQL 可以以循环方式将日志文件写到多个文件
(6)innodb_file_per_table = 1
独享表空间(关闭)
(7)innodb_open_files = 8192
innodb 打开文件句柄数

关于引擎是 myisam 的优化

(1)myisam_sort_buffer_size = 128M
MyISAM 表发生变化时重新排序所需的缓冲大小
(2)myisam_max_sort_file_size = 10G
MySQL 重建索引时所允许的最大临时文件的大小(当 REPAIR,ALTERTABLE 或者LOADDATAINFILE)。
如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)
(3)myisam_repair_threads = 1
如果一个表拥有超过一个索引,MyISAM 可以通过并行排序使用超过一个线程去修复
这对于拥有多个 CPU 以及大量内存情况的用户是一个很好的选择
(4)myisam_recover
適切に閉じられていないMyISAMテーブルを自動的にチェックして修復する

おすすめ

転載: blog.csdn.net/weixin_48190891/article/details/108713072