Skip to content

Instantly share code, notes, and snippets.

@AevaOnline
Created December 6, 2011 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AevaOnline/1439982 to your computer and use it in GitHub Desktop.
Save AevaOnline/1439982 to your computer and use it in GitHub Desktop.
--- oak-purge-master-logs.py 2011-12-06 08:48:48.328557390 -0800
+++ oak-purge-master-logs.nibble.py 2011-12-06 10:31:16.237144233 -0800
@@ -23,6 +23,7 @@
from optparse import OptionParser
import ConfigParser
import os.path
+import time
def parse_options():
parser = OptionParser()
@@ -42,6 +43,8 @@
parser.add_option("--sentinel", dest="sentinel", default="/tmp/oak-purge-master-logs.sentinel", help="Sentinel file: exit if the file exists")
parser.add_option("--print-only", action="store_true", dest="print_only", help="Do not execute. Only print statement")
parser.add_option("-v", "--verbose", dest="verbose", action="store_true", help="Print user friendly messages")
+ parser.add_option("-N", "--nibble", action="store_true", dest="nibble", help="Nibble one log at a time")
+ parser.add_option("-d", "--delay", dest="delay", type="float", default="1.0", help="Delay between each log file when nibbling")
return parser.parse_args()
def verbose(message):
@@ -192,24 +195,62 @@
slaves_master_log_files.sort()
return slaves_master_log_files
-def purge_master_logs_to(master_log_file):
+def purge_to(purge_target):
+ """
+ Wrapper around actual purge commands; decides whether to nibble or purge all at once.
+ """
+ if(options.nibble):
+ nibble_master_logs_to(purge_target)
+ else:
+ purge_master_logs_to(purge_target)
+
+def purge_master_logs_to(purge_target):
"""
Execute the PARGE MASTER LOGS TO statement, given a log name
"""
- query = "PURGE MASTER LOGS TO '%s'" % master_log_file
+ query = "PURGE MASTER LOGS TO '%s'" % purge_target
if(options.print_only):
print query
return
- verbose("Will purge master logs to %s" % desired_master_logs[0])
+ verbose("Will purge master logs to %s" % purge_target)
purge_cursor = None
try:
try:
purge_cursor = master_connection.cursor()
purge_cursor.execute(query)
- verbose("Successfuly purged master logs to %s" % master_log_file)
+ verbose("Successfuly purged master logs to %s" % purge_target)
except:
- print_error("Failed purging master logs to %s" % master_log_file)
+ print_error("Failed purging master logs to %s" % purge_target)
+ finally:
+ if purge_cursor:
+ purge_cursor.close()
+
+def nibble_master_logs_to(purge_target):
+ """
+ Execute the PARGE MASTER LOGS TO statement, one log file at a time, up to the named log file
+ """
+
+ verbose("Will purge master logs, one file at a time, to %s, sleeping %f sec between each purge" % (purge_target, options.delay))
+ purge_cursor = None
+ try:
+ purge_cursor = master_connection.cursor()
+ try:
+ for next_log in master_logs[1:]:
+ query = "PURGE MASTER LOGS TO '%s'" % next_log
+ if(options.print_only):
+ print query
+ if(options.delay): time.sleep(options.delay)
+ else:
+ purge_cursor.execute(query)
+ verbose("Successfuly purged master logs to %s" % next_log)
+ if(options.delay): time.sleep(options.delay)
+ if(next_log == purge_target):
+ break
+ except Exception as e:
+ print_error("Failed purging master logs, error: %s" % e)
+ else:
+ verbose("Finished purging master logs")
finally:
if purge_cursor:
purge_cursor.close()
@@ -218,7 +259,7 @@
"""
Purge master logs up to options.retain_logs. This is the desired behavior.
"""
- purge_master_logs_to(desired_master_logs[0])
+ purge_to(desired_master_logs[0])
def purge_master_logs_on_delaying_slaves():
"""
@@ -227,13 +268,13 @@
"""
if options.pro_master and options.pro_slaves:
master_log_to_purge_to = min(desired_master_logs[0], max_slave_master_log_file)
- purge_master_logs_to(master_log_to_purge_to)
+ purge_to(master_log_to_purge_to)
elif options.pro_master and not options.pro_slaves:
- purge_master_logs_to(desired_master_logs[0])
+ purge_to(desired_master_logs[0])
else:
# Not pro-master
# Play safe: the only safe thing to do is to purge to the min_slave_master_log_file.
- purge_master_logs_to(min_slave_master_log_file)
+ purge_to(min_slave_master_log_file)
if options.pro_slaves:
pass
else:
@@ -247,9 +288,9 @@
if options.pro_master:
if options.pro_slaves:
master_log_to_purge_to = min(desired_master_logs[0], max_slave_master_log_file)
- purge_master_logs_to(master_log_to_purge_to)
+ purge_to(master_log_to_purge_to)
else:
- purge_master_logs_to(desired_master_logs[0])
+ purge_to(desired_master_logs[0])
else:
# Not pro-master
print_error("Some slaves are missing. Have not purged anything. Specify --pro-master (possibly with --pro-slaves) to force purging.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment