mirror of https://github.com/digint/btrbk
48 lines
1.1 KiB
Python
48 lines
1.1 KiB
Python
#!/usr/bin/python3
|
|
|
|
"""
|
|
This simple tool reads data from stdin and writes them to a file,
|
|
carefully *not* overwriting blocks that already have the desired content.
|
|
|
|
Usage example:
|
|
|
|
cd /mnt/backup/mysql
|
|
mysql -Ne "show databases;" | grep -v '_schema$' | while read db ; do
|
|
mysql -Ne "show tables;" "$db" | while read t ; do
|
|
f="$db/$t.db"
|
|
if ! test -f "$f" ; then
|
|
mkdir -p $db
|
|
touch "$f"
|
|
fi
|
|
echo "mysqldump '$db' '$t' | write_to '$f'"
|
|
done
|
|
done | parallel
|
|
|
|
The effect is that when your tables don't change/ are only appended to,
|
|
your files are not overwritten and thus your incremental backups stay
|
|
nice and small.
|
|
"""
|
|
|
|
import sys
|
|
|
|
if len(sys.argv) != 2:
|
|
raise RuntimeError(f"Usage: {sys.argv[0]} destfile")
|
|
|
|
fpos=0
|
|
bs=4096
|
|
|
|
fi = sys.stdin.buffer
|
|
with open(sys.argv[1], "rb+") as fo:
|
|
fo.seek(0)
|
|
while True:
|
|
od=fi.read(bs)
|
|
if not od:
|
|
fo.truncate(fpos)
|
|
break
|
|
nd=fo.read(bs)
|
|
if nd != od:
|
|
fo.seek(fpos)
|
|
fo.write(od)
|
|
fpos += len(od)
|
|
|