MySQL物理备份基本操作

Ⅰ、xtrabackup介绍

  • xtrabackup只能备份innodb引擎的数据,不能备份表结构,percona开源的,强烈推荐最新版本(旧版本bug多)
  • innobackupex可以备份myisam和innodb两种引擎的数据和表结构,一般用这个
  • 备份时,默认读取MySQL配置文件(datadir)

Ⅱ、xtrabackup安装使用

2.1 安装

[root@VM_0_5_centos src]# yum install perl-DBD-MySQL
不安装这个备份会报错:Failed to connect to MySQL server: DBI connect

[root@VM_0_5_centos src]# cd /usr/local/src
[root@VM_0_5_centos src]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/tarball/percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz
[root@VM_0_5_centos src]# tar zxvf percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz -C ..
添加环境变量
[root@VM_0_5_centos src]# cd ..
[root@VM_0_5_centos src]# ln -s percona-xtrabackup-2.4.7-Linux-x86_64/ xtrabackup
[root@VM_0_5_centos src]# echo "PATH=/usr/local/xtrabackup/bin:$PATH" >> /etc/profile
[root@VM_0_5_centos src]# source /etc/profile

2.2 玩一手

[root@VM_0_5_centos src]# innobackupex --compress --compress-threads=8 --stream=xbstream -S /tmp/mysql.sock --parallel=4 /data/backup > backup.xbstream
建议用-S连接,默认走socket,不用-S可能报连不上

常用参数:throttle
指定备份时用到的iops是多少,限制速度

8个压缩线程,4个备份线程

输出内容(简化)

180122 19:47:53 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

180122 19:47:53  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;mysql_socket=/tmp/mysql.sock' as 'root'  (using password: YES).
180122 19:47:53  version_check Connected to MySQL server
180122 19:47:53  version_check Executing a version check against the server...
180122 19:47:53  version_check Done.
180122 19:47:53 Connecting to MySQL server host: localhost, user: root, password: set, port: not set, socket: /tmp/mysql.sock
Using server version 5.7.20-log
innobackupex version 2.4.7 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 05f1fcf)
xtrabackup: uses posix_fadvise().

# 连接数据库并做两次版本检查

xtrabackup: cd to /mdata/mysql_test_data
xtrabackup: open files limit requested 0, set to 100001
xtrabackup: using the following InnoDB configuration:
xtrabackup:   innodb_data_home_dir = .
xtrabackup:   innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 50331648
InnoDB: Number of pools: 1
180122 19:47:53 >> log scanned up to (10304795)

# 读取配置文件,寻找对应的文件及日志位置

xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 51 for dump_test/dump_inno, old maximum was 0
xtrabackup: Starting 4 threads for parallel data files transfer
180122 19:47:53 [04] Compressing and streaming ./ibdata1
180122 19:47:53 [03] Compressing and streaming ./dump_test/dump_inno.ibd
180122 19:47:53 [03]        ...done
180122 19:47:53 [03] Compressing and streaming ./test/test.ibd
180122 19:47:53 [02] Compressing and streaming ./test/sbtest1.ibd
180122 19:47:53 [03]        ...done

...

180122 19:47:54 >> log scanned up to (10304795)
180122 19:47:54 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
180122 19:47:54 Executing FLUSH TABLES WITH READ LOCK...
180122 19:47:54 Starting to backup non-InnoDB tables and files
180122 19:47:54 [01] Compressing and streaming ./dump_test/dump_inno.frm to <STDOUT>
180122 19:47:54 [01]        ...done
180122 19:47:54 [01] Compressing and streaming ./dump_test/db.opt to <STDOUT>
180122 19:47:54 [01]        ...done

...

180122 19:47:55 Finished backing up non-InnoDB tables and files

# 拷贝数据

180122 19:47:55 [00] Compressing and streaming xtrabackup_binlog_info
180122 19:47:55 [00]        ...done

# 获取二进制文件日志点

180122 19:47:55 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '10304786'
180122 19:47:55 >> log scanned up to (10304795)
xtrabackup: Stopping log copying thread.
180122 19:47:55 Executing UNLOCK TABLES
180122 19:47:55 All tables unlocked

# 停止拷贝,释放锁

180122 19:47:55 [00] Compressing and streaming ib_buffer_pool to <STDOUT>
180122 19:47:55 [00]        ...done
180122 19:47:55 Backup created in directory '/data/backup'
MySQL binlog position: filename 'bin.000006', position '154'
180122 19:47:55 [00] Compressing and streaming backup-my.cnf
180122 19:47:55 [00]        ...done
180122 19:47:55 [00] Compressing and streaming xtrabackup_info
180122 19:47:55 [00]        ...done
xtrabackup: Transaction log of lsn (10304786) to (10304795) was copied.
180122 19:47:55 completed OK!
180122 19:47:55 [00]        ...done
180122 19:47:55 Backup created in directory '/data/backup'
MySQL binlog position: filename 'bin.000006', position '154'
180122 19:47:55 [00] Compressing and streaming backup-my.cnf
180122 19:47:55 [00]        ...done
180122 19:47:55 [00] Compressing and streaming xtrabackup_info
180122 19:47:55 [00]        ...done
xtrabackup: Transaction log of lsn (10304786) to (10304795) was copied.
180122 19:47:55 completed OK!

# 生成各种文件,备份结束

Ⅲ、xtrabackup原理分析

xtrabackup全备步骤

- 操作 解析
step1 Connecting to MySQL server host 连接登录
step2 using the following InnoDB configuration 读相关配置文件
step3 start xtrabackup_log 启用日志文件,记录redo的lsn,同时持续扫描redo log,将新产生的redo拷贝到xtrabackup_logfile
step4 copy innodb tables .ibd、.ibdata1、undo logs 拷贝innodb表的独立表空间、共享表空间、undo日志
step5 flush no_write_to_binlog tables、flush tables with read lock 强制将commit log刷入redo防止数据丢失(5.6之前没有),锁表
step6 copy non-innodb tables .MYD、.MYI、.opt、misc files和innodb tables .frm、.opt、misc files 拷贝myisam表相关内容和innodb表的表结构文件
step7 Get binary log position 获取二进制日志位置点,写入到xtrabackup_binlog_info文件
step8 flush no_write_to_binlog engine logs 将redo刷盘
step9 stopping log copying thread 停止拷贝
step10 unlock tables 释放锁
step11 completed OK 生成各种文件,备份结束

tips:

①简单点说:一个线程备份redo,贯穿整个过程始终,另外的线程备份表空间文件,直到completed OK,备份成功

②5.6之前的xtrabackup有丢数据的风险,强烈建议使用最新版本

③和mysqldump、mydumper相比,xtrabackup备份的是结束时间点的数据(二进制文件位置点不一样),所以物理备份除了本身恢复块之外,同步也快,因为不用拉数据,做一个一小时的备份,逻辑备份需要做一个小时的数据同步,物理备份不需要

④备份过程中遇到myisam还是会阻塞,数据一致性需求

Ⅳ、xtrabackup备份恢复

4.1 查看备份文件

由于我这里用的是流文件的方式备份的,所以要先打开流文件

[root@VM_0_5_centos backup]# xbstream -x < backup.xbstream
[root@VM_0_5_centos backup]# ll
total 2792
drwxr-x--- 2 root root    4096 Jan 23 15:52 abc
-rw-r----- 1 root root     417 Jan 23 15:52 backup-my.cnf.qp
-rw-r--r-- 1 root root 1822257 Jan 23 15:51 backup.xbstream
drwxr-x--- 2 root root    4096 Jan 23 15:52 dump_test
-rw-r----- 1 root root     370 Jan 23 15:52 ib_buffer_pool.qp
-rw-r----- 1 root root  969374 Jan 23 15:52 ibdata1.qp
drwxr-x--- 2 root root    4096 Jan 23 15:52 mysql
drwxr-x--- 2 root root    4096 Jan 23 15:52 performance_schema
drwxr-x--- 2 root root   12288 Jan 23 15:52 sys
drwxr-x--- 2 root root    4096 Jan 23 15:52 test
-rw-r----- 1 root root     102 Jan 23 15:52 xtrabackup_binlog_info.qp
-rw-r----- 1 root root     115 Jan 23 15:52 xtrabackup_checkpoints
-rw-r----- 1 root root     494 Jan 23 15:52 xtrabackup_info.qp
-rw-r----- 1 root root     391 Jan 23 15:52 xtrabackup_logfile.qp

看到很多qp文件,是因为备份时做了压缩,我们需要将其解压
[root@VM_0_5_centos backup]# for f in `find ./ -iname "*\.qp"`; do qpress -dT4 $f  $(dirname $f) && rm -f $f; done
[root@VM_0_5_centos backup]# ll
total 14152
drwxr-x--- 2 root root     4096 Jan 23 15:55 abc
-rw-r--r-- 1 root root      427 Jan 23 15:55 backup-my.cnf
-rw-r--r-- 1 root root  1822257 Jan 23 15:51 backup.xbstream
drwxr-x--- 2 root root     4096 Jan 23 15:55 dump_test
-rw-r--r-- 1 root root      413 Jan 23 15:55 ib_buffer_pool
-rw-r--r-- 1 root root 12582912 Jan 23 15:55 ibdata1
drwxr-x--- 2 root root     4096 Jan 23 15:55 mysql
drwxr-x--- 2 root root    12288 Jan 23 15:55 performance_schema
drwxr-x--- 2 root root    12288 Jan 23 15:55 sys
drwxr-x--- 2 root root     4096 Jan 23 15:55 test
-rw-r--r-- 1 root root       15 Jan 23 15:55 xtrabackup_binlog_info
-rw-r----- 1 root root      115 Jan 23 15:52 xtrabackup_checkpoints
-rw-r--r-- 1 root root      521 Jan 23 15:55 xtrabackup_info
-rw-r--r-- 1 root root     2560 Jan 23 15:55 xtrabackup_logfile

可以看到,除了备份表空间等,还生成了4个文件

看下4个文件

[root@VM_0_5_centos backup]# cat xtrabackup_binlog_info           # 记录binlog文件名和position
bin.000006  154
------
[root@VM_0_5_centos backup]# cat xtrabackup_checkpoints           # 记录备份过程中checkpoint、lsn信息
backup_type = full-backuped
from_lsn = 0
to_lsn = 10304786
last_lsn = 10304795
compact = 0
recover_binlog_info = 0
------
[root@VM_0_5_centos backup]# cat xtrabackup_info                  # 整个备份过程中的信息
uuid = 48febc78-0012-11e8-b724-525400a4dac1
name = 
tool_name = innobackupex
tool_command = --compress --compress-threads=8 --stream=xbstream -S /tmp/mysql.sock --parallel=4 ./
tool_version = 2.4.7
ibbackup_version = 2.4.7
server_version = 5.7.20-log
start_time = 2018-01-23 15:51:51
end_time = 2018-01-23 15:51:56
lock_time = 0
binlog_pos = filename 'bin.000006', position '154'
innodb_from_lsn = 0
innodb_to_lsn = 10304786
partial = N
incremental = N
format = xbstream
compact = N
compressed = compressed
encrypted = N
------
xtrabackup_logfile                                                # 持续备份的redo,直接看不了

4.2 恢复一手瞅瞅

step1: 应用日志,将backup恢复
[root@VM_0_5_centos mdata]# innobackupex --apply-log backup

step2:将恢复好的数据拷贝到datadir,直接move也行
[root@VM_0_5_centos mdata]# innobackupex --copy-back backup

step3:修改文件属主
[root@VM_0_5_centos mdata]# chown -R mysql:mysql mysql_test_data

step4:启动数据库
/etc/init.d/mysql.server start
Starting MySQL. SUCCESS! 

tips:

  • 日志应用完成后,backup文件中会多出一个文件:xtrabackup_binlog_pos_innodb,记录的是用于innodb的binlog的当前position,而xtrabackup_binlog_info记录的是整个实例当前的binlog position

  • 般情况下,这两个位置点是一样的,但备份时两种引擎都存在时,则有可能出现xtrabackup_binlog_info.pos > xtrabackup_binlog_pos_innodb.pos

  • 所以我们一般用xtrabackup_binlog_info中的binlog position

Ⅴ、其他相关问题

5.1 增量备份

--incremental-history-name=name 可使用改参数做增量备份

但非常不建议用这个增量备份功能,性能特别差

若昨天全备100G,今天更新了30G,做增量要扫描100G文件才知道哪些页改动了,再去备份,线上很难接受

percona有个参数可以监控哪些页改动了,所以不用去扫之前的所有备份的表空间,但用的也比较少

要做增量,用二进制日志的机制来做即可

5.2 指定库表备份

同样不推荐这种玩法,强烈建议完整备份

备份原理是备份所有表空间(ibd),不完整备份的话,可能会遇到各种问题

比如备份了a库,没备份b库,用这个备份恢复后在b库下面创建一个和之前同名的表就创建不了

5.3 远程备份

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

推荐阅读更多精彩内容

  • 1)介绍 PerconaXtraBackup(简称PXB)是Percona公司开发的一个用于MySQL数据库物理热...
    温东阅读 2,470评论 0 6
  • 文/Bruce.Liu1 文章大纲备份概念1.1. 备份目的1.2. 备份方式1.3. 备份类型1.4. 备份对象...
    BruceLiu1阅读 3,904评论 4 15
  • xtrabackup 详解(已纠正) xtrabackup是Percona公司CTO Vadim参与开发的一款基于...
    meng_philip123阅读 2,813评论 0 5
  • 20号比预料中提前完成反弹,EOS竟然作为先锋,异军突起。但这个反弹涨幅如此猛烈,成交量却并不踏实。所以今天应该跌...
    肖铧东阅读 187评论 0 0
  • 我穿着袖臂上印有“警察”字样的功能服走在鲁迅美术学院的校园里,不自觉得不自在起来。即使我早过了婚配的年龄,但见到那...
    社中儿阅读 420评论 0 1