Created
December 6, 2011 21:01
-
-
Save AevaOnline/1439982 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- 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