diff --git a/scripts/tokufilecheck.py b/scripts/tokufilecheck.py new file mode 100755 index 00000000000..39fe1ea1b91 --- /dev/null +++ b/scripts/tokufilecheck.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python + +import sys +import time +import re +import MySQLdb +import os.path + + +# run as +# [tcallaghan@mork ~]$ tokufilecheck.py --socket=/tmp/tmc.sock --user=root --datadir=$DB_DIR/data/ + + + +def usage(): + print "check for filesystem issues" + print "[--socket=SOCKET]" + print "[--port=PORT]" + print "[--user=USERNAME]" + print "[--password=PASSWORD]" + print "[--datadir=]" + return 1 + + +# check that each file in our file map exists in the file system +def check_file_map(rs, datadir): + print "checking that all files in our file map exist in the file system" + filesExisting = 0 + filesMissing = 0 + + for t in rs: + dictName = t[0] + fileName = t[1] + if os.path.isfile(os.path.join(datadir, fileName)): + #print datadir + fileName + " exists" + filesExisting += 1 + else: + print " *** " + datadir + fileName + " is missing" + filesMissing += 1 + + print " %d file(s) found | %d file(s) missing." % (filesExisting, filesMissing) + + +# check if a .tokudb file exists in our file map +def lookup_tokudb(rs, checkFileName): + fileExists = False + + for t in rs: + if (t[1] == checkFileName): + fileExists = True + break + + return fileExists + + +# check that all .frm files exist +def check_frm(rs, datadir): + print "checking that all .frm files exist" + filesExisting = 0 + filesMissing = 0 + + for t in rs: + databaseName = t[0] + tableName = t[1] + storageEngine = t[2] + if os.path.isfile(os.path.join(datadir + os.sep + databaseName, tableName + '.frm')): + #print datadir + fileName + " exists" + filesExisting += 1 + else: + print " *** missing FRM file for table " + tableName + " in database " + databaseName + filesMissing += 1 + + print " %d file(s) found | %d file(s) missing." % (filesExisting, filesMissing) + + +# check if a .tokudb file exists in our file map +def lookup_frm(rs, tableName, dbName): + frmExists = False + + for t in rs: + if ((t[0] == dbName) and (t[1] == tableName)): + frmExists = True + break + + return frmExists + + +def main(): + host = "localhost" + socket = None + port = None + user = None + passwd = None + datadir = "./" + + for a in sys.argv[1:]: + if a == "-h" or a == "-?" or a == "--help": + return usage() + match = re.match("--(.*)=(.*)", a) + if match: + exec "%s='%s'" % (match.group(1),match.group(2)) + continue + return usage() + + connect_parameters = {} + if socket is not None: + connect_parameters['unix_socket'] = socket + if port is not None: + connect_parameters['host'] = host + connect_parameters['port'] = int(port) + if user is not None: + connect_parameters['user'] = user + if passwd is not None: + connect_parameters['passwd'] = passwd + + datadir = os.path.normpath(datadir) + os.sep + + try: + db = MySQLdb.connect(**connect_parameters) + except: + print sys.exc_info() + return 1 + + print "connected to MySQL" + + print "retrieving file map" + try: + q = 'select * from information_schema.tokudb_file_map' + c = db.cursor() + n = c.execute(q) + rsFileMap = c.fetchall() + db.commit() + c.close() + except MySQLdb.Error, e: + print " ** Error %d: %s" % (e.args[0], e.args[1]) + return 2 + except: + print "db", sys.exc_info() + return 2 + + print "retrieving full table listing" + try: + q = "select table_schema, table_name, engine from information_schema.tables where table_schema != 'information_schema'" + c = db.cursor() + n = c.execute(q) + rsTables = c.fetchall() + db.commit() + c.close() + except MySQLdb.Error, e: + print " ** Error %d: %s" % (e.args[0], e.args[1]) + return 2 + except: + print "db", sys.exc_info() + return 2 + + check_file_map(rsFileMap, datadir); + check_frm(rsTables, datadir); + + print "checking for extra .frm and/or .tokudb files" + + extraFrm = 0 + extraTokudb = 0 + + for (path, dirs, files) in os.walk(datadir): + for file in files: + if (file.endswith('.frm')): + tableName = os.path.splitext(file)[0] + dbName = os.path.basename(os.path.normpath(path)) + if not lookup_frm(rsTables, tableName, dbName): + extraFrm += 1 + print "found .frm file for tableName / dbName = %s / %s" % (tableName, dbName) + if (file.endswith('.tokudb')): + # check that it exists in rsFileMap + checkFileName = "./" + file + if not lookup_tokudb(rsFileMap, checkFileName): + extraTokudb += 1 + print " ** found extra .tokudb file %s" % (checkFileName) + + print " %d unmatched .frm file(s) found" % (extraFrm) + print " %d unmatched .tokudb file(s) found" % (extraTokudb) + + return 0 + +sys.exit(main())