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=gb2312

import 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登陆)

,
Trackback

no comment untill now

Add your comment now