
私のデータベースは約 6GB あり、1 つのテーブルがそのスペースのほとんどを占めています。サーバーに高負荷がかかると、テーブルがクラッシュし続けるため、MySQL サーバーを停止して修復し、再起動する必要があります。この原因と原因、およびこれを軽減する方法を教えてください。これは、サーバーへの訪問者数が突然急増した場合にのみ発生します。スパイク中に最後にクラッシュが発生したときの次の画像を参照してください。
調査を依頼したところ、ホスティング プロバイダーは次のように言いました。
確認したところ、データベースのサイズが大きいため、Web サイトの負荷が高い場合、多くのデータベース クエリが存在し、データベースがクラッシュする可能性が非常に高くなることがわかりました。
無料 -M
total used free shared buff/cache available
Mem: 8342 1451 586 451 6304 6180
テーブル情報
Table - Rows - Engine - encoding - Size
Stats: 22 020 753 MyISAM utf8_unicode_ci 6,0 GB
サーバ
Server: Localhost via UNIX socket
Servertyp: MariaDB
Server connection: SSL is not being used Dokumentation
Serverversion: 10.3.27-MariaDB - MariaDB Server
Protokollversion: 10
MY.CNF
[mysql]
# CLIENT #
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysqld]
log-error=/var/lib/mysql/server.err
performance-schema=0
table_open_cache=2000
innodb_strict_mode="ON"
sql_mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
open_files_limit=40000
# GENERAL #
user = mysql
default-storage-engine = InnoDB
socket = /var/lib/mysql/mysql.sock
pid-file = /var/lib/mysql/mysql.pid
# MyISAM #
key-buffer-size = 64M
myisam-sort-buffer-size = 64M
myisam-recover-options = FORCE
# SAFETY #
skip-external-locking
max-allowed-packet = 128M
max-connect-errors = 1000000
innodb = FORCE
# DATA STORAGE #
datadir = /var/lib/mysql/
# CACHES AND LIMITS #
tmp-table-size = 32M
max-heap-table-size = 32M
query-cache-type = 0
query-cache-size = 32
max-connections = 500
thread-cache-size = 286
open-files-limit = 65535
table-definition-cache = 1024
table-open-cache = 512
group-concat-max-len = 1048576
# INNODB #
#innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 512M
innodb-log-buffer-size = 16M
innodb-flush-log-at-trx-commit = 2
innodb-file-per-table = 1
innodb-buffer-pool-size = 4G
# LOGGING #
# log-queries-not-using-indexes = 1
# slow-query-log = 1
# slow-query-log-file = /var/lib/mysql/mysql-slow.log
max_allowed_packet=268435456
innodb_file_per_table=1
[mysqldump]
quick
max_allowed_packet = 128M
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
答え1
とりあえず、key_buffer_size を 1G に増やします。
長期的には、MyISAM から InnoDB に移行します (キャッシュ サイズを変更します)。これにより、少なくとも「修復」の必要がなくなります。
問題発生時に実行されている不正なクエリは何ですか?それとも「ユーザーが多すぎる」ためにお互いにつまずいているのでしょうか?私はそのようなことを見たことがあります。簡単な解決策は減少 max_connections
たとえば、200 に設定し、Web サーバーが維持する「子」の数も減らします。これにより、そもそも接続が多すぎることが防止されます。
それでも問題が解決しない場合は、次の手順に従って詳細情報を提供してください。 http://mysql.rjweb.org/doc.php/mysql_analysis
の下で変更 (または追加) を行います[mysqld]
。これは、重要なサーバーの名前です。 myisamchk
は別のユーティリティです。
これにより、1 つのテーブルが変更されます。
ALTER TABLE t ENGINE=InnoDB;
key_buffer_size と innodb_buffer_pool_size を調整する際のヘルプについては、次を参照してください。 http://mysql.rjweb.org/doc.php/メモリ