分享一下我这几年在MySQL数据备份方面的一些经验。数据是互联网公司的命脉,数据库的安全和记录的完整性至关重要,所以我们在工作中需要精通数据的备份和恢复,这也是一个合格的运维DBA的必备条件专业技能。这里我简单总结一下,MySQL的备份分为冷备份、逻辑备份、热备份三种。1、冷备份:一般主要用于非核心业务。这类业务一般允许中断业务。冷备份的特点是数据快,恢复最容易。通常直接复制物理文件来实现冷备份。1.1备份过程:***关闭mysql服务第二步将datas数据目录(包括ibdata1)和log目录(包括ib_logfile0、ib_logfile1、ib_logfile2)复制到磁盘,或者其他本地磁盘1.2恢复过程:***使用复制的数据目录和日志目录替换原来的目录。二是启动mysql2,逻辑备份mysqldump生产场景备份命令:生产场景不同引擎mysqldump备份命令myisam引擎企业生产备份命令(适用于所有引擎或混合引擎):mysqldump-uroot-p123456-A-B-F-R--master-data=2-x--events|gzip>/opt/all.sql.gz提示:-F也可以省略,和--master-data有些重复。Innodb引擎企业生产备份命令:推荐mysqldump-uroot-p123456-A-B-F-R--master-data=2--default-character-set=utf8--events--single-transaction|gzip>/opt/all.sql.gz提示:也可以使用-F。与--master-data的一些重复。--default-character-set=utf8指定备份的SQL数据的字符集为utf8。当然这个要提前知道线上的mysql库使用的字符集都是utf8,否则恢复到线上会出现字符集不一致和乱码提示的问题:逻辑备份一般用于数据迁移或者当数据量很小的时候。逻辑备份采用数据导出的方式。-transaction–A>>all.sqlexportsmultipledatabases:mysqldump–uroot–p-q–single-transaction–Btest01wjw01test02>test01_wjw01_test02.sqlexports某测试库wjw01表:Mysqldump–uroot–p-q–single-transaction–btestwjw01>>test_wjw01.sql只导出表结构:mysqldump–uroot–q–d--skip-triggers只需要导出存储过程:Mysqldump–uroot–q-Rtdn--skip-triggers只需要导出触发器:Mysqldump–uroot–p–q–tdn–triggers只需要导出事件:Mysqldump–uroot–p–q–Etdn–skip-triggers只需要导出数据:Mysqldump–uroot–p–q–skip-transaction–skip-triggers–t在线新建一个slave,在master上执行如下命令:mysqldump–uroot–p–q–single-transaction–master-data=2-A>>all.sql提示:mysql5.5新增了一个参数:--dump-slave,可以用来dumpslave端的数据,创建一个新的slave,目的是防止过度损坏slave主数据库压在slave上执行如下命令:mysqldump-uroot–p-A–dump-slave=2–q–single-transaction>/tmp/all.sql查看alls.sql会在slave上记录点。注:--dump-slave用于在slave上dump数据,新建slave2.2Mysqldump的优缺点,使用场景的优点:容易恢复,可以使用管道输入到mysql中了与存储引擎无关,因为它是从MySQL服务器提取数据生成的,所以消除底层数据存储的差异有助于避免数据损坏。如果磁盘驱动器发生故障并且您想要复制原始文件,此时您将获得损坏的备份缺点:必须有数据库服务器来执行逻辑工作,需要更多的cpu周期逻辑备份恢复速度慢:MySQL负载和解释语句、转换存储格式和重构引擎使用场景:数据量不是很大的场景推荐使用MySQL数据库。因为备份方便,简单灵活,操作简单。当数据库比较特殊时,比如数据库超过30G时,建议备份MySQL数据时不要使用mysqldump,因为数据库的备份时间和恢复时间太长,数据库表会被损坏的。2.3MySQL全量备份+增量备份binlog简介注意:在生产中,强烈建议MySQL启用Row格式记录binlog,虽然这会影响磁盘IO和磁盘空间。消耗比较大,但是与数据的安全性和完整性相比,磁盘资源是微不足道的。全量备份脚本内容:#!/bin/bash#mysql全量备份脚本建议运行在从库上,从库slave建议开启参数log_slave_updates=1mkdir/backupcd/backupdateDIR=$(date+"%Y-%m-%d")mkdir-p$dateDIR/datapath=/data/mysql/datafornin`mysql-uroot-p123456-e"showdatabases"|grep-v"数据库"`domysqldump-uroot-p123456--default-character-set=utf8-q--lock-all-tables--flush-logs-E-R--triggers-B$n|gzip>/backup/$dateDIR/data/${n}_$dateDIR.sql.gzdonebinlog_rm=$(tail-n1$path/mysql-bin.index|sed's/.\///')mysql-uroot-p123456-e"purgebinarylogsto'$binlog_rm'"说明:这个全量备份脚本会导出时锁定全局表,此时刷新生成新的bin-log,期间会有一个写操作的等待,直到导出结束才会写入进入新生成的bin-log文件,然后旧的bin-log文件将被删除。一般在下午2:00进行手术。在业务低峰期进行本地bin-log增量备份。执行完全量备份脚本后,就可以执行增量备份脚本了。增量备份脚本的思路很简单:首先mysqladmin-uroot-p123456flush-logs刷新新的binlog文件,然后mysql写入新的binlog文件。然后把刚才生成的binlog文件从当前mysql数据库所在的binlog目录中扔掉,其他所有旧的binlog文件cp到本地服务器的备份目录/backup/binlogbinlog。***登录mysql后,清空当前binlog文件数减一mysql-uroot-p123456-e"purgebinarylogsto'mysql-bin.(n-1)'"3.热备份和热恢复的方法备份也是直接复制物理数据文件,和冷备份一样,但是热备份可以直接复制,不需要停机,一般用于7*24小时不间断的重要核心业务。Mysql社区版热备工具InnoDB热备是收费的,只能试用30天,商业版完全可??以使用。Percona发布了一款xtrabackup热备份工具,支持在线热备份(备份时不影响数据的读写),是商业工具InnoDB热备份很好的替代品。xtrabackup热备份工具是一个开源的工具,可以非常快速的备份和恢复mysql数据库。由于Xtrabackup支持备份innodb表,所以我们在实际生产环境中使用的工具是innobackupex,它是对xtrabackup的一层封装。innobackupex脚本用于备份非InnoDB表,同时会调用xtrabackup命令备份InnoDB表。innobackupex的基本流程如下:启动redolog复制线程,从最新的checkpoint开始依次复制redolog;启动idb文件复制线程,复制innodb表的数据。idb文件拷贝完成,通知调用FTWRL获取一致性点。备份非innodb表(系统表)和frm文件。由于此时没有新的事务提交,等待redologcopy完成***redologcopy完成后,说明此时的innodb表和非innodb表数据最好获取binlog位置,此时数据库的状态是一致的。锁被释放,备份结束。具体使用方法可以参考:https://www.linuxidc.com/Linux/2018-08/153635.htm这里介绍MySQL数据库的备份方案。如有错误请及时指出。欢迎大家一起交流学习。Linux公社RSS地址:https://www.linuxidc.com/rssFeed.aspx本文***更新链接地址:https://www.linuxidc.com/Linux/2018-08/153634.htm
