时间:2021-07-01 10:21:17 帮助过:29人阅读
5.InnoDB备份相关名词 redo日志:redo日志,也叫事务日志,作用是记录InnoDB引擎中每一个数据发生的变化信息。主要用于保证InnoDB数据的完整性,以及丢失数据后的恢复。同时还可以有效的提升数据库的IO等性能。 redolog对应的配置参数是: innodb_log_file_size和innodb_log_files_in_group mysql> show global variables like "innodb_log%"; +-----------------------------+----------+ | Variable_name | Value | +-----------------------------+----------+ | innodb_log_buffer_size | 16777216 | | innodb_log_checksums | ON | | innodb_log_compressed_pages | ON | | innodb_log_file_size | 50331648 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_log_write_ahead_size | 8192 | +-----------------------------+----------+ 7 rows in set (0.00 sec) undo日志:undo log记录事务的逆向逻辑操作或者逆向物理操作对应的数据变化的内容,undo日志默认存放在共享表空间ibdata*文件中,与redo日志功能不同的是undo日志主要用于回滚数据库崩溃前未完整提交的事务数据,确保数据恢复前后是一致的。 LSN:Log Sequence Number是指日志序列号,是一个64位的整型数字。LSN的作用是当记录redo日志时,使用LSN唯一标识一条变化的数据。 checkpoint:用来标识数据库崩溃后,应恢复的redo日志的起始点。 6.Xtrabackup恢复的工作原理 (1).Percona Xtrabackup软件是基于InnoDB等事务引擎自带的redo和undo功能来保持备份和恢复前后数据一致性的,从而确保数据库的数据安全可靠。 (2).redo会存储每一个innodb表中的数据修改记录。 (3).当innodb数据库启动时,会检查数据文件和redo日志文件,将已经提交到redo中的数据应用(提交)到数据文件并保存。 (4).然后根据undo信息将修改过但没有提交的数据记录进行回滚(不提交到数据文件中)。 7.Xtrabackup执行全备的原理过程 (1).当执行innobackupex开始备份时,XBK首先会记录当前redo日志的位置(就是对应的LSN号),同时还会在后台启动一个进程持续监视redo日志文件的变化,并将变化的信息都记录到xtrabackup_logfile中。 (2).开始复制InnoDB对应的物理数据文件(*.ibd和*.ibdataN),备份完毕之后。 (3).执行flush tables with read lock;命令对整个数据库进行锁表。 (4).开始复制MyISAM对应的物理数据文件(.FRM,.MYD,.MYI),备份完毕之后。 (5).获取binlog二进制日志位置点信息。 (6).停止记录xtrabackup_logfile,并执行unlock tables;解锁,恢复整个数据库的可读可写状态。 (7).备份完成。 8.Xtrabackup执行全备恢复的过程 (1).用XBK恢复数据时,要经过准备恢复prepare和实际恢复restore两个步骤。 (2).在准备恢复过程结束后,InnoDB表的数据(即备份的物理文件)就恢复到了复制InnoDB文件结束时的时间点。 (3).这个时间点也是全库锁表复制MyISAM引擎数据时的起点,所以最终恢复的数据和数据库的数据是一致的。 (4).全备的数据有两部分,一部分是全备的物理文件,一部分是Xtrabackup-log日志文件。 9.Xtrabackup执行增量备份的过程 (1).Innobackupex增量备份的就是对复制全备之后的InnoDB中变更的“页”数据。 (2).增量复制时会以全备中xtrabackup_checkpoints logfile文件对应的LSN号为依据。 (3).将大于给定的LSN号的页数据(就是增量数据)进行备份复制InnoDB的redo日志到xtrabackup_logfile。 (4).以后的每一次增量备份都要基于上一次的增量备份,最终实现备份的数据都是连续的、无缺失的。 针对MyISAM引擎的备份依然是锁表备份。 增量备份仅复制InnoDB中变化的页数据,而非所有的物理文件。 总结:增量备份过程: (1).记录LSN并监控redo日志的变化,且将变化实时记录到xtrabackup_logfile。 (2).开始复制*.ibd和*.ibdataN中变化的页数据。 (3).执行flush tables with read lock;命令。 (4).开始复制MyISAM对应的物理数据文件.FRM .MYD .MYI。 (5).获取二进制日志binlog位置信息。 (6).停止记录xtrabackup_logfile并执行unlock tables;解锁。 (7).增量备份完成。 10.Xtrabackup执行增量恢复的过程 (1).增量恢复是以全备数据为基础的,增量恢复的数据主要涉及全备数据、增量数据、Xtrabackup_log日志文件。 (2).先将增量备份中变化的页数据应用到全备数据中。 (3).读取Xtrabackup_log应用redo数据到全备数据中,同时回滚未提交的事务。 11.Xtrabackup工具安装 [root@db01 ~]# yum -y install perl perl-devel perl-Time-HiRes perl-DBD-MySQL libaio libaio-devel [root@db01 ~]# rm -rf /etc/my* https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.15/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm [root@db01 ~]# cd /disk/ [root@db01 /disk]# wget https://mirrors.cloud.tencent.com/percona/centos/7Server/RPMS/x86_64/percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm [root@db01 /disk]# yum -y install percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm [root@db01 ~]# ls -l `which xtrabackup innobackupex` lrwxrwxrwx 1 root root 10 Sep 2 00:12 /usr/bin/innobackupex -> xtrabackup -rwxr-xr-x 1 root root 21730616 Jul 5 15:59 /usr/bin/xtrabackup 创建用于Xtrabackup备份数据的用户 [root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p mysql> create user ‘backup‘@‘localhost‘ identified by ‘123‘; Query OK, 0 rows affected (0.01 sec) mysql> grant reload,lock tables,process,replication client on *.* to ‘backup‘@‘localhost‘; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) Xtrabackup软件主要包含两个命令工具 Xtrabackup:InnoDB、XtraDB Innobackupex 推荐:InnoDB、XtraDB、MyISAM。事务引擎数据不用锁表,非事务引擎数据需要锁表。 12.全备与恢复全备实验 数据准备 [root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p mysql> use app; Database changed mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 29 | +----------+ 1 row in set (0.00 sec) 开始全备 [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp /backup/mysql/3306/full [root@db01 ~]# ls -lh /backup/mysql/3306/full/ total 13M drwxr-x--- 2 root root 48 Sep 2 02:18 app 备份生产库 drwxr-x--- 2 root root 20 Sep 2 02:18 app01 备份生产库 -rw-r----- 1 root root 492 Sep 2 02:18 backup-my.cnf 配置文件备份 -rw-r----- 1 root root 739 Sep 2 02:18 ib_buffer_pool -rw-r----- 1 root root 12M Sep 2 02:18 ibdata1 共享表空间备份 drwxr-x--- 2 root root 4.0K Sep 2 02:18 mysql 备份mysql数据库 drwxr-x--- 2 root root 8.0K Sep 2 02:18 performance_schema drwxr-x--- 2 root root 8.0K Sep 2 02:18 sys -rw-r----- 1 root root 64 Sep 2 02:18 xtrabackup_binlog_info binlog位置信息 -rw-r----- 1 root root 135 Sep 2 02:18 xtrabackup_checkpoints checkpoints信息 -rw-r----- 1 root root 643 Sep 2 02:18 xtrabackup_info xtrabackup信息 -rw-r----- 1 root root 2.5K Sep 2 02:18 xtrabackup_logfile xtrabackup日志文件 [root@db01 /backup/mysql/3306/full]# cat xtrabackup_binlog_info mysql-bin.000006 838 a3ad97d4-b449-11e9-97c5-000c290c6b6c:1-151 [root@db01 /backup/mysql/3306/full]# cat xtrabackup_checkpoints backup_type = full-backuped #备份类型 from_lsn = 0 #checkpoints起始点 to_lsn = 4024638 #checkpoints结束点 last_lsn = 4024647 compact = 0 recover_binlog_info = 0 flushed_lsn = 4024647 回滚未提交的事物日志数据 [root@db01 ~]# innobackupex --apply-log --use-memory=50M /backup/mysql/3306/full/ 利用全备开始恢复数据 [root@db01 ~]# mysqladmin -S /data/mysql/3306/mysql.sock -p shutdown [root@db01 ~]# netstat -tunlpa | grep mysql [root@db01 ~]# ps -ef | grep mysql root 7360 6721 0 02:30 pts/0 00:00:00 grep --color=auto mysql 模拟数据删除 [root@db01 ~]# mv /data/mysql/3306/data /data/mysql/3306/data_rm [root@db01 ~]# mkdir -p /data/mysql/3306/data [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --copy-back --rsync /backup/mysql/3306/full/ 或者# mv /backup/mysql/3306/full/* /data/mysql/3306/data/ [root@db01 ~]# chown -R mysql:mysql /data/mysql/3306/data [root@db01 ~]# mysqld --defaults-file=/data/mysql/3306/my.cnf & [root@db01 ~]# ps -ef | grep mysql mysql 6289 6721 1 02:38 pts/0 00:00:00 mysqld --defaults-file=/data/mysql/3306/my.cnf root 6518 6721 0 02:38 pts/0 00:00:00 grep --color=auto mysql [root@db01 ~]# netstat -tunlpa | grep mysql tcp6 0 0 :::3306 :::* LISTEN 7489/mysqld [root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p -e "select count(*) from app.t1;" Enter password: +----------+ | count(*) | +----------+ | 29 | +----------+ 恢复成功 13.增量备份与增量恢复 第一次增量备份是基于全备进行的。 之后的增量备份是基于上一次的增量。 先进行全备: [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp /backup/base_full 增加模拟数据,然后做增量备份 [root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p mysql> use app; mysql> insert into t1 values(30,‘zhouwanchun‘); Query OK, 1 row affected (0.01 sec) mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 30 | +----------+ 1 row in set (0.00 sec) 开始做第一次增量备份 [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --incremental-basedir=/backup/base_full --incremental /backup/one_inc 再次模拟增加数据,然后做第二次增量备份。 mysql> use app; mysql> insert into t1 values(31,‘zhouwanchun‘); Query OK, 1 row affected (0.01 sec) mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 31 | +----------+ 1 row in set (0.00 sec) [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --parallel=3 --incremental-basedir=/backup/one_inc --incremental /backup/two_inc 开始做增量数据恢复 先恢复全备--再恢复第一次增量--然后再恢复第二次增量--以此类推 应用redo日志恢复全备数据 非最后一次合并增量数据一定要加--redo-only参数,就是应用redo日志恢复数据,而不执行undo回滚未提交的数据。等到最后一次增量合并完成后再进行undo回滚数据。 [root@db01 ~]# innobackupex --apply-log --use-memory=32M --redo-only /backup/base_full/ 合并第一次的增量数据到全备数据目录 [root@db01 ~]# innobackupex --apply-log --use-memory=32M --redo-only --incremental-dir=/backup/one_inc /backup/base_full/ 合并第二次的增量数据到全备数据目录 [root@db01 ~]# innobackupex --apply-log --use-memory=32M --incremental-dir=/backup/two_inc /backup/base_full/ 对最后的全量数据做redo日志应用,执行undo回滚数据 [root@db01 ~]# innobackupex --apply-log --use-memory=32M /backup/base_full/ [root@db01 ~]# mkdir -p /data/mysql/3306/data 开始恢复数据 [root@db01 ~]# mysqladmin -S /data/mysql/3306/mysql.sock -p shutdown [root@db01 ~]# netstat -lnp | grep mysql [root@db01 ~]# mv /data/mysql/3306/data /data/mysql/3306/data_rm2 [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --copy-back --rsync /backup/base_full/ [root@db01 ~]# chown -R mysql.mysql /data/mysql/3306/data [root@db01 ~]# mysqld --defaults-file=/data/mysql/3306/my.cnf & [root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p -e "select count(*) from app.t1;" Enter password: +----------+ | count(*) | +----------+ | 31 | +----------+ 中小型企业MySQL Xtrabackup物理增量恢复实战 完整物理恢复数据库数据,必要条件: 1.有XBK全备。 2.有全备之后所有的XBK增量。 3.有最后一次XBK增量以后的所有binlog日志文件。 [root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p mysql> use app01; mysql> create table t1(id int not null primary key auto_increment,name varchar(64) not null); mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> select * from t1; +----+-------------+ | id | name | +----+-------------+ | 1 | zhouwanchun | | 2 | zhouwanchun | | 3 | zhouwanchun | +----+-------------+ 3 rows in set (0.00 sec) 先模拟3月21日0点开始对数据库进行全备 [root@db01 ~]# date -s "2018-03-21" [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp /backup/new_base_full 然后模拟3月21日0点全备之后(0:00-24:00)用户继续写入数据 mysql> use app01; mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> select * from t1; +----+-------------+ | id | name | +----+-------------+ | 1 | zhouwanchun | | 2 | zhouwanchun | | 3 | zhouwanchun | | 4 | zhouwanchun | | 5 | zhouwanchun | | 6 | zhouwanchun | +----+-------------+ 6 rows in set (0.00 sec) 然后在3月22日0点做增量备份 [root@db01 ~]# date -s "2018-03-22" [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --incremental-basedir=/backup/new_base_full --incremental /backup/new_one_inc 模拟在3月22日0点增量备份之后(0:00-24:00)用户继续写入数据 mysql> use app01; mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> insert into t1(name) values(‘zhouwanchun‘); mysql> select * from t1; +----+-------------+ | id | name | +----+-------------+ | 1 | zhouwanchun | | 2 | zhouwanchun | | 3 | zhouwanchun | | 4 | zhouwanchun | | 5 | zhouwanchun | | 6 | zhouwanchun | | 7 | zhouwanchun | | 8 | zhouwanchun | | 9 | zhouwanchun | +----+-------------+ 9 rows in set (0.00 sec) 模拟3月22日上午10:00管理员误删app01数据库 [root@db01 ~]# date -s "2018-03-22 10:00" mysql> drop database app01; 这时候app01对应的业务瘫痪,经过排查发现app01数据库不复存在了。 移走binlog增量文件,防止二次破坏。 [root@db01 ~]# mkdir -p /backup/binlog [root@db01 ~]# cp -a /data/mysql/3306/logs/ /backup/binlog/ 开始合并之前全备和增量 [root@db01 ~]# innobackupex --apply-log --use-memory=32M --redo-only /backup/new_base_full/ [root@db01 ~]# innobackupex --apply-log --use-memory=32M --incremental-dir=/backup/new_one_inc /backup/new_base_full/ 然后应用redo,回滚undo [root@db01 ~]# innobackupex --apply-log --use-memory=32M /backup/new_base_full/ 开始恢复binlog日志数据 因为3月22日0点-10点之间的所有数据,并不在全备里,也不在增量里。而是在binlog文件里。 [root@db01 ~]# cat /backup/new_one_inc/xtrabackup_binlog_info mysql-bin.000009 2462 a3ad97d4-b449-11e9-97c5-000c290c6b6c:1-151, af771b85-cce7-11e9-9e4c-000c290c6b6c:1-6, e2333e39-d63d-11e9-a0de-000c290c6b6c:1-9 [root@db01 ~]# ls -l /backup/binlog/logs/ total 800 -rw-r----- 1 mysql mysql 1797 Aug 29 2019 mysql-bin.000001 -rw-r----- 1 mysql mysql 241 Aug 29 2019 mysql-bin.000002 -rw-r----- 1 mysql mysql 217 Aug 29 2019 mysql-bin.000003 -rw-r----- 1 mysql mysql 780070 Aug 29 2019 mysql-bin.000004 -rw-r----- 1 mysql mysql 217 Aug 29 2019 mysql-bin.000005 -rw-r----- 1 mysql mysql 861 Sep 2 2019 mysql-bin.000006 -rw-r----- 1 mysql mysql 217 Sep 2 2019 mysql-bin.000007 -rw-r----- 1 mysql mysql 1813 Sep 13 2019 mysql-bin.000008 -rw-r----- 1 mysql mysql 3432 Mar 22 10:00 mysql-bin.000009 -rw-r----- 1 mysql mysql 351 Sep 13 2019 mysql-bin.index mysql> show master status\G *************************** 1. row *************************** File: mysql-bin.000009 Position: 3432 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: a3ad97d4-b449-11e9-97c5-000c290c6b6c:1-151, af771b85-cce7-11e9-9e4c-000c290c6b6c:1-6, e2333e39-d63d-11e9-a0de-000c290c6b6c:1-13 1 row in set (0.00 sec) mysql> show binlog events in ‘mysql-bin.000009‘; [root@db01 ~]# mysqlbinlog -d app01 --skip-gtids --include-gtids=‘e2333e39-d63d-11e9-a0de-000c290c6b6c:9-13‘ --exclude-gtids=‘e2333e39-d63d-11e9-a0de-000c290c6b6c:13‘ /backup/binlog/logs/mysql-bin.000009 > 1.sql 根据业务要么停库处理,要么对外禁止访问数据库。 [root@db01 ~]# iptables -I INPUT -p tcp --dport 3306 ! -s 10.0.0.11 -j DROP 进行全备和增量恢复 [root@db01 ~]# mysqladmin -S /data/mysql/3306/mysql.sock -p shutdown [root@db01 ~]# netstat -lnp | grep mysql [root@db01 ~]# mv /data/mysql/3306/data /data/mysql/3306/data_rm3 [root@db01 ~]# mkdir -p /data/mysql/3306/data [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --copy-back --rsync /backup/new_base_full/ [root@db01 ~]# chown -R mysql.mysql /data/mysql/3306/data [root@db01 ~]# mysqld --defaults-file=/data/mysql/3306/my.cnf & [root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p -e "select * from app01.t1;" Enter password: +----+-------------+ | id | name | +----+-------------+ | 1 | zhouwanchun | | 2 | zhouwanchun | | 3 | zhouwanchun | | 4 | zhouwanchun | | 5 | zhouwanchun | | 6 | zhouwanchun | +----+-------------+ 最后恢复3月22日0点到10点的增量数据 [root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p mysql> set sql_log_bin=0; mysql> source /root/1.sql; mysql> set sql_log_bin=1; mysql> select * from app01.t1; +----+-------------+ | id | name | +----+-------------+ | 1 | zhouwanchun | | 2 | zhouwanchun | | 3 | zhouwanchun | | 4 | zhouwanchun | | 5 | zhouwanchun | | 6 | zhouwanchun | | 7 | zhouwanchun | | 8 | zhouwanchun | | 9 | zhouwanchun | +----+-------------+ 9 rows in set (0.00 sec) 使用XBK物理分库分表备份 必须开启独立表空间模式 mysql> show global variables like "innodb_file_per_table"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.01 sec) 备份单个库app01 [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --databases="app01" /backup/app01_full 备份多个库 [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --databases="app app01" /backup/app_app01_full 备份单个表 [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --databases="app01.t1" /backup/app01_t1 备份多个表 [root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --databases="app01.t1 app.t1" /backup/app01_t1_app_t1 也可以使用--tables-file、--include参数等 使用XBK物理分库分表的恢复 [root@db01 ~]# innobackupex --apply-log --export /backup/app01_t1/ 初始化一个数据库3307 [root@db01 ~]# mysqld --defaults-file=/data/mysql/3307/my.cnf --initialize-insecure [root@db01 ~]# cat /data/mysql/3307/error.log 确保没有报错信息 [root@db01 ~]# cp -a /backup/app01_t1/* /data/mysql/3307/data/ cp: overwrite ‘/data/mysql/3307/data/ib_buffer_pool’? y cp: overwrite ‘/data/mysql/3307/data/ibdata1’? y cp: overwrite ‘/data/mysql/3307/data/ib_logfile0’? y cp: overwrite ‘/data/mysql/3307/data/ib_logfile1’? y [root@db01 ~]# chown -R mysql.mysql /data/mysql/3307/data [root@db01 ~]# mysqld --defaults-file=/data/mysql/3307/my.cnf & [root@db01 ~]# ps -ef | grep mysql [root@db01 ~]# netstat -lnp | grep mysql [root@db01 ~]# mysql -S /data/mysql/3307/mysql.sock mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | app01 | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use app01; Database changed mysql> show tables; +-----------------+ | Tables_in_app01 | +-----------------+ | t1 | +-----------------+ 1 row in set (0.00 sec) mysql> select * from t1; +----+-------------+ | id | name | +----+-------------+ | 1 | zhouwanchun | | 2 | zhouwanchun | | 3 | zhouwanchun | | 4 | zhouwanchun | | 5 | zhouwanchun | | 6 | zhouwanchun | | 7 | zhouwanchun | | 8 | zhouwanchun | | 9 | zhouwanchun | +----+-------------+ 9 rows in set (0.00 sec) 如果有需要,可以通过mysqldump导出后恢复到生产库。
专职DBA-Xtrabackup物理备份恢复
标签:type mys 一个 大于 dba 备份mysql 处理 logfile show