xtrabackup

xtrabackup

简要说明

物理备份

流程: 备份 -> 恢复准备 -> 恢复

innobackupex 原本只是一个 perl 脚本,实际还是调用 xtrabackup 命令

备份过程
连接数据库, 开始拷贝 redo log, 拷贝 innodb 表文件, 锁表, 拷贝非 innodb 表文件, 停止拷贝 redo log, 解锁

全量备份

说明: 如果备份时主库不进行数据写入, 则备份文件直接 mv 到datadir 即可跳过准备和 copy-back 两阶段进行恢复; 如果在备份时主库有数据写入,则恢复时一定要进行 准备步骤

# 完全备份
innobackupex --defaults-file=/opt/app/mysql/my.cnf \
--user=root --password=xxxxx1 /new_data/mysql_backup \
-S /data/mysql_data/mysql.sock --parallel=10

# 全量备份-加多线程执行
innobackupex --user=root --password=passw0rd /home/user1/mysql_back1 \
-S /home/user1/data/mysql_data/mysqld.sock \
    # 并行 10 线程,限制 IO为每秒 400次
    --parallel=10 --throttle=400

记录偏移量输出,方便后续添加从库

180302 14:09:11 innobackupex: Starting the backup operation

180302 14:12:44 Backup created in directory '/home/user1/backup/2018-03-02_14-09-11/'
MySQL binlog position: filename 'mysql-binlog.000058', position '158473483', GTID of the last change '9d1b2f2d-e3d7-11e7-a416-0025b511001f:1-38583130'
    # 服务器最新的 binlog 文件和 post 号
    # 用于从库新增主库时使用
xtrabackup: Transaction log of lsn (121009498133) to (121014178723) was copied.
180302 14:12:44 completed OK!

# 后续的命令
CHANGE MASTER TO
    MASTER_HOST='10.1.1.78',
    MASTER_PORT=3306,
    MASTER_USER='sync',
    MASTER_PASSWORD='xxxxx',
    MASTER_LOG_FILE='mysql-binlog.000058',
    MASTER_LOG_POS=158473483;

全量备份的恢复

  1. 恢复准备-prepare
innobackupex --defaults-file=/opt/app/mysql/my.cnf \
--use-memory=64G --apply-log /data/mysql_backup/2018-04-10_01-56-48


# --use-memory=64G 这个参数只在准备阶段可用
  1. 恢复-拷贝数据
# 注意删除原数据目录
innobackupex --defaults-file=/opt/app/mysql/my.cnf \
--copy-back /data/mysql_backup/2018-04-10_01-56-48

--rsync

增量备份

原理: 每个 InnoDB 的页面都会包含一个 LSN 信息, 每当相关的数据发生改变, 相关的页面的 LSN 就会自动增长; 这正是 InnoDB 表可以进行增量备份的基础, 即 innobackupex 通过备份"上次完全备份之后发生改变的页"来实现;

实例

--incremental           # 本次增量备份的路径, 会自动按日期创建子目录
--incremental-basedi    # 指向上次增量备份的路径, 首次增量备份则是指向第一次的全量备份的路径

# 首次增量备份
innobackupex --defaults-file=/etc/my.cnf \
    --user=user1 --password=123456 --socket=/tmp/mysql.sock \
    --incremental /data/user1/inc \
    --incremental-basedir=/data/user1/2017-04-24_02-46-11/ \
    --parallel=2        # 并行 2 线程

# 后续增量备份
innobackupex --defaults-file=/etc/my.cnf \
    --user=user1 --password=123456 --socket=/tmp/mysql.sock \
    --incremental /data/user1/inc \
    --incremental-basedir=/data/user1/inc/2017-04-28_01-09-40/ \
    --parallel=2

恢复

  1. 准备数据(预处理)
  2. 拷贝数据

prepare-准备

  1. 需要在每个备份(包括完全和各个增量备份)上, 将已经提交的事务进行"重放"; “重放"之后, 所有的备份数据将合并到完全备份上;
  2. 基于所有的备份将未提交的事务进行"回滚”;

注意: 合并的增量备份要去掉

# 准备开始的全量备份
innobackupex --apply-log --redo-only full_bk_dir

# 合并第一个增量备份
innobackupex --apply-log --redo-only full_bk_dir --incremental-dir=INCREMENTAL-DIR-1

# 合并第二个增量备份
innobackupex --apply-log --redo-only full_bk_dir --incremental-dir=INCREMENTAL-DIR-2

# 合并最后一份增量备份 - 最后一次不加 --redo-only
innobackupex --apply-log full_bk_dir --incremental-dir=INCREMENTAL-DIR-3

# 合并最终备份
innobackupex --apply-log full_bk_dir

prepare-恢复 与全量恢复时无差异

# 恢复完整备份
innobackupex --defaults-file=/etc/mysql/my.cnf \
    --copy-back /mysql_backup/2015-02-08_11-56-48/

# 修改恢复数据文件权限
chown -R mysql.mysql /var/lib/mysql

/etc/init.d/mysqld start

最小备份权限的用户


-- 备份数据需要的最小权限
CREATE USER 'bkuser1'@'localhost' IDENTIFIED BY 's3cret';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bkuser1';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkuser1'@'localhost';
FLUSH PRIVILEGES;

-- 备份用户所需要的权限
CREATE USER 'bkuser1'@'localhost' IDENTIFIED BY 'bkppass';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT,PROCESS,SUPER ON *.* TO 'bkuser1'@'localhost';
FLUSH PRIVILEGES;
最后更新于