1. msyqldump -u用户名 -p密码 数据库名字 表名字 -A -R -E --triggers --master-data=2 --single-transaction > /backup/full.sql
  2. mysql -u用户名 -p密码
  3. use 数据库
  4. source /backup/full.sql

备份周期:根据数据量

备份工具

  1. mysqldump
  2. XBK(percona Xtrabackup)
  3. MEBmysql enterprise backup meb

备份方式

  1. 全量:mysqldump
  2. 增量:binlog (flush logs , cp)
  3. 物理备份:XBK(全量,增量但增量一般自己弄)

备份类型

  1. 热备:对于业务影响最小 innodb
  2. 温备:长时间锁表备份 myisam
  3. 冷备:业务关闭情况下备份

逻辑备份 MySQL dump

连接数据库

  1. -u -p -S -h -P

基础备份参数

  1. -A 全库备份
  2. [root@localhost ~]# mysqldump -uroot -p123 -A > /backup/full.sql
  3. -B 指定库
  4. [root@localhost backup]# mysqldump -uroot -p123 -B mysql sys > /backup/db.sql
  5. 库和表
  6. [root@localhost backup]# mysqldump -uroot -p123 mysql user plugin > /backup/tab.sql

特殊备份参数

  1. -R 存储过程和函数
  2. -E 事件
  3. --triggers 触发器
  4. --master-data=2 记录二进制日志截取的起点,自动锁表备份
  5. --single-transaction 锁表
  6. 不加这个参数就是温备份
  7. 加了的话,对于innodb表不锁表备份(快照备份)

扩展参数

  1. 控制备份时传输数据包的大小
  2. --max_allowed_packet=128M

从mysqldump 全备中获取库和表的备份

  1. 1、获得表结构
  2. # sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q' full.sql>createtable.sql
  3. 2、获得INSERT INTO 语句,用于数据的恢复
  4. # grep -i 'INSERT INTO `city`' full.sqll >data.sql &
  5. 3.获取单库的备份
  6. # sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql

物理备份 XBK(xtrabackup)

1、对于非Innodb表,锁表cp数据文件,属于一种温备份。
2、对于Innodb的表(支持事务的),不锁表,拷贝数据页,最终以数据文件的方式保存下来,把一部分redo和undo一并备走,属于热备方式。

3、在恢复时,模拟innodb自动故障恢复(CSR)过程,将redo(前滚)和undo(后滚)进行应用,将数据和 redo的 lsn追平,然后进行一致性恢复

下载安装

  1. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  2. yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
  3. wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
  4. yum -y install percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
  5. 手动地址:
  6. https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

备份产生的文件介绍

  1. 记录备份时刻的二进制日志信息
  2. xtrabackup_binlog_info
  3. xtrabackup_checkpoints
  4. from 备份中包含的lsn号的起点,全备时0,增量时上次备份的结束位置
  5. to ckpt 时的lsn
  6. last-9 备份结束时的lsn,下次增量备份的起始位置

备份的过程

  1. 1、非innodb表,进行短暂锁表,然后copy数据文件
  2. 2innodb表,立即发checkpoint,会立即记录一个lsncopy数据文件
  3. 3、备份过程中产生的redo进行截取和保存,并记录此时最新的lsn

恢复的过程

  1. 模拟了CSR的全过程,在恢复之前,将数据的lsnredo lsn号追平
  2. 恢复的方法就是直接cp回去

XBK 全备和恢复

  1. 全备:
  2. innobackupex --user=root --password=123 --no-timestamp /backup/full
  3. 恢复:
  4. innobackupex --apply-log /backup/full
  5. cp -a /backup/full/* /data/mysql/data/
  6. chown -R mysql.mysql /data/
  7. /etc/init.d/mysqld start

XBK 增量备份

  1. 背景:mysql数据库,数据量500G,每日更新20-30Mcp时间2个小时)
  2. 备份策略:XBK备份,每周日2300全备,周一到周六2300增量备份
  3. 故障场景:周三下午2点出现数据库崩溃损坏
  1. #清空备份路径
  2. rm -rf /backup/*
  3. #模拟数据
  4. create database full charset utf8mb4;
  5. use full;
  6. create table t1(id int);
  7. insert into t1 values(1),(2),(3);
  8. commit;
  9. #进行周日全备
  10. innobackupex --user=root --password=123 --no-timestamp /backup/full
  11. #模拟周一数据变化
  12. create database date1 charset utf8mb4;
  13. use date1;
  14. create table t1(id int);
  15. insert into t1 values(1),(2),(3);
  16. commit;
  17. #进行周一的增量备份
  18. innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/date1
  19. 说明:
  20. --incremental 开关
  21. --incremental-basedir=/backup/full 基于哪个备份进行增量
  22. /backup/full2 增量备份的位置
  23. #检查增量备份的lsn
  24. 增量的from_lsn 等于全量的last_lsn值-9
  25. #模拟周二的数据变化
  26. create database date2 charset utf8mb4;
  27. use date2;
  28. create table t1(id int);
  29. insert into t1 values(1),(2),(3);
  30. commit;
  31. #进行周二的增量备份
  32. innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/date1 /backup/date2
  33. #模拟周三的数据变化
  34. create database date3 charset utf8mb4;
  35. use date3;
  36. create table t1(id int);
  37. insert into t1 values(1),(2),(3);
  38. commit;
  39. #模拟上午10点数据库崩溃
  40. pkill mysqld
  41. rm -rf /data/mysql/data/*
  42. ======================================================================================
  43. #恢复思路
  44. 1、停业务,挂维护页
  45. 2、查找可用备份,找最近的全备+增量(full+date1+date2)
  46. 3、binlog:date2 到故障时间点的binlog
  47. 4、恢复全备+增量+binlog
  48. 5、验证数据
  49. 6、起业务,撤维护页
  50. #恢复过程
  51. 1、备份文件处理(合并date1 到full,合并date2 到full,整理full)
  52. innobackupex --apply-log --redo-only /backup/full
  53. --redo-only在整理全备和所有增量合并时用,除了最后一次增量
  54. innobackupex --apply-log --redo-only --incremental-dir=backup/date1 /backup/full
  55. innobackupex --apply-log --incremental-dir=/backup/date2 /backup/full
  56. innobackupex --apply-log /backup/full
  57. 2、截取binlog二进制日志
  58. #找到binlog起点
  59. cat /backup/date2/xtrabackup_binlog_info
  60. #找到binlog终点(mysql-bin的文件名在起点的文件里)
  61. mysqlbinlog /data/binlog/mysql-bin.000031 | grep "SET"
  62. #截取(其中gtid的起点是上面查看binlog起点中gitd的结束点+1)
  63. mysqlbinlog --skip-gtids --include-gtids='e16db3fd-a6e8-11e9-ae9-000c294a1b3b:10-12' /data/binlog/mysql-bin.000031 > /backup/binlog.sql
  64. 3、恢复备份
  65. cp -a /backup/full/* /data/mysql/data/
  66. chown -R mysql.mysql /data/
  67. /etc/init.d/mysqld start
  68. mysql -uroot -p123
  69. mysql> set sql_log_bin=0;
  70. mysql> source /backup/binlog.sql;
  71. 4、验证数据
  72. select * from date2.t1;

恢复案例

1、MySQL dump+binlog恢复

  1. 背景:mysql-5.7.26数据库,数据量50G,日增长量1-5M
  2. 备份策略:每天23:00,计划任务全量备份
  3. 故障时间:周三下午3:10误删数据库
  4. 思路:
  5. 1、停业务,挂维护页,避免二次伤害
  6. 2、找一个临时库,恢复到周二的全量备份
  7. 3、截取全量备份的binlog起点到周三下午3:10binlog终点,恢复到临时库
  8. 4、测试可用性和完整性
  9. 5、将误删除的表导出恢复到生产,或者直接临时库顶替生产库
  10. 6、开启业务
  11. 结果:经过30分钟处理,最终业务恢复正常
  1. --准备数据
  2. create database backup;
  3. use backup
  4. create table t1 (id int);
  5. insert into t1 values (1),(2),(3);
  6. commit;
  7. --清空备份文件夹
  8. rm -rf /backup/*
  9. --模拟全备
  10. mysqldump -uroot -p123 -A -R -E --triggers --master-data=2 --single-transaction | gzip > /backup/full_$(data +%F).sql.gz
  11. --模拟备份后数据发生了变动
  12. use backup
  13. insert into t1 values (11),(22),(33);
  14. commit;
  15. create table t2 (id int);
  16. insert into t2 values (22),(33),(44);
  17. commit;
  18. --模拟删库(生产勿用)
  19. drop database backup;
  20. ============================================================================
  21. --准备新的临时库
  22. --截取二进制日志
  23. 找到备份sql文件中binlog起点(一般在前几行)
  24. -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=2134;
  25. 主库查询binlog文件的结束位置
  26. show binlog events in 'mysql-bin.000002';
  27. 截取二进制日志(日志中写了gtid的话,截取的话一定要跟上--skip-gtids)
  28. mysqlbinlog --skip-gtids --start-position=2134 --stop-position=2856 mysql-bin.000002 > /backup/bin.sql
  29. --数据恢复到临时库
  30. mysql -S /data/3307/mysql.sock
  31. set sql_log_bin=0;
  32. source /backup/full.sql
  33. source /backup/bin.sql
  34. ============================================================================
  35. --将故障表导出并恢复到生产
  36. mysqldump -S /data/3307/mysql.sock -B backup > /backup/bak.sql
  37. mysql -uroot -p 123
  38. set sql_log_bin=0;
  39. use backup;
  40. source /backup/bak.sql

2、MySQL XBK 单表恢复

  1. 背景:mysql数据库,数据量500G,每日更新20-30M
  2. 备份策略:XBK备份,每周日2300全备,周一到周六2300增量备份
  3. 故障场景:周三上午10点出现误删一张10M的表
  1. #清空备份路径
  2. rm -rf /backup/*
  3. #模拟数据
  4. create database full charset utf8mb4;
  5. use full;
  6. create table t1(id int);
  7. insert into t1 values(1),(2),(3);
  8. commit;
  9. #进行周日全备
  10. innobackupex --user=root --password=123 --no-timestamp /backup/full
  11. #模拟周一数据变化
  12. create database date1 charset utf8mb4;
  13. use date1;
  14. create table t1(id int);
  15. insert into t1 values(1),(2),(3);
  16. commit;
  17. #进行周一的增量备份
  18. innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/date1
  19. 说明:
  20. --incremental 开关
  21. --incremental-basedir=/backup/full 基于哪个备份进行增量
  22. /backup/full2 增量备份的位置
  23. #检查增量备份的lsn
  24. 增量的from_lsn 等于全量的last_lsn值-9
  25. #模拟周二的数据变化
  26. create database date2 charset utf8mb4;
  27. use date2;
  28. create table t1(id int);
  29. insert into t1 values(1),(2),(3);
  30. commit;
  31. #进行周二的增量备份
  32. innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/date1 /backup/date2
  33. #模拟周三的数据变化
  34. create database date3 charset utf8mb4;
  35. use date3;
  36. create table t1(id int);
  37. insert into t1 values(1),(2),(3);
  38. commit;
  39. #模拟上午10点删除数据库表
  40. drop table city;
  41. ======================================================================================
  42. #恢复过程
  43. 1、备份文件处理(合并date1 到full,合并date2 到full,整理full)
  44. innobackupex --apply-log --redo-only /backup/full
  45. --redo-only在整理全备和所有增量合并时用,除了最后一次增量
  46. innobackupex --apply-log --redo-only --incremental-dir=backup/date1 /backup/full
  47. innobackupex --apply-log --incremental-dir=/backup/date2 /backup/full
  48. innobackupex --apply-log /backup/full
  49. 2、截取binlog二进制日志
  50. #找到binlog起点
  51. cat /backup/date2/xtrabackup_binlog_info
  52. #找到binlog终点(mysql-bin的文件名在起点的文件里)
  53. mysqlbinlog /data/binlog/mysql-bin.000031 | grep "SET"
  54. #截取(其中gtid的起点是上面查看binlog起点中gitd的结束点+1)
  55. mysqlbinlog --skip-gtids --include-gtids='e16db3fd-a6e8-11e9-ae9-000c294a1b3b:10-12' /data/binlog/mysql-bin.000031 > /backup/binlog.sql
  56. 3、恢复备份
  57. create table city like city_bak;
  58. alter table city discard tablespace;
  59. cp /backup/full/world/city.ibd /application/mysql/data/world/
  60. chown -R mysql.mysql /application/mysql/data/world/*
  61. alter table city import tablespace;
  62. 4、验证数据
  63. select * from table.city;

3、MySQL 5.6 迁移到 5.7

  1. 5.6操作:
  2. 1、搭建5.6环境,插入数据
  3. 2、全备
  4. mysqldump -uroot -p123 -A --master-data=2 --single-transaction -R -E --triggers > /tmp/full.sql
  5. 3、移动全备文件到5.7
  6. scp /tmp/full.sql 192.168.0.57:/backup
  1. 5.7操作:
  2. 1、登录mysql重置sql_bin索引
  3. mysql> set sql_log_bin=0;
  4. 2、还原(数据过来了,版本不兼容)
  5. mysql> source /backup/full.sql;
  6. mysql> flush privileges;
  7. 3、设置数据兼容
  8. mysql_upgrade -uroot -p123 -S /data/3306/mysql.sock
  9. 4、刷新二进制binlog使其产生一份新的文件
  10. 恢复全备到flush之间的二进制binlog
  11. 5、停业物,恢复剩余的binlog
  12. 6、业务割接