MySQL在Linux应用环境中,一般都是最重要的业务,定期备份是必须的。一般有如下几种策略:
1.拷贝文件系统 – 停止服务,copy 数据库目录;启动服务
(需要停止服务一段时间,期间不接受写入操作)2.MySQL自带工具mysqldump,这也是最常用的方式
(能在备份的过程lock tables,一定程度上保证数据的一致性)3.MySQL自带工具mysqlhotcopy
(文件系统级拷贝工具,能在备份过程lock tables,只对MyISAM表格有效)4.热备(未跑在生产环境中,等做完发上来)
· mysql库不支持lock,详细请参考http://planet.mysql.com/entry/?id=17913
只能使用mysqldump+”–lock-tables=0”来实现
· UUD*库使用mysqldump备份有问题,只能采用mysqlhotcopy
· 其他的采用mysqldump和mysqlhotcopy,就看个人习惯
附上利用python语言写的备份脚本 – backup_mysql.py
支持备份到本地和远程FTP
#!/usr/bin/python
# coding=gb2312import os
import time
import ftplib
import traceback#config vars
systempathchr="/" #路径分割符,*nix用"/" win32用"\\"
dbuser="mysqlhotcopy" #数据库用户名
dbpwd="8jsu0uo2dx9d" #数据库密码
dbnamelist=["fb555","114la"] #需要备份那些数据库workdir="/data1/backup_zone/data_mysql" #本地备份文件夹
errlogfile="databack.log" #错误日志名
ftp_addr="192.168.0.2" #ftp地址
ftp_port="2102" #ftp端口
ftp_user="databack" #ftp用户名
ftp_pwd="backpwd" #ftp密码
ftp_path="/" #存放到ftp路径ftpqueue=[]
def ftpstor():
#login
bufsize=1024
ftp=ftplib.FTP()
try:
ftp.connect(ftp_addr,ftp_port)
ftp.login(ftp_user,ftp_pwd)
ftp.cwd(ftp_path)
for filepath in ftpqueue:
#open file for input as binary
f=open(filepath,"rb")
#store file as binary
print getfilename(filepath)
ftp.storbinary("STOR "+getfilename(filepath),f,bufsize)
f.close()
ftp.quit()
except:
path=os.path.join(workdir,errlogfile)
traceback.print_exc(file=open(path,"a"))def dumpdb(dbname):
global ftpqueue
timeformat="%Y%m%d"
sqlvalformat="mysqldump –socket=/tmp/mysql.sock -u%s -p\"%s\" \"%s\" >\"%s\""
tarvalformat="tar –directory=\"%s\" -zcf \"%s\" \"%s\""
nowdate=time.strftime(timeformat)
dumpfile=os.path.join(workdir,dbname+".dump")
zipfile=os.path.join(workdir,dbname+"_"+nowdate+".tar.gz")
sqlval=sqlvalformat % (dbuser,dbpwd,dbname,dumpfile)
result=os.system(sqlval)
tarval=tarvalformat % (workdir,zipfile,dbname+".dump")result=os.system(tarval)
os.remove(dumpfile)
ftpqueue.append(zipfile)def getfilename(path):
pt=path.rfind(systempathchr)
return path[pt+1:]
def main():
for dbname in dbnamelist:
dumpdb(dbname)
# ftpstor()main()
#from https://d4e.org/showthread.php?t=76803&highlight=mysql+%E5%A4%87%E4%BB%BD
Tips
·创建用于操作备份过程的mysql账户mysqlhotcopy
GRANT SELECT ,
RELOAD ,
SHOW DATABASES ,
LOCK TABLES ON * . * TO ‘mysqlhotcopy’@'localhost’ WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
*UUD=UCenter+UChome+Discuz三者搭配的应用
·执行脚本需要用户有登录shell,空密码即可(保障安全,禁止ssh登陆)
no comment untill now