mysql 数据库DBA课程07_02 备份_物理备份_xtrabackup

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)、业务割接
+++++++++++++++++++++