Mysql Innodb: InnoDB: ERREUR: l'âge du dernier point de contrôle est InnoDB: qui dépasse la capacité du groupe de journaux

25

J'ai vraiment besoin d'une expertise mysql. Je suis un newbi de mysql et je vois un crash de serveur de ma base de données au cours de la dernière semaine.

J'utilise mysql 5.1.36 sur Ubuntu. Il s'agit d'un serveur mysql dédié avec Dual core et 4 Go de mémoire et 40 Go SSD.

Les erreurs de journalisation sont:

120413 23:57:15 [Note] Plugin 'FEDERATED' is disabled.
120413 23:57:15 [Warning] option 'innodb-autoextend-increment': unsigned value 2000 adjusted to 1000
120413 23:57:15  InnoDB: Initializing buffer pool, size = 2.9G
120413 23:57:15  InnoDB: Completed initialization of buffer pool
120413 23:57:16  InnoDB: Started; log sequence number 0 44234
120413 23:57:16 [Note] Event Scheduler: Loaded 0 events
120413 23:57:16 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.1.58-1ubuntu1-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)
120414  0:00:25 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=e2-relay-bin' to avoid this problem.
120414  0:00:25 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='', master_port='3306', master_log_file='', master_log_pos='4'. New state master_host='', master_port='3306', master_log_file='mysql-bin.000043', master_log_pos='87039427'.
120414  0:58:37 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='', master_port='3306', master_log_file='mysql-bin.000043', master_log_pos='87039427'. New state master_host='', master_port='3306', master_log_file='mysql-bin.000043', master_log_pos='87846901'.
120414  2:20:34  InnoDB: ERROR: the age of the last checkpoint is 241588252,
InnoDB: which exceeds the log group capacity 241588224.
InnoDB: If you are using big BLOB or TEXT rows, you must set the   
InnoDB: combined size of log files at least 10 times bigger than the
InnoDB: largest such row.

My.cnf est comme ci-dessous.

default-storage-engine=innodb
default-table-type=innodb
key_buffer              = 384M
max_allowed_packet      = 64M
thread_stack            = 256K
thread_cache_size       = 16
max_heap_table_size     = 64M
myisam_sort_buffer_size = 64M
join_buffer_size        = 8M
read_buffer_size        = 2M
read_rnd_buffer_size    = 8M
sort_buffer_size        = 3M
tmp_table_size          = 64M
# Innodb changes
innodb_additional_mem_pool_size = 16M
innodb_autoextend_increment     = 2000
innodb_buffer_pool_size         = 3000M #As current Db is around 1.2G.
innodb_file_per_table
innodb_data_file_path           = ibdata1:512M;ibdata2:512M:autoextend
innodb_flush_log_at_trx_commit  = 2 #For more reliablity use 1
innodb_flush_method             = O_DIRECT
innodb_log_buffer_size          = 8M
innodb_log_file_size            = 128M #Transaction Log up to 1/4 Buffer Pool
innodb_thread_concurrency       = 16
#innodb_force_recovery          = 2
#innodb_read_io_threads         = 8
#innodb_write_io_threads                = 8
innodb_lock_wait_timeout        = 50
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
max_connections        = 400
table_cache            = 1024M
thread_concurrency     = 16

Toutes les suggestions que je peux changer.

TheVyom
la source
Désolé ... les premières lignes ont été effacées.
TheVyom
Faites-vous plaisir et utilisez une version plus récente de MySQL, si vous le pouvez. 5.1.38 est ancien. Au moins mise à niveau vers une version 5.1 plus récente, sinon 5.5 si vous le pouvez.
Aaron Brown

Réponses:

26

À première vue, je dirais que votre taille innodb_log_file_size est bien trop petite. Il devrait être plus important de faire deux choses:

  • Accepter tous les grands champs BLOB ou TEXT
  • Tenir des transactions plus importantes

Voici ce que vous devez faire pour l'instant pour voir si cela aide:

ÉTAPE 01) Modifiez ce qui suit dans /etc/my.cnf

[mysqld]
innodb_log_buffer_size          = 32M
innodb_buffer_pool_size         = 3G
innodb_log_file_size            = 768M

ÉTAPE 02) service mysql stop

ÉTAPE 03) rm -f /var/lib/mysql/ib_logfile*

ÉTAPE 04) service mysql start

Cela va reconstruire les fichiers suivants

  • / var / lib / mysql / ib_logfile0
  • / var / lib / mysql / ib_logfile1

Essaie !!!

MISE À JOUR 2013-07-03 12:37 EDT

J'ai mis à jour mes autres articles à ce sujet et j'ai raté celui-ci

ButtleButkus vient de commenter2013-07-03 07:18:56 EDT

Ne serait-il pas conseillé de copier le fichier ib_logfile * vers un autre emplacement pour la sauvegarde avant de les supprimer?

Puisqu'il pourrait y avoir des données transactionnelles inachevées à l'intérieur, voici ce qui devrait être fait

ÉTAPE 01) Modifiez ce qui suit dans /etc/my.cnf

[mysqld]
innodb_log_buffer_size          = 32M
innodb_buffer_pool_size         = 3G
innodb_log_file_size            = 768M

ÉTAPE 02) mysql -uroot -p -e "SET GLOBAL innodb_fast_shutdown = 0;"

ÉTAPE 03) service mysql stop

ÉTAPE 04) rm -f /var/lib/mysql/ib_logfile*

ÉTAPE 05) service mysql start

Ai-je ajouté SET GLOBAL innodb_fast_shutdown = 0;. Qu'est-ce que ça fait? Cela oblige InnoDB à purger complètement les modifications transactionnelles de toutes les pièces mobiles InnoDB, y compris les journaux transactionnels (ib_logfile0, ib_logfile1). Ainsi, il n'est pas nécessaire de sauvegarder l'ancien ib_logfile0, ib_logfile1. Si les supprimer vous rend nerveux, passez à l'étape 04

mv /var/lib/mysql/ib_logfile* ..

pour mettre les anciens journaux /var/lib. Si la recréation des journaux réussit et que mysqld démarre, vous pouvez supprimer les anciens journaux.

J'utilise cette fonctionnalité depuis un an maintenant. J'ai mis à jour mes autres messages pour refléter cela ...

S'il y a d'autres messages plus anciens que je ne mentionne pas innodb_fast_shutdown , faites le moi savoir afin que je puisse le mettre à jour. Merci encore, ButtleButkus .

RolandoMySQLDBA
la source
L'augmentation du fichier journal à 256M et la réduction de la taille de buffer_pool_size à 2G semblent faire l'affaire.
TheVyom
Ma réponse a-t-elle aidé ???
RolandoMySQLDBA
Désolé oublié de mettre à jour cela. Cela a beaucoup aidé et notre serveur fonctionne sans problème depuis le mois dernier.
TheVyom
Ne serait-il pas conseillé de copier le fichier ib_logfile * vers un autre emplacement pour la sauvegarde avant de les supprimer?
Buttle Butkus
1
768Mo est assez grand par Percona Baron Schwartz percona.com/blog/2008/11/21/...
greenlitmysql