Скрипт для проверки и автоматического восстановления MySQL БД

 

Особенно акутально для большого числа БД с 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 вызывает чтение с диска? В доках явно сказано что или таблица нормально закрыта или будет накатан журнал транзакций, больше ничего не делается при проверке.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
КАПЧА