免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 新手刚来
打印 上一主题 下一主题

麻烦各位兄弟,mysql二进制文件的备份问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-03-07 17:45 |只看该作者
谢谢了,明天搞定脚本自动解决这事儿,麻烦兄弟了

论坛徽章:
0
12 [报告]
发表于 2012-03-07 19:40 |只看该作者
回复 11# 新手刚来


     兄弟客气了,你只是做测试,还是在生产环境中用?
测试:
mysql -uroot -p -e"flush logs;";
这个只是强制刷新redo log buffer,并新建一个binlog,
可以不要FLUSH TABLES WITH READ LOCK, 这强制fush bp中的dirty page,而且要对全加加read lock,
只是为了保证数据一致性。最后unlock tables;
接着按你的cp复制所有的binlog,丢掉最后一个binlog就可,只有最后写的那个是有可能不一致的。
(当然最好用shell或python写个工具是最好的,排除最后的一个)

生产:
1,制定清除binlog的策略,用purge或设置expirelogs-days(0-99),比如把expirelogs-days=1,则1天前的binlog会自动删除,
或者用purge来删除,这样可以同时更新.index。
注意:第一次设置时,如果binlog过多,而且业务高峰,可能会导致mysql hung.
2,备份binlog有很多方式,一种就是有脚本还有rsync, scp,ftp定期备份,slave(log_slave_updates),专门的日志服务器。

论坛徽章:
0
13 [报告]
发表于 2012-03-07 19:43 |只看该作者
Shell不大会, 所以用python写了一个简单的,

测试结果如下:

-bash-3.00$ ./binlogBackUp.py
The MySQL server datadir is:/var/lib/mysql/
The lastest binlog is :mysql-bin.000151
binlog backup successfully, please check this in:/var/lib/mysql//binlogBackup/2012-03-07_08:56:39
It take 65 seconds!
-bash-3.00$ cd /var/lib/mysql//binlogBackup/2012-03-07_08:56:39;ll
total 2343272
-rw-r-----  1 mysql mysql   74324798 Mar  7 08:57 mysql-bin.000100
-rw-r-----  1 mysql mysql        149 Mar  7 08:56 mysql-bin.000101
-rw-r-----  1 mysql mysql        149 Mar  7 08:57 mysql-bin.000102
-rw-r-----  1 mysql mysql        149 Mar  7 08:57 mysql-bin.000103
-rw-r-----  1 mysql mysql    2102640 Mar  7 08:56 mysql-bin.000104
-rw-r-----  1 mysql mysql        149 Mar  7 08:56 mysql-bin.000105
-rw-r-----  1 mysql mysql        149 Mar  7 08:56 mysql-bin.000106
-rw-r-----  1 mysql mysql        149 Mar  7 08:57 mysql-bin.000107
-rw-r-----  1 mysql mysql   11503040 Mar  7 08:56 mysql-bin.000108
-rw-r-----  1 mysql mysql 1073743778 Mar  7 08:57 mysql-bin.000109
-rw-r-----  1 mysql mysql 1073742007 Mar  7 08:57 mysql-bin.000110
-rw-r-----  1 mysql mysql  149112773 Mar  7 08:56 mysql-bin.000111
-rw-r-----  1 mysql mysql   12363582 Mar  7 08:56 mysql-bin.000112
-rw-r-----  1 mysql mysql        149 Mar  7 08:57 mysql-bin.000113
-rw-r-----  1 mysql mysql        125 Mar  7 08:57 mysql-bin.000114
省略了后面的。



论坛徽章:
0
14 [报告]
发表于 2012-03-07 20:00 |只看该作者
代码 + 手动添加注解汉字,打印出来 的是英语(说明:因为我的测试环境不支持汉字,要不迟点又有兄弟说我不洋不土了,呵呵)



-bash-3.00$ vi binlogBackUp.py

#!/usr/bin/env python

import os
import time
import datetime
import MySQLdb
import re

host="localhost"#mysql server主机,我用的是localhost
user="root"#登录用户
pwd="123"#密码
backup_path="/var/lib/mysql" #你binlog备份的目录,最后为是此目录 + binlogBackup+%Y-%m-%d_%H:%M:%S
#例如:/var/lib/mysql/binlogBackup/2012-03-07_08:56:39



def backup_mysql(host,user,pwd,path):#备份函数

        mydb=MySQLdb.connect(host,user,pwd)#连接mysql
        myCon=mydb.cursor()
        myCon.execute('show variables where Variable_name= "datadir";')
        datadir=myCon.fetchall()[0][1]
        print "The MySQL server datadir is:" + datadir#取得数据目录,也就是binlog的目录
        myCon.execute('flush logs;')#fush bin log
        myCon.execute('show master status;')
        current_log_name=(myCon.fetchall())[0][0]
        print "The lastest binlog is :" + current_log_name#取得新生成的那个binlog,后面不用备份
        myCon.close()#关闭连接


        binlog_re = re.compile(".*\d\d\d\d\d\d$")#定义适合binlog的正则,以6个数字结尾的(这个应该是通过 的,没有具体考证,如果不是,可以从my.cnf里的log-bin的值来获取)
        cpString=""#用于拼接所有要copy的binlog, 除了最新的那个,当然你说的只要当天的,也可以,后面空了再写个,
        os.chdir(datadir)#cd到数据目录下,这样方便拼接串
        for file in os.listdir(datadir):#取得数据目录下的所有文件列表,(不递归的,所以处理很快)
                if(binlog_re.match(file)!=None and file != current_log_name):#和前面定义的binlog正则匹配的,并且最新的那个binlog除外
                        cpString = cpString + " " + file #这里开始接了
        #print "The binlog list is:" + cpString #debug之用

        binlog_back_dir=path +os.sep+"binlogBackup"+ os.sep + time.strftime('%Y-%m-%d_%H:%M:%S')#构造保存binlog的目标目录
        if not os.path.exists(binlog_back_dir):#判断是否存在此目录,不存则创建
                os.makedirs(binlog_back_dir)

        cmd_binlog_cp = "cp %s %s"%(cpString,binlog_back_dir)  #构造cp的命令了
        if(os.system(cmd_binlog_cp)==0):#执行命令
                print "binlog backup successfully, please check this in:" + binlog_back_dir
        else:
                print "binlog backup failed!"

def main():
        start_Time = datetime.datetime.now()#以得开始备份时的时间值
        backup_mysql(host,user,pwd,backup_path)#调用备份函数
        end_Time = datetime.datetime.now()#取得结束时间值
        seconds = (end_Time - start_Time).seconds#总共耗时多少秒
        print "It take " + str(seconds) + " seconds!"

if __name__=="__main__":
        main()#执行


~

论坛徽章:
0
15 [报告]
发表于 2012-03-07 20:06 |只看该作者
脚本simple,
python2.4
默认安装应该都可以。

binlogBackUp.zip

865 Bytes, 下载次数: 36

评分

参与人数 1信誉积分 +1 收起 理由
ruochen + 1 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP