7、物理备份 Xtrabackup 7.1、安装 yum install -y perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5 libev cd /opt wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm 7.2 innobackup的使用 7.2.1、备份的过程 (1)、针对非innodb表,进行短暂的锁表备份,copy 所有的非innodb 表文件到备份路径 (2)、针对Innodb表,立即触发CKPT(将内存里面的已提交的脏页,刷写到磁盘上),并会立即记录一个LSN号,然后copy所有innodb表的相关文件(ibd,frm,ibdata), (3)、并且将备份过程中产生的redo(主要是数据变化的部分)进行截取和保存,并记录此时最新的LSN号。 恢复过程: 在恢复时,xbk会调用 Innodb引擎的CSR过程,将数据和redo的LSN的追平,然后会进行一致性恢复,恢复方法就是直接copy 回去即可。 7.3、XBK 全备和恢复体验 innobackupex --user=root --passwordd=123 --no-timestamp /backup/full ## 备份的目录vim /etc/my.cnf socket=/var/lib/mysql/mysql.sock mkdir -p /var/lib/mysql chown -R mysql.mysql /var/lib/mysql systemctl restart mysqld innobackupex --user=root --passwordd=123 --no-timestamp /xtabak/full
![]()
直接 ulimit -n 65535 innobackupex --user=root --passwordd=123 --no-timestamp /xtabak/full
全备恢复: innobackupex --apply-log /backup/full 7.4、备份产生的文件 xtrabackup_binlog_info ##记录备份时刻的二进制信息,可以作为binlog截取的起点
xtrabackup_checkpoints
from_lsn=0 ## 备份中包含的LSN号的起点,从0开始,表示 全备, ,增量:上次备份的结束位置. to_lsn= ##chkpoint 时间点的LSN号 last_lsn= ##备份完成后的LSN号, last_lsn-9,下次增量备份的起始位置。 xbk备份出来的,to_lsn 和 last_lsn 相差 9个lsn号,这是在mysql5.7中是预留的,用来维护redo的。 xtrabackup_info
xtrabackup_logfile ## redo日志,不能直接打开。是一个二进制文件 ++++++++++++++++++++++++++ 7.5、增量备份 增量备份必须要依赖于全备 7.5.1、清空备份路径 rm -rf /xtrabak/* 7.5.2、模拟数据 create database full charset utf8mb4; use full; create table t1(id int); insert into t1 values(1),(2),(3); commit; 7.5.3、进行周日的全备 innobackupex --user=root --password="w...1905" --notimestamp /xtrabak/full
![]()
7.5.4、模拟周一的数据变化 create database inc1 charset utf8mb4; use inc1; create table t1(id int); insert into t1 values(1),(2),(3); commit; 7.5.5、进行周一的增量备份 innobackupex --user=root --password="w...1905" --no-timestamp --incremental --incremental-basedir=/xtrabak/full /xtrabak/inc1 --incremental 开关,表示增量备份 --incremental-basedir=/xtrabak/full ## 基于那个目录做增量备份 /xtrabak/inc1 ##增量备份在那里
![]()
7.5.6、模拟周二的数据 create database inc2 charset utf8mb4; use inc2; create table t1(id int); insert into t1 values(1),(2),(3); commit; 7.5.7、进行周二的增量备份 innobackupex --user=root --password="w...1905" --no-timestamp --incremental --incremental-basedir=/xtrabak/inc1 /xtrabak/inc2
7.5.8、模拟周三的数据 create database inc3 charset utf8mb4; use inc3; create table t1(id int); insert into t1 values(1),(2),(3); commit; 7.5.9、模拟周三上午10点数据库崩溃 pkill mysqld rm -rf /data/mysql/data/* ++++++++++++++++++ 7.10、恢复思路 (1)、停业务,挂维护页 (2)、查看计划任务和脚本,确定可用备份。 (3)、binlog:inc2(最后一次备份)到故障时间点的binlog (4)、恢复全备 + 增量 + binlog (5)、验证数据 (6)、起业务,撤维护页。 7.11、恢复前的准备 (1)、整理全备(full) innobackupex --apply-log --redo-only /xtrabak/full
--redo-only:在做增量恢复前,base full(基础全备目录)要做--redo-onlyfull,需要合并的增量,也要做--redo-only,除了最后一次增量合并到全备时,不需要加--redo-only,--redo_only只做redo的前滚,不做回滚(undo)。 (2)、合并inc1(第一次增量)到full(全备) innobackupex --apply-log --redo-only --incremental-dir=/xtrabak/inc1 /xtrabak/full
![]()
(3)、合并inc2(第二次增量)到 full(全备) innobackupex --apply-log --incremental-dir=/xtrabak/inc2 /xtrabak/full
![]()
(4)、最后一次整理full innobackupex --apply-log /xtrabak/full
7.5.12、截取二进制日志 起点: cat /xtrabak/inc2/xtrabackup_binlog_info
终点: [root@docker01 ~]# mysqlbinlog /data/binlog/mysql-bin.000009|grep 'SET'
mysqlbinlog --skip-gtids --include-gtids='b3060a95-5e86-11ea-bdb9-000c29e6dd30:52-54' /data/binlog/mysql-bin.000009 >/xtrabak/binlog.sql 7.5.13、恢复备份数据 cp -a /xtrabak/full/* /data/mysql/data/ chown -R mysql.mysql /data/mysql/data systemctl start mysqld mysql -uroot -p set sql_log_bin=0; source /xtrabak/binlog.sql;
set sql_log_bin=1; ++++++++++++++++++==
++++++++++++++++++++++++++= 8、模拟生产环境的数据迁移(5.6.44 --------> 5.7.26) 环境:mysql 5.6.44 192.168.189.99 mysql 5.7.26 192.168.189.128 都是 centos 7.4 8.1、搭建5.6的测试环境(192.168.189.99) (1)、创建必须的目录 mkdir -p /data/mysql/data mkdir -p /application mkdir -p /data/binlog wget https://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.44-linux-glibc2.12-x86_64.tar.gz 上传软件至/application cd /application tar xf mysql-5.6.44-linux-glibc2.12-x86_64.tar.gz mv mysql-5.6.44-linux-glibc2.12-x86_64 mysql (2)、创建用户和修改权限 useradd -r -s /bin/false mysql chown -R mysql.mysql /data /application/ (3)、修改环境变量 vim /etc/profile 在最后面添加: export PATH=/application/mysql/bin:$PATH 保存退出 source /etc/profile (4)、数据初始化 安装依赖包: yum -y install cmake bison git ncurses-devel autoconf libaio gcc gcc-c++ yum remove mariadb* cd /application/mysql/scripts/ /application/mysql/scripts/mysql_install_db --user=root --basedir=/application/mysql --datadir=/data/mysql/data (5)、准备配置文件和启动脚本 vim /etc/my.cnf [mysqld] basedir=/application/mysql datadir=/data/mysql/data server_id=99 user=mysql socket=/tmp/mysql.sock log_bin=/data/binlog/mysql-bin binlog_format=row [mysql] socket=/tmp/mysql.sock cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld (6)、启动数据库 注意:/data/mysql/data/ 下面的权限,chown -R mysql.mysql /data /etc/init.d/mysqld start 默认没有密码,mysqladmin -uroot -p password 123 ##设置密码 8.2、准备模拟的生产数据 cd /opt wget http://www.xchinagroup.top/softdown/centos7/03_mysql/t100w.sql mysql -uroot -p create database dfems charset utf8mb4; use dfems; source /opt/t100w.sql; 8.3、迁移mysql 5.6.44 数据到 mysql 5.7.26 (1)、在mysql 5.6.44 上面,先备份数据(假如时间在10:00),并传到192.168.189.128上面 mysqldump -uroot -p123 -A -R -E --triggers --master-data=2 --single-transaction >/tmp/dfems.sql scp -r /tmp/dfems.sql root@192.168.189.128:/tmp/ (2)、在新的服务器(192.168.189.128)上,准备一个新的mysql systemctl start mysqld3308 mysql -S /data/3308/mysql.sock set sql_log_bin=0; source /tmp/dfems.sql; flush prvileges; set sql_log_bin=1; quit mysql_upgrade -uroot -p123 -S /data/3308/mysql.sock ###把mysql5.6.44的系统库更新到mysql 5.7.26 小版本差异,可以不用mysql_upgrade 大版本差异,就需要做mysql_upgrade
(3)、binlog的持续追加 在迁移到mysql 5.7.26 上时,假如,时间用了30分钟,这时,原库(5.6.44)上面的数据,相当于从全备时间点,又写了30分钟的数据,此时,在mysql5.6.44 上面,flush logs ,这时把,10:00(全备时间点)到10:30这段时间的二进制日志,导出来,在mysql 5.7.26 上面恢复,假如此时用了5分钟。 (4)、停业务,恢复剩余的binlog 截取刚才,10:30到10:35的二进制日志,进行恢复。 (5)、业务割接 +++++++++++++++++++++

