很多人,这里是运维工程师,写某一个方案的时候很头疼。不是某个度统一搜索,或者N个群里都发同一句话:“有什么方案吗,可以分享一下吗??请各位大哥帮忙”,估计十有八九全部消失,毫无消息。其实是真的很难,还是你没有完全掌握整个备份思路的组织?一份计划书的好坏,在于外行人是否一眼就能看懂其中的意思,不需要费很多心思。一个好的备份计划包括以下几点:为什么需要备份?备份方法有哪些?某些备份方法之间有什么区别?实际备份操作概述实际恢复操作概述其他备注信息那么,本文将从以上几个角度,结合一些实际的实战经验,一步步讲解一个完整的备份方案是如何组成的。如果需要进一步了解Mysql数据库,可以在公众号:打工哥技术之路后台回复“MySQL”获取最全的MySQL数据库学习指南。为什么需要数据库备份?很多人,看到这个标题,肯定会张大嘴巴回答。这不是废话吗。没有备份失败怎么办?逃跑?沙雕开发(不喷)误删数据怎么办?你在背锅吗?当然,大家都知道备份的重要性和必要性。1.保证数据的安全性和完整性。企业的数据安全应该说是企业的命脉。一旦丢失或损坏,客户和金钱的损失可能从客户和金钱的损失到破产(有过先例)。备份的目的:确保数据在因人为错误、操作不当或故意删除或损坏后,能够及时有效地恢复,不会对业务运营造成太大影响。2、为业务提供不间断的服务。实际生产环境要求数据库具备7×24×365不间断服务的能力,这也是数据库必须备份的原因之一。数据库备份方式常用的备份方式有以下几种:逻辑备份物理备份1.逻辑备份逻辑备份其实就是使用MySQL数据库自带的mysqldump命令,或者使用第三方工具,然后将数据库中的数据dump出来以SQL语句的形式导出为文件。当需要恢复数据时,使用相关命令(如:source)将备份文件中的SQL语句提取出来,在数据库中重新执行,即可达到恢复数据的目的。示例如下:mysqldump-A-B--single-transaction>/server/backup/mysql_$(date+%F)。SQL一般在备份时压缩,以节省磁盘空间,如下mysqldump-A-B--single-transaction|gzip>/server/backup/mysql_$(date+%F).sql.gz恢复操作cd/server/backup/gzip-omysql_$(date+%F).sql.gzmysql-uroot-pMyadmin-hmysqldb.mingongge.com>source/server/backup/mysql_$(date+%F).SQL逻辑备份优势及使用场景优点:简单、易操作,配备方便可靠的工具。使用场景:数据库数据量不大的时候可以使用。当数据量比较大(超过20G左右)时,备份速度比较慢,也会在一定程度上影响数据库本身的性能。2、物理备份物理备份是使用命令(如cp、tar、scp等)直接将数据库存储的数据文件复制一份或多份,存放到其他目录中,以达到备份的效果。在这种备份方式中,由于在备份时将数据写入数据库,一定程度上可能会造成数据丢失的可能性。在进行数据恢复时,需要注意新安装的数据的目录路径、版本、配置等要与原数据高度一致,否则也会出现问题。因此这种物理备份方式往往需要在关机状态下进行,对于实际生产中的数据库来说一般是不可取的。因此,这种方式更适合数据库物理迁移,这种方式在这种场景下效率更高。物理备份的优势和使用场景:速度快,效率高。场景:可用于停机维护和数据库物理迁移场景。在实际生产环境中,具体采用哪种方式,要看需求和应用场景。全量备份和增量备份概述介绍完备份方式,我们再介绍一下增量备份和全量备份这两个概念。什么是完整备份?全量备份:是一次性备份数据库中的所有数据,或者某个库中的所有数据。备份数据库mysqldump-A-B--single-transaction|gzip>/server/backup/All_data_$(date+%F).sql.gz备份一个数据库mysqldump-A-B--单事务testDB1|gzip>/server/backup/testDB1_$(date+%F).sql.gz什么是增量备份?增量备份:指从上次全量备份到下一次全量备份期间更新或添加到数据库中的数据,即备份。注意:全量备份是一个文件,增量备份是一个MySQLbinlog日志文件。所以常说的增量备份就是备份binlog日志文件。两者有什么区别?完整备份:所需的备份时间较长,恢复时间较短,因为文件数量少,易于维护。但是,完整备份文件较大,占用一定的磁盘空间。全量备份会在一定程度上影响数据库的性能(这就是为什么要在0:00备份),而且文件体积大也不方便。服务器本地存储的文件过多,重要业务的全量备份文件可能需要手动下载或迁移到服务器以外的存储空间。增量备份:备份简单,恢复稍微复杂一点,因为文件比较多,所有的binlog文件都需要解析成SQL语句,如下:mysqlbinlogtestDB1-bin.000001testDB1-bin.000002>./bin.sql然后,通过恢复的方式是恢复mysql-uroot-pMyadmin-hmysqldb.mingongge.com>source/server/backup/bin.sql或者下面的操作cd/server/backupmysqltestDB1<./bin.sqlMysql数据库备份恢复实践操作备份一般采用脚本+定时任务的方式进行日常备份。常见的执行策略是:每天0:00进行全量备份,根据业务需要进行增量备份。分享一个我在初创公司早期的备份方案示例。阿里云数据库服务器备份解决方案。库开启binlog日志功能,用于远程备份。就目前的数据量而言,只需要在从库的基础上定期对数据库进行全量和增量备份即可。1、创建备份目录mkdir/server/backup2,将数据库备份到指定目录mysqldump--single-transaction-F-Bphoenix_coupon_production|gzip>/server/backup/phoenix_$(date+%F).sql。gzmysqldump--single-transaction-F-Bywotx|gzip>/server/backup/ywotx_$(date+%F).sql.gzfind/server/backup/-typef–name“*.sql.gz”-mtime+7|xargsrm-f将脚本写入定时任务,定时打包备份3.定时备份二进制文件通过参数生成新文件刷新binlog,通过脚本判断文件新旧,以及然后备份旧的日志文件mysqladmin-uroot-pywotx!123flush-logs#刷新日志,生成新的日志文件,最后将备份文件同步或手动下载到远程备份服务器,将备份文件存放在不同的地方位,实现数据库备份文件的双重备份存储,防止服务器硬件故障。方案二后期数据量增加后,需要数据库读写分离,实现主写、从读、主从同步的架构。解决数据量大带来的恢复时间问题,提高恢复效率。1.创建备份目录Mkdir/server/backup2。备份数据到指定目录(分库分表)#/bin/sh#mingonggeat2017-06-01BACKUPDIR=/server/backupDATE=`date+%F`USER=rootPASSWD="123456"CMD="mysql–u$USER–p$PASSWD”DUMPCMD="mysqldump–u$USER–p$PASSWD--single-transaction-F”fordbnamein`${CMD}–e"showdatabases”|sed'1d'`domkdir–p${BACKUPDIR}/${dbname}fortablenamein`${CMD}–D${dbname}–e"showtables"|sed'1d'`do${DUMPCMD}--tables${dbname}${tablename}|gzip>${BACKUPDIR}/${dbname}/${tablename}_$(DATE).sql.gzdonedonefind/server/backup/${dbname}-typef–name"*.sql.gz"-mtime+7|xargsrm-f3,二进制文件定时备份(增量)备份方法同方案1备份频率:每天0:00进行一次全库备份03:009:0015:0021:00数据库每天增量备份一次,全量备份一次,全量备份时会更新binlog日志,重新生成一个新的日志文件,所以binlog会在下次增量备份时刷新,重新生成新的日志文件,实现全量备份后数据库操作的增量备份。一旦发现数据问题,立即刷新binlog创建新的日志文件,并手动备份原日志文件,进而找出数据问题。点,从而利用日志文件恢复全量备份到数据问题点之间的数据,再将问题点的数据恢复到发现问题的时间段。新增一台备份服务器,配置如下:实例配置:2核/4G/40G+200G高效云盘经典网络1M295元/月套餐总结:对于数据库服务器的本地备份文件,基本只保留一周内的数据,备份服务器按需(一般至少保留30天)数据),保留30天的数据,包括数据库全量备份文件和增量备份文件,后期可根据实际生产需要进行修改。保留时间的长短只会增加相应的服务器磁盘空间,增加一定的成本。其他的不用改。操作更加灵活方便。如需全套备份方案,可在米工格科技之路公众号后台回复“备份”,获取全套方案下载地址。有兴趣的读者朋友可以多试试关键词:“项目、MySQL、避坑”。
