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;全量备份的恢复
- 恢复准备-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 这个参数只在准备阶段可用- 恢复-拷贝数据
# 注意删除原数据目录
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恢复
- 准备数据(预处理)
- 拷贝数据
prepare-准备
- 需要在每个备份(包括完全和各个增量备份)上, 将已经提交的事务进行"重放"; “重放"之后, 所有的备份数据将合并到完全备份上;
- 基于所有的备份将未提交的事务进行"回滚”;
注意: 合并的增量备份要去掉
# 准备开始的全量备份
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_dirprepare-恢复 与全量恢复时无差异
# 恢复完整备份
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;最后更新于