作者介绍 庞阔,优朋普乐传媒运维基础部经理。负责数据库运营管理及平台设计开发,监控设计改进,问题跟踪处理,机房网络维护管理,目前四个专利已在专利局申请中。擅长数据库运维管理及Shell、Perl、PHP编写。 最近关于数据库故障出现的问题较多,不论大小公司对数据的备份要求都很高,但对校验数据备份的有效性要求更为迫切,很多公司对于自动备份和还原都已经形成体系,但对于还原后的备份有效性校验可能都不太完善,而且目前网上也没有较为完善的检验机制(可能我没找到)。 对数据库备份的有效性校验的方法或样例选择,直接关系到备份数据的质量指标。本文将分享我做的一个设计,此设计是直接采用线上执行的SQL提取出select,包括复杂join类型的SQL加上当前存在的库及表信息,提高了备份校验的准确性。 这是我在申请数据库相关专利时推演出来的方案,在寻找一个好的校验备份还原后的数据衡量指标,偶然地和备份还原进行结合时出现了这个设计。当数据库实例越来越多时,这个有效性校验的需求会越来越强。 下面将简单介绍一下我的校验数据的设计方案,或许它能给你一个思路或想法,当然我也希望能有其他好的方案出来,共同学习。(注:部分信息做了脱敏处理) 程序处理流程如下: 根据上面的流程图,大致分为5个步骤,有6个脚本程序来完成这个流程,每个步骤其实不是很难,实际中可根据自己的业务特定进行完善,下面我简单介绍此流程中主要的几个功能。
注:在下面演示过程中以手动形式,可根据公司具体情况设置为自动。 数据库机器:172.16.20.5 备份机器:172.16.20.6 还原机器:172.16.20.7 备份工具:mydumper 编程语言:Shell Perl 备份传输工具:rsync 1、备份机器rsync部署 对于数据中心做备份之前采取过如下几个方案。我简单概括一下:
重要部分如下: [back5] path = /opt/mysql_bak/172.16.20.5 comment = www file ignore errors read only = false list = false uid = root gid = root 2、数据库机器和还原机器安装mydumper mydumper第三方开用于对MySQL数据库进行多线程备份和恢复的开源工具。开发人员主要来自MySQL、Facebook和SkySQL公司,目前由Percona公司开发和维护,是Percona Remote DBA项目的重要组成部分;不同于官方的mysqldump、mysqlpump的是对库表备份和还原采用多线程,对于快速备份和恢复是不错的选择;当然还有percona的xtrabackup相当于物理备份的工具,但是耗费空间较大。 安装请参考官网:https://launchpad.net/mydumper/ download 3、数据库上执行备份脚本 脚本如下: #!/bin/bash Time=$(date "%Y-%m-%d-%H") Timeago=$(date "%Y-%m-%d" --date='2 days ago') BACK_DIR=/opt/mysql_bak/$Time source /etc/profile user=voole_back pass=voole_back mkdir $BACK_DIR mysql=`/usr/bin/which mysql` mydumper=`/usr/bin/which mydumper` mysqldump=`/usr/bin/which mysqldump` l_ip=`/sbin/ifconfig |grep inet| grep -i bcast|cut -d':' -f2|awk '{print $1}'` $mydumper -u $user -p $pass --trx-consistency-only --regex '^(?!(sys|test|performance_schema))' --triggers --events --routines -o $BACK_DIR -t 10 cd /opt/mysql_bak tar -czf mydumper_$Time.tar.gz $Time file="mydumper_$Time.tar.gz" sudo rsync -zrtoapg --progress $file [email protected]::back5 4、数据中心表结构设计 在数据中心创建下面的表,这些表主要用来存储备份时上报的库表信息和SQL信息,用后续步骤还原校验时做提供样例值。
CREATE TABLE `db_table` ( `id` int(255) NOT NULL AUTO_INCREMENT, `ip` varchar(20) NOT NULL, `type` varchar(20) DEFAULT NULL, `dbname` varchar(100) DEFAULT NULL, `table` varchar(50) DEFAULT NULL, `info` varchar(255) DEFAULT NULL, `checksum` varchar(255) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `idx_db` (`dbname`), KEY `idx_table` (`table`), KEY `idx_ip_db` (`ip`,`dbname`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=63131 DEFAULT CHARSET=utf8 COMPRESSION='lz4';
CREATE TABLE `db_list_sql` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `type` varchar(255) DEFAULT NULL, `sql` text, `ip` varchar(255) DEFAULT NULL, `result` varchar(255) DEFAULT NULL, `num` int(11) NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1161970 DEFAULT CHARSET=utf8; 5、数据库机器上汇报 1)库表汇报程序地址:自行下载和修改 https://github.com/kevin6386/db_table_report/blob/master/db_table_report 运行即可。 2)SQL汇报程序 程序地址:https://github.com/kevin6386/db_sql_report/blob/master/db_sql_report 运行即可。 6、数据库备份还原 下载备份并还原(简单分解介绍): 用 rsync 下载备份到本地,并解压 rsync -zrtoapg --progress [email protected]::back5/备份文件名 ./ 恢复命令: /usr/local/bin/myloader -u user -p pass -o -d 备份地址 -t 8 7、校验 此时才是整个流程设计的重点,针对还原后的数据,怎么做校验才是重要的,而且校验的样例或方法直接关系数据备份有效性的指标。 1)还原后数据库表的校验 程序地址:https://github.com/kevin6386/db_table_diff/blob/master/db_table_diff 比较结果如下: 邮件截图 2)还原后数据SQL的校验 程序地址:https://github.com/kevin6386/db_sql_diff 比较结果如下: 邮件截图:如果正常则附件会有SQL,否则为空。 异常截图 出现异常有如下几种情况:
附件SQL信息 8、关于备份的汇报 我是汇报每天的备份大小及文件名,然后写SQL比对今天的备份和前2天的信息。 如下: 设计完这个方案后开始编写分程序花了一段时间,同时感谢我的同事帮我重复测试这个设计方案,发现之前备份还原过程中出现的问题改善了很多,重要的是不用人工去抽取还原后的数据结果。当这个方案固定后基本上很少有人工的参与,减少了人工还原备份和校验备份重复的工作;并且可以准确地知道哪部分有问题,减少了对数据库备份是否正常的担忧。当然还有很多要完善的方面,欢迎有兴趣的朋友在留言区提出建议,一起交流。 ◆ 近期热文 ◆ 声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除 |