mysql 备份与恢复

不念不忘少年蓝@ 2022-05-21 12:50 368阅读 0赞

Mysql备份常用方法(逻辑备份和物理备份)

逻辑备份mysqldump
  恢复时通过mysqldump命令备份的sql语句还原到mysql数据库中
  补充,增量备份备份binlog日志文件即可,恢复增量即通过mysqlbinlog工具截取binlog日志转换成sql语句,通过mysql或source进行语句还原
物理备份备份方法
  使用cp,rsync,tar,scp等工具,由于在备份期间数据依然在写数据,所以直接复制会引起数据丢失,在恢复数据库时,对新数据库的路径,配置也有要求,一般要和远程保持一致。为了确保数据一致性,可以选择人工停库或者锁库后进行。但是一般生产部允许,除非可以申请停机或锁表
物理备份两部:1、停库或锁表,打包拷贝 2、第三方xtrabackup

企业场景全量和增量的频率
1、中小公司,全量一般每天一次,业务流量低谷进行,备份时锁表
增量:定时,例如每分钟rsync推一次binlog
2、大公司,一般周备,节省备份时间,减小备份压力,缺点是binlog文件副本太多,还原比较麻烦
3、一主错从环境,主从复制本身就是实时远程备份,可以解决物理故障
4、一主多从环境,可以采取一个从库上专门进行备份,通过延时同步解决人为误操作

mysql全量备份与增量备份

按天全备























周一0点全量备份           周二0点全量备份                                          
01.sql.gz 02.sql.gz
周一增量备份 周二增量备份
mysql-bin.00025
mysql-bin.00026
……….
mysql-bin.index
mysql-bin.00035
mysql-bin.00036
…………..
 mysql-bin.index

优点:恢复时间短,维护成本低

缺点:暂用时间多,暂用系统资源多,经常锁表影响客户体验

按周全备

























        周六0点全量备份                 
周一增量备份 周二增量数据 周三增量数据 周四增量数据
mysql-bin.00025
mysql-bin.00026
mysql-bin.00027
………..
 mysql-bin.index
mysql-bin.00035
mysql-bin.00036
mysql-bin.00037
………….
mysql-bin.index
mysql-bin.00040
mysql-bin.00041
mysql-bin.00042
…………..
mysql-bin.index
mysql-bin.00050
mysql-bin.00051
mysql-bin.00052
…………..
mysql-bin.index

 优点:暂用空间小,暂用系统资源少,无需锁表或次数少,用户体验好些
缺点:维护成本高,恢复麻烦,时间长

MySql的备份命令

  myisam引擎
    #mysqldump -uroot -pxxx -A -B -F —master-data=2 -x —events >/opt/name.sql.gz
   innodb引擎
    #mysqldump -uroot -pxxx -A -B -F —master-data=2 —events —single-transaction | gzip>/opt/name.sql.gz

复制代码

  1. --master-data
  2.   这个参数在建立slave数据库的时候会用到,当这个参数的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是fileposition的记录,fileposition记录的位置就是slavemaster端复制文件的起始位置。默认情况下这个值是1
  3.   当这个值是2的时候,chang master to也是会写到dump文件里面去的,但是不会有上面那个作用了
  4. --master-data=1 (--master-data=2注释)
  5.   表示在dump过程中记录主库的binlogpos点,并在dump文件中不注释掉这一行,即恢复时会执行;
  6. -F   切割binlog参数
  7. -A   备份所有库 
  8. -B, --databases
  9.   备份数据时使用-B参数,会在备份数据中增加建库及use库的语句
  10.   使用-B参数,后面可以接多个库,否则只能有一个库,之后的都被认为是表
  11. --single-transaction 适合innodb事务数据库备份(可代替锁表)
  12.   设置事务的隔离级别为可重复读,即REPEATABLE READ,这样能保证在一个事务中所有相同的查询读取到同样的数据,也就大概保证了在dump期间,如果其他innodb引擎的线程修改了表的数据并提交,对该dump线程的数据并无影响. InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到其他会话已经提交了的数据。
  13. -x,--lock-all-tables Locks all tables across all databases. This is achieved by taking a global read lock for the duration of thewhole dump. Automatically turns --single-transaction and --lock-tables off.
  14. -l, --lock-tables Lock all tables for read.
  15. mysql其他常用参数
  16. --default-character-set=latin1 指定字符集(一般不用)
  17. -d  只备份表结构
  18. -t  只备份数据
  19. -T,--tab  分离表和数据,数据是文本
  20. -R  备份存储过程
  21. -q  Don't buffer query, dump directly to stdout.(Defaults to on; use --skip-quick to disable.)

复制代码

锁表备份

  1. 1mysql> flush table with read lock; 锁表 (窗口不能退出,不然失效)
  2. 2、新开窗口进行导出备份(如果数据量大,且允许停机,就使用停机打包,而不用dump
  3.   #mysqldump -uroot -pxxx --events -A -B --master-data=2| gzip >/opt/bak_$(date +%F).sql.gz
  4. 3mysql> unlock tables;  解锁

数据库表的备份

  1. # mysqldump -uroot -pxxx databasename table1 table2 table3 >/opt/table.sql

案例:多个库和多个表备份到一起了,如何恢复单个库或表

  1、将备份导入测试库,然后把需要的备份出来,恢复到正式库
 2、 单表:grep tablename bak.sql> name.sql
  单库:循环过滤库里所有表
  3、 事先分库分表备份 

分库备份命令

  1. #mysql -uroot -prootabcd -e "show databases;" | grep -Evi "Database|information_schema|performance_schema" | sed -r 's#(.*)#mysqldump -uroot -prootabcd --events -B \1 |gzip >/tmp/\1.sql.gz#g'| bash

分库备份脚本

复制代码

  1. #!/bin/sh
  2. MYUSER=root
  3. MYPASS=rootabcd
  4. [ ! -d /server/backup/ ] && mkdir -p /server/backup -p
  5. MYCMD="mysql -u$USER -p$MYPASS"
  6. MYDUMP="mysqldump -u$MYUSER -p$MYPASS -B "
  7. for database in `$MYCMD -e "show databases;" | grep -Evi "Database|information_schema|performance_schema|mysql"`
  8. do
  9. $MYDUMP $database | gzip> /server/backup/${database}_$(date +%F).sql.gz
  10. done

复制代码

复制代码

  1. ==============================================================================
  2. 数据库优化
  3. 1insert批量插入
  4. 2、不要用*,列出查询列,指定范围
  5. select id,name from test
  6. select id,name from test limit 2;
  7. select id,name from test where id=1;
  8. select id,name from test where name="oldgirl"; 字符串查询带引号
  9. select id,name from test where name="oldgirl" or id=5;
  10. select id,name from test where id>2 and id<4;
  11. select SQL_NO_CACHE id,name from test where id>2 and id<4; 不查缓存
  12. 排序(order by的列也可以考虑建索引)
  13. select id,name from test order by id asc;
  14. select id,name from test order by id desc; 逆序
  15. 刷新binlog参数(logbin文件生效参数log-bin
  16. binlog日志生成,每次重启和-F参数重新生成,以及超过1.1G后重新生成
  17. mysqldump用于对某一时刻的数据全备,例如在0点进行备份bak.sql.gz
  18. 增量备份:当有数据写入到数据库时,还会同时把更新的sql语句写入到对应文件里,即binlog文件
  19. 10点丢失数据需要恢复,处理方法如下:
  20. a、将0点时刻的备份bak.sql.gz数据还原,即数据库数据截至时间为00
  21. b0点到10点的数据,从binlog里恢复
  22. 知识技巧
  23. binlog日志切割(即刷新binlog)确定全备和增量备份的临界点。备份时候加-F(--flush-logs)参数,刷新binlog,生成新文件,将来增量恢复从这个文件开始
  24. [root@test85 3306]# mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -F -d oldboy student >t2.sql
  25. 然后记录下ls binlog位置(发到邮箱或写到log),恢复时从新刷新的binlog中提取数据
  26. 利用source命令恢复数据库(用的不多)
  27. 1、登陆数据库
  28. 2mysql>use oldboy
  29. 3、使用source命令,后面接脚本文件mysql>source oldboy_db.sql 给文件系统路径,默认是登陆mysql前的文件系统路径。(注意编码 utf8无签名)
  30. 利用mysql命令恢复数据库[配置文件中有mysqldump参数模块可以设置]
  31. [mysqldump]
  32. quick
  33. max_allowed_packet = 8M
  34. 1、指定库恢复
  35. #mysql -uroot -poldboy123 -S /data/3306/mysql.sock oldboy<1.sql (备份oldboy库的时候如果加了-B,这边都不用加库名了)
  36. 针对压缩的备份数据恢复
  37. 方法一(建议此种)
  38. gzip -d /opt/mysql_bak.sql.gz
  39. mysql -uroot -prootabcd < /opt/mysql_bak.sql
  40. 方法二
  41. gunzip< mysql_bak.sql.gz >/opt/ mysql_bak.sql
  42. mysql -uroot -pxxx < /opt/mysql_bak.sql
  43. 或者
  44. gunzip <mysql_bak.sql.gz | mysql -uroot -pxxx
  45. mysqlbinlog工具解析binlog日志实践
  46. 1、解析指定库的binlog日志,利用-d参数指定库
  47. 平时插入数据记录时,先use insert。如果是insert into database.table values就不行
  48. [root@test85 3306]# mysqlbinlog -d oldboy mysql-bin.000001 |egrep -v "^#|--|^$|\*"
  49. mysqlbinlog截取位置
  50. mysqlbinlog mysqlbin.000020 --start-position=365 --stop-position=456 -r pos.sql -r 输出到文件
  51. 用时间不精确
  52. mysqlbinlog mysqlbin.000020 --start-datetime='2014-10-16 15:44' --stop-datetime=='2014-10-17 15:44' -r time.sql
  53. (测试中发现时间及位置均不包括结束点)
  54. mysqlbinlog命令--解析binlog日志为sql语句
  55. -d参数根据指定库拆分binlog(单表根据关键字过滤)
  56. --start-datetime=name --stop-datetime=name
  57. --start-position=# --stop-position=#
  58. -r, --result-file=name 相当于重定向
  59. 解析row语句:mysqlbinlog --base64-output=“decode-rows --verbose mysql-bin.000001
  60. binlog的删除
  61. mysql>reset master binlog全部干掉
  62. mysql>purge master logs to 'mysql-bin.00004'删除之前的日志 (不包括0004)
  63. # grep expire /data/3306/my.cnf 配置文件自动删
  64. expire_logs_days = 7 自动删除7天前的备份
  65. 以上很类似mysql innodb引擎的--single-transaction备份策略
  66. mysql备份方案
  67. 如果是单机备份环境,如果大于1台服务器一定要做主从复制
  68. 1、主从本身就是备份,而且是实时备份。主从同步的功能本身就是解决物理故障宕机的实时备份方案。缺点:不能防止逻辑故障数据丢失
  69. 选择从库备份
  70. 1)选择一个不对外提供业务的从库做备份
  71. 2)开启binlog
  72. 3)备份时可以锁表也可以停止sql_thread, 不停io_thread,即暂停应用sql。备份期间,如果主库挂了,那么,从库备份加上备份后的binlog就是完整的主库内容。
  73. 4)数据量小于50Gmysqldump足够,如果数据量大于50Gxtrabackup物理工具。或者从库停止sql_thread,cp或打包的方案(还原主库----biglog-----停thread的那个点到打开)
  74. 515从,3从对外LVS集群提供服务,1个从定时任务,开发,后台用,最后一个啥也不干,最大限度保持和主一致(还原时,删除中继日志,其他change master 切换为主库)
  75. mysql增量恢复条件
  76. 1、开启了log-bin日志功能(主从库都需开启了)(位置点)
  77. 至少存在全备加上全备之后的时刻到出问题时刻的所有增量binlog文件
  78. 2、存在mysql数据库全备

复制代码

发表评论

表情:
评论列表 (有 0 条评论,368人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql备份恢复

    份与恢复 根据备份的方法不同可以将备份分为: Hot Backup:热备,数据库运行中直接备份,对正在运行的数据库操作没有任何影响。 Cold Backup:...

    相关 mysql备份恢复

    mysql数据库备份与恢复 一、为什么要备份 灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景 备份注意要点

    相关 mysql 备份恢复

    系统运行中,增量备份与整体备份 例:每周日备份一次,周一到周六备份当天 如果周五出了问题,可以用周日的整体+周一,二,三,四来恢复 备份工具: 有第

    相关 MySQL备份恢复

    1、备份的类型 冷备份:关闭数据、停止业务 温备份:加锁备份 热备份:在线备份,不会影响到也正常运行 2、备份方式 逻辑备份:基于SQL语句的备份 (1)

    相关 mysql备份恢复

    备份的重要性: 灾难恢复,测试应用,回滚数据修改,查询历史数据,审计等 造成数据丢失的原因有以下几种:程序错误,人为操作错误,运算错误,磁盘故障,灾难和盗窃 数据库的备