MySQL备份恢复

备份重要性

  • 重要性
    • 备份是DBA的救命稻草
    • 没有备份,就没有复活的机会
    • 备份也可以让数据回档到某一时刻
  • 误区
    • 备份占用太多的资源,也不能促进生产
    • 可以考虑利用备份恢复生产,提高应用的可用性
    • 备份就可以随便找个地方丢,丢了也无所谓

备份场景

  • 功能开发环境
    • 配置类型库
  • 测试环境
    • 性能监控相关的数据
  • 生产环境
    • 几乎全备

mysqldump

  • 重要命令
    • mysqldump --master-data=2 --single-transaction -A > db-`data+%Y%M%d`.sql
    • 命名规则:dbname-port-日期.sql
  • 重要参数
    • order-by-primary MyISAM>InnoDB
    • opt 默认带的一个参数
    • dump-slave 从库上dump数据
    • set-gtid-purged=OFF|ON|AUTO
  • mysqldump支持where条件导出
    • mysqldump --where='1=1 limit 10000' dbname > dbname_1w.sql

select outfile + awk

  • select id,col1 from zst01.tb1 where id < 1000 into outfile '/tmp/zst01_tb1.sql';
  • update zst01.tb1 set col1='abc' where id <1000;
  • cat /tmp/zst01_tb1.sql|awk '{print "update zst01.tb1 set col1="$2," where id="$1";"}'>roll_zst01_tb1.sql
  • mysql zst01<roll_zst01_tb1.sql
  • 5.5,5.6,5.7版本并且binlog是row格式可以使用binlog2sql命令还原

mysqldump,mysqlpump原理

  1. flush tables; #可以拿到metadata lock
  2. flush tables with read lock; #整个实例只读
  3. set session transaction isolation repeatable read; #可重复读
  4. start transaction /*!40100 with consistent snapshot */; #开启事务快照,/*!NNNNN */的意思是大于NNN版本的才生效中间的语句,否则不生效
  5. show @@global.gtid_executed;
  6. show master status;
  7. dump non-InnoDB tables,首先导出非事务引擎表
  8. unlock tables;
  9. show databases;
  10. show create database if not exists 'dbname';
  11. savepoint sp; #还原点,特殊语法,如果下面东西出错可以回到这个点上
  12. show table status like 'tb_xx';
  13. set session character_set_results='binary'; #以二进制格式存储表结构
  14. show create table 'tb_xx';
  15. set session character_set_results='utf8'; #以utf8格式备份表数据
  16. select /*!40100 SQL_NO_CACHE */ * from tb_xx;
  17. rollback to savepoint sp; #回到断点处,备份下一张表
  18. ...
  19. 最后是:rollback to savepoint sp; RELEASE SAVEPOINT sp #释放断点

mydumper

  • 特性
    • 并行,高性能的MySQL逻辑导出导入工具
    • 非常方便管理导出的文件(文件拆分成单表储存,metadata信息)
    • 导入时支持正则表达式
  • 实现过程
    • 主线程flush tables with read lock,施加全局只读锁,以阻止DML语句写入,保证数据的一致性
    • 读取当前时间点的二进制日志文件名和日志写入的位置并记录在metadata文件中,义工即使点恢复使用
    • N个(线程数可以指定,默认是4)dump线程start transaction with consistent snapshot;开启读一致的事务
    • dump non-InnoDB tables,首先导出非事务引擎表
    • 主线程unlock tables非事务引擎备份完后,释放全局只读锁
    • dump InnoDB tables;基于事务导出InnoDB表 #这个地方之前也有一个savepoint sp,和mysqldump一样
    • 事务结束

如何从一个mysqldump文件中提取其中一个表

  • sed -n -e '/CREATE TABLE.*`tb_name`,/UNLOCK_TABLES/p' db_bak.sql > tb_name.sql
  • 还有其他方法吗
  • 可以用权限管理
  • grant all privileges on db.tb1 to 'hetan'@'127.0.0.1' identified by 'hetan';
  • mysql -f -h127.0.0.1 -uhetan -p db<db_bak.sql
  • 这样就只恢复tb1这张表,而不会恢复别的表,因为这个用户只有tb1的权限,恢复时要加-f,强制执行,跳过报错

InnoDB Crash Recovery

innobase crash recovery

crash

innodb-plugin fast crash recovery

  • LSN :Log Sequence Number
    • 日志的唯一编号
    • 在物理日志文件中存储位置(byte)
    • Log sequence number:当前最新的LSN
    • Log flushed up to :已经写入Redo中的LSN
    • Pages flushed up to:buffer pool中获得脏页上的最小的LSN
    • Last checkpoint at :数据文件中持久化到的LSN
  • show engine innodb status\G
LOG
---
Log sequence number 2565545
Log flushed up to   2565545
Pages flushed up to 2565545
Last checkpoint at  2565536
0 pending log flushes, 0 pending chkp writes
10 log i/o's done, 0.00 log i/o's/second
  • 测试redo文件定义是不是够一个小时使用
    • pager grep sequence
    • show engine innodb status\G #lsn1
    • select sleep(60);
    • show engine innodb status\G #lsn2
    • select (lsn2-lsn1)/1024/1024*60 as MB_per_hour;

xtrabackup

  • 安装
    • 下载rpm包,yum install 安装

xtrabackup备份

  • 全备
    • 大于2.3版本innobackupex是xtrabackup软连接
    • innobackupex --defaults-file=/data/mysql/mysql3306/my3306.cnf -S /tmp/mysql.sock -uroot -pmysql /data/backup/
    • xtrabackup --defaults-file=/data/mysql/mysql3306/my3306.cnf --backup S /tmp/mysql.sock -uroot -pmysql --target-dir=/data/backup/
  • 特别注意
    • 备份时要加上配置文件,不加配置文件备份的就是默认的实例,也就是/etc/my.cnf的实例的数据库,所以要加上--defaults-file参数
  • 恢复
    • innobackupex --apply-log /data/backup/2017-06-04_11-45-43/ #指定redo应用完毕,之后再恢复
    • 需要恢复的MySQL需要关闭
    • datadir清空
    • 手工将apply的文件copy过去,或是innobackupex --defaults-file=/data/mysql/mysql3306/my3306.cnf --copy-back /data/backup/2017-06-04_11-45-43/
    • 更改copy过去的权限
    • 启动MySQL

xtrabackup实现原理

  • xtrabackup_log就是复制的redo_log,在备份文件中是xtrabackup_logfile,redo的复制起点就是last checkpoint at的值,就是show engine innodb status中的值
  • xtrabackup_binlog_info的值是show master status产生的
  • xtrabackup_binlog_pos_innodb的值是xtrabackup_logfile中的,也就是binlog最后写回到redo中的binlog文件名和position,也可以理解为事务最后一次提交的位置

xtrabackup增量原理

  • xtrabackup_info文件中有个值innodb_to_lsn,在ibd文件中只复制比这个值大的page
  • ibdata1全拷贝
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容

  • 文/Bruce.Liu1 文章大纲备份概念1.1. 备份目的1.2. 备份方式1.3. 备份类型1.4. 备份对象...
    BruceLiu1阅读 3,903评论 4 15
  • 4种备份恢复的方式 mysqldump mysqlbackup mysqlhotcopy xtrabackup/i...
    JaeGwen阅读 4,199评论 1 2
  • 在编写shell脚本的时候,可能会遇到操作mysql数据库的情况。下面介绍如何在shell脚本中操作mysql数据...
    ifcoder阅读 2,575评论 0 2
  • 作/译者:叶金荣(imysql#imysql.com>),来源:http://imysql.com,欢迎转载。 日...
    InitialX阅读 576评论 0 1
  • mysqldump备份数据库 备份单个 备份压缩 带创建数据库语句进行备份 多个库进行备份 备份 备份events...
    Godtoy阅读 522评论 0 0