]> andersk Git - sql.git/blame - libexec/daily_afs_backups
backups: keep less monthlys
[sql.git] / libexec / daily_afs_backups
CommitLineData
82981855
JP
1#!/usr/bin/python
2
6ddefa00 3import os, sys, time
fe255fa9
JP
4from mitsql import db
5from mitsql.util import new_cursor, get_dbs, db_backup_pre, db_backup_mkdir
82981855
JP
6from Queue import Queue, Empty
7import threading
8import subprocess
9
10MYSQLDUMP_ARGS = ['--compact', '--add-drop-table', '--add-locks',
11 '--create-options', '--disable-keys', '--dump-date',
12 '--extended-insert', '--quick',
13 '--no-autocommit', '--quote-names', '--routines',
14 '--single-transaction', '--triggers', '--force']
15
16finished = False
17queue = Queue()
18
19def consumer():
20 while True:
21 try:
22 next = queue.get(timeout=3)
cd14464c 23 print "Consuming", next
4057614b 24 #print next[0] + ':',
e4fd5e1b 25 log = db.Backup.get_by(db=next[0])
82981855 26 if not log:
e4fd5e1b 27 log = db.Backup(db=next[0])
82981855 28 log.dump_path = next[1]
e4fd5e1b 29 log.dump_date = db.func.now()
82981855
JP
30 db_backup_mkdir(next[1])
31 args = ['mysqldump', next[0]]
32 args.extend(MYSQLDUMP_ARGS)
fe255fa9
JP
33 err = ''
34 try:
35 p0 = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
36 p1 = subprocess.Popen(['gzip'], stdin=p0.stdout, stdout=file(next[1], 'w+'))
37 p1.wait()
38 err = p0.stderr.read()
39 except Exception, e:
cd14464c
JP
40 print "Error on", next
41 print e
fe255fa9 42 err = str(e)
82981855
JP
43 if len(err):
44 log.dump_errnum = p0.returncode
45 log.dump_errstr = err
46 else:
47 log.dump_errnum = None
48 log.dump_errstr = None
49 log.save_or_update()
e4fd5e1b 50 db.session.flush()
4057614b 51 #print 'Done'
82981855 52 except (KeyboardInterrupt, SystemExit):
cd14464c 53 print "Got exit request"
82981855
JP
54 break
55 except Empty:
cd14464c 56 print "No queue."
82981855 57 if finished:
cd14464c 58 print "Done!"
82981855
JP
59 break
60
61t_consumer = threading.Thread(target=consumer)
62t_consumer.start()
63
64def producer():
65 c = new_cursor('mysqldump')
fe255fa9
JP
66 for dbname in get_dbs(c):
67 log = db.Backup.get_by(db=dbname)
82981855 68 if not log:
fe255fa9 69 log = db.Backup(db=dbname)
4057614b 70 elif log.skip_date and log.skip_date.timetuple:
6ddefa00
JP
71 if time.mktime(log.skip_date.timetuple()) + 3600 > time.time():
72 # never recheck a db skipped in the past hour
73 continue
fe255fa9 74 d = db_backup_pre(c, dbname)
82981855 75 if d[0]:
fe255fa9 76 queue.put((dbname, d[1]))
82981855
JP
77 log.skip_reason = None
78 log.skip_date = None
79 else:
80 log.skip_reason = d[1]
e4fd5e1b 81 log.skip_date = db.func.now()
82981855 82 log.save_or_update()
e4fd5e1b 83 #db.session.flush()
82981855
JP
84
85try:
86 producer()
87except KeyboardInterrupt:
88 sys.exit(1)
89finally:
90 finished = True
This page took 0.097153 seconds and 5 git commands to generate.