Скрипт для проверки и автоматического восстановления MySQL БД
Опубликовано vladimir в Сб, 08/01/2009 - 11:13
Особенно акутально для большого числа БД с MyISAM таблицами. Рекомендуется запускать периодически и после каждого аварийного перезабуска MySQL.
Требует: Python 2.x и MySQLdb (mysql-модуль для Python)
#!/usr/bin/env python ######################################### # Check all tables in all mysql databases # # Written by Vladimir Rusinov <vladimir@greenmice.info>, http://greenmice.info/ # # Reqirements: # Python 2.x (tested with 2.4) # MySQLdb ######################################### # Settings: host="localhost" username="root" password="" exclude_dbs = ('information_schema', ) ######################################### # code import sys from optparse import OptionParser import MySQLdb parser = OptionParser() parser.add_option("-f", "--fast", action="store_true", dest="fast", default="False", help="use fast table ckeck") (options, args) = parser.parse_args() check_type="" if options.fast: check_type="FAST" # first, get list of all databases: try: conn = MySQLdb.connect(host = host, user = username, passwd = password, db = "mysql") cursor = conn.cursor() cursor.execute("SHOW DATABASES") dbs = cursor.fetchall() #print dbs conn.close() except MySQLdb.Error, e: print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1) # now, check every database for (db, ) in dbs: if db in exclude_dbs: continue print "Checking database %s..." % (db, ) try: conn = MySQLdb.connect(host = host, user = username, passwd = password, db = db) cursor = conn.cursor() cursor.execute("SHOW TABLES") tables = cursor.fetchall() for (table, ) in tables: cursor.execute("CHECK TABLE `%s` %s" % (table, check_type)) status = cursor.fetchone()[3] if status not in ['OK', 'Table is already up to date']: print "Checking table %s.%s... %s; RUNNING REPAIR" % (db, table, status) cursor.execute("REPAIR TABLE `%s`" % (table, )) print cursor.fetchone() except MySQLdb.Error, e: print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1)

Велосипед?
mysqlcheck -A -r
Еще хорош:
myisamchk -r /var/lib/mysql/*/*.MYI
innodb problem
проверка innodb таблиц вызывает их чтение с диска. Большие таблицы, если они не read-only находятся в innodb. Проверка производится при старт. Буферпул забивается мусором (данными к которым в обычной ситуации нет обращения). table cache тоже забивается мусором, потому что открываются все таблицы подряд. у myisam есть опция чтобы проверять и ремонтировать незакрытые таблицы по мере обращения к ним.
Это почему проверка innodb
Это почему проверка innodb вызывает чтение с диска? В доках явно сказано что или таблица нормально закрыта или будет накатан журнал транзакций, больше ничего не делается при проверке.
Отправить комментарий