
Ich habe eine Datenbank mit etwa 6 GB und eine Tabelle nimmt fast den gesamten Speicherplatz ein. Wenn der Server stark ausgelastet ist, stürzt die Tabelle ständig ab, sodass ich den MySQL-Server anhalten und reparieren und dann erneut starten muss. Irgendwelche Ideen, warum und was dies verursachen könnte und wie ich dies abmildern könnte? Dies passiert NUR, wenn der Server plötzlich einen großen Besucheranstieg verzeichnet. Sehen Sie sich dieses Beispielbild an, als der letzte Absturz während eines Anstiegs auftrat:
Als ich meinen Hosting-Provider bat, der Sache auf den Grund zu gehen, teilte er ihm Folgendes mit:
Bei der Überprüfung haben wir festgestellt, dass die Datenbankgröße höher ist. Wenn die Website also stark ausgelastet ist, erfolgen viele Datenbankabfragen, wodurch die Wahrscheinlichkeit eines Datenbankabsturzes sehr hoch ist.
FREI -M
total used free shared buff/cache available
Mem: 8342 1451 586 451 6304 6180
DIE TISCHINFO
Table - Rows - Engine - encoding - Size
Stats: 22 020 753 MyISAM utf8_unicode_ci 6,0 GB
SERVER
Server: Localhost via UNIX socket
Servertyp: MariaDB
Server connection: SSL is not being used Dokumentation
Serverversion: 10.3.27-MariaDB - MariaDB Server
Protokollversion: 10
MEINE.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
Antwort1
Erhöhen Sie vorerst die key_buffer_size auf 1 G.
Migrieren Sie auf lange Sicht von MyISAM zu InnoDB (und ändern Sie die Cache-Größen). Dadurch entfällt zumindest die Notwendigkeit einer „Reparatur“.
Was ist die unartige Abfrage, die ausgeführt wird, wenn das Problem auftritt? Oder denken Sie, dass es „zu viele Benutzer“ sind, die übereinander stolpern? Ich habe so etwas gesehen. Die schnelle Lösung besteht darin,verringern max_connections
auf beispielsweise 200 und verringern Sie auch die Anzahl der vom Webserver verwalteten „untergeordneten“ Server. Dadurch wird von vornherein verhindert, dass zu viele Verbindungen hergestellt werden.
Wenn diese nicht weiterhelfen, geben Sie weitere Informationen ein, indem Sie die folgenden Anweisungen befolgen: http://mysql.rjweb.org/doc.php/mysql_analysis
Nehmen Sie die Änderung (oder Ergänzung) unter vor [mysqld]
. Das ist der Name des Servers, auf den es ankommt. myisamchk
ist ein separates Dienstprogramm.
Dadurch wird eine Tabelle geändert:
ALTER TABLE t ENGINE=InnoDB;
Hier finden Sie Hilfe zum Anpassen von key_buffer_size und innodb_buffer_pool_size: http://mysql.rjweb.org/doc.php/memory